-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実際には、標準入力(バイトストリーム)から1バイトを読み取り、それを。として格納しているだけintです。
  4. 2つの同じクラスがあり、2つの同じmainメソッドが含まれています。これは意味がありません。そのコードでは、どのような意味でも「2回実行」されることはありません。

このリストは決して網羅的なものではなく、私が今何とか考えたものです。

結論として、基本的なアプローチを正しくするために、最初にコードを再設計してから、それを機能させるようにしてください。

于 2012-10-14T16:36:50.690 に答える
3

I think that you are confused with java types and how does input stream work. Method read() of input stream reads the next byte and returns it. Byte is not text or string. If for example you type 1 it returns 49 - the ASCII code of character 1. Typing of character 2 causes it to return 50 etc.

If you type as many character as you want method read() will still return the ASCII code of the first character. I think that this is the reason for this "strange" from your point of view behavior.

You probably should wrap input stream into BufferedInputStream and then use readLine() method, i.e.

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