程序中的以下代码允许将90
分配给变量'ch'。 'Z'然后被打印到控制台。Java char变量
char ch;
ch = 90;
System.out.println(ch);
但是,位于程序中的以下代码不能编译。如果以下代码要求ch
变量的输入为字符类型(即),那么为什么在90
被指定为ch
以上时同样不适用?为什么不一定是ch = (char) 90
?
char ch;
ch = System.in.read();
程序中的以下代码允许将90
分配给变量'ch'。 'Z'然后被打印到控制台。Java char变量
char ch;
ch = 90;
System.out.println(ch);
但是,位于程序中的以下代码不能编译。如果以下代码要求ch
变量的输入为字符类型(即),那么为什么在90
被指定为ch
以上时同样不适用?为什么不一定是ch = (char) 90
?
char ch;
ch = System.in.read();
编译器知道90
是char
的有效值。但是,System.in.read()
可能会返回任何int
,这可能超出char
s的有效范围。
如果更改90到90000,该代码将无法编译:
char ch;
ch = 90000;
每当你用系统处理IO,你需要确保你能处理所有有效字节的输入值。但是,您需要一种机制来指示流已耗尽。对于InputStream.read()
的Javadoc(System.in
是一个全球性的InputStream
)说,(强调),
读取数据从输入流的下一个字节。值字节在0到255的范围内返回int。如果因为已到达流末尾而没有可用字节,则返回值-1。
如果你投-1
到char
,你会得到65535因为char
是无符号。由于byte
,更糟的是-1
是一个有效的值。无论如何,你没有阅读char
值;您正在读(s),编码为int
,范围为0-255加-1,表示流结束。如果你想char
(S)我建议你看看这是在Javadoc作为
一个
InputStreamReader
描述的InputStreamReader
是字节流的桥梁,以字符流
这是覆盖在[第5章:https://docs.oracle.com/javase/specs/jls/se8/html/jls-5.html#jls-5.2-200-A)[Java Language Specificiation](https:/ /docs.oracle.com/javase/specs/)。 – McDowell