System.in.read()未在静态块内返回精确值

时间:2012-10-14 16:17:43

标签: java

由于静态块用于以动态方式初始化静态数据成员,因此我有以下代码:

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?

2 个答案:

答案 0 :(得分:4)

你问的直接问题并不是你应该在这里首先得到通知的,因为你所采取的方法是非常错误的:

  1. 切勿使用类初始值设定项从键盘读取。没有充分的理由这样做。
  2. 不要吞下例外:你是在脚下射击自己。如果出现错误,您将无法进行诊断。
  3. 您可能希望在键盘上解析整数输入;实际上,您只是从标准输入读取单个字节(System.in字节流)并将其存储为int
  4. 您有两个相同的类,其中包含两个相同的main方法。这没有任何意义:在该代码的任何意义上都不会“完成两次”。
  5. 这个清单并非详尽无遗,这正是我现在想到的。

    总而言之,您应该首先重新设计代码,以使基本方法理智,然后才尝试使其工作。

答案 1 :(得分:3)

我认为您对java类型感到困惑,输入流如何工作。 输入流的方法read()读取下一个字节并返回它。字节不是文本或字符串。例如,如果键入1,则返回49 - 字符1的ASCII码。键入字符2会使其返回50等。

如果您键入任意数量的字符,方法read()仍将返回第一个字符的ASCII代码。我认为这就是你的观点行为中这种“奇怪”的原因。

你可能应该将输入流包装到BufferedInputStream然后使用readLine()方法,即

BufferedInputStream bis = new BufferedInputStream(in);
String s = bis.readLine();