2014-11-17 53 views
0

程序中的以下代码允许将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(); 
+2

这是覆盖在[第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

回答

2

编译器知道90char的有效值。但是,System.in.read()可能会返回任何int,这可能超出char s的有效范围。

如果更改90到90000,该代码将无法编译:

char ch; 
ch = 90000; 
0

每当你用系统处理IO,你需要确保你能处理所有有效字节的输入值。但是,您需要一种机制来指示流已耗尽。对于InputStream.read()的Javadoc(System.in是一个全球性的InputStream)说,(强调),

读取数据从输入流的下一个字节。值字节在0到255的范围内返回int。如果因为已到达流末尾而没有可用字节,则返回值-1。

如果你投-1char,你会得到65535因为char是无符号。由于byte,更糟的是-1是一个有效的值。无论如何,你没有阅读char值;您正在读(s),编码为int,范围为0-255加-1,表示流结束。如果你想char(S)我建议你看看这是在Javadoc作为

一个InputStreamReader描述的InputStreamReader是字节流的桥梁,以字符流