Java System.in.read()未在静态块内返回准确值
由于静态块用于以动态方式初始化静态数据成员,因此我有以下代码:Java System.in.read()未在静态块内返回准确值,java,Java,由于静态块用于以动态方式初始化静态数据成员,因此我有以下代码: class Temp { static int x; static { try { x = System.in.read(); } catch (Exception e) { //Do nothing } } } class Temp1 { public static void main(String
class Temp {
static int x;
static {
try {
x = System.in.read();
} catch (Exception e) {
//Do nothing
}
}
}
class Temp1 {
public static void main(String args[]) {
System.out.println(Temp.x);
}
}
class Temp2 {
public static void main(String args[]) {
System.out.println(Temp.x);
}
}
运行Temp1、Temp2时,x的正常值应该是我从键盘输入的值,但无论我从键盘输入什么,我总是得到49和50
我已经看到inputstream类的read()方法,它应该返回相同的结果。为什么每次都返回49和50?我认为您对java类型以及输入流是如何工作的感到困惑。 输入流的方法
read()
读取下一个字节并返回它。字节不是文本或字符串。例如,如果您键入1
,它将返回49-字符1
的ASCII码。键入字符2
会使其返回50等
如果键入所需数量的字符,方法read()
仍将返回第一个字符的ASCII码。我认为,从你的角度来看,这就是这种“奇怪”行为的原因
您可能应该将输入流包装到BufferedInputStream
中,然后使用readLine()
方法,即
BufferedInputStream bis = new BufferedInputStream(in);
String s = bis.readLine();
你所问的直接问题并不是你在这里应该知道的第一件事,因为你所采取的方法是非常错误的:
System.in
是一个字节流),并将其存储为int
main
方法。这毫无意义:任何意义上的代码都不会“做两次”总而言之,你应该首先重新设计你的代码,让基本的方法变得合理,然后才试着让它工作。
p.s.v.m(stringa[])
真的吗?你不必费心写正确的语法p.s.v.m是什么意思?这是首字母缩略词吗?因为你不能用完整的stops@BubbaWooppublicstaticvoidmain
你能做到吗?太棒了:o@BubbaWoop在eclipse中,编写main
,然后控制+空格。。还有很多其他的捷径sysout
用于System.out.println()
:)我同意并问@Arun:你的意图是什么?学习Java?非常感谢你,AlexR,但我不明白为什么只返回第一位的ASCII值。对于未来的读者:BufferedInputStream没有readLine()方法。可能是指BufferedReader(尽管Console类也有一个)。