-2

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

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?

4

2 回答 2

4

你问的直接问题并不是你应该在这里被告知的第一件事,因为你所采取的方法是非常错误的:

  1. 永远不要使用类初始化器从键盘读取。根本没有充分的理由这样做。
  2. 不要吞下例外:你是在踢自己的脚。如果有错误,您将无法诊断。
  3. 您可能希望在键盘上解析一个整数输入;您实际上只是从标准输入中读取一个字节(System.in是一个字节流)并将其存储为int.
  4. 您有两个相同的类,其中有两个相同main的方法。这是没有意义的:该代码不会以任何形式“完成两次”。

这个列表绝不是详尽的,这只是我现在想到的。

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

于 2012-10-14T16:36:50.690 回答
3

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

如果您输入任意数量的字符,方法read()仍将返回第一个字符的 ASCII 码。从您的角度来看,我认为这就是这种“奇怪”行为的原因。

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

BufferedInputStream bis = new BufferedInputStream(in);
String s = bis.readLine();
于 2012-10-14T16:32:38.587 回答