Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/356.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java System.in.read()未在静态块内返回准确值_Java - Fatal编程技术网

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@BubbaWoop
    publicstaticvoidmain
    你能做到吗?太棒了:o@BubbaWoop在eclipse中,编写
    main
    ,然后控制+空格。。还有很多其他的捷径
    sysout
    用于
    System.out.println()
    :)我同意并问@Arun:你的意图是什么?学习Java?非常感谢你,AlexR,但我不明白为什么只返回第一位的ASCII值。对于未来的读者:BufferedInputStream没有readLine()方法。可能是指BufferedReader(尽管Console类也有一个)。