

下記の様なコードを作成しました。  
このプログラムを実行すると、classファイル実行時にエラーが出ます。  
どうやらScannerクラスのcloseメソッドに問題があるようです。

以上のことを踏まえた上で質問させていただきます。  
Scannerクラスでsc1とsc2の様に呼び出した後、 `sc1.close()`
などとしてcloseメソッドを呼び出したら、sc2の標準入力ストリームも閉じてしまうのでしょうか？

別々のものとして呼び出しているはずなのに、この様な事が起こる事がとても不思議です。

ご回答のほど、どうぞよろしくお願いいたします。

**エラーメッセージ:**

[code]

    mainメソッド内の入力(1) > 1
    メソッド呼出しの入力 > 2
    mainメソッド内の入力(2) > Exception in thread "main" java.util.NoSuchElementException
            at java.base/java.util.Scanner.throwFor(Scanner.java:945)
            at java.base/java.util.Scanner.next(Scanner.java:1602)
            at java.base/java.util.Scanner.nextInt(Scanner.java:2267)
            at java.base/java.util.Scanner.nextInt(Scanner.java:2221)
            at Test.main(Test.java:11)
    
[/code]

**現状のコード:**

[code]

    import java.util.Scanner;
    
    class Test {
        public static void main(String[] args) {
            Scanner sc1 = new Scanner(System.in);
            
            System.out.print("mainメソッド内の入力(1) > ") ;  int a = sc1.nextInt() ;
           
            processInput();
            
            System.out.print("mainメソッド内の入力(2) > ") ; int b = sc1.nextInt() ;
            
            sc1.close();
            
        }
        
        static void processInput() {
            Scanner sc2 = new Scanner(System.in) ; 
            
            System.out.print("メソッドでの呼出しの入力 > ") ; int input = sc2.nextInt() ;
            
            sc2.close();
          
        }
        
    }
    
[/code]


CC BY-SA 4.0
2023-05-23T14:26:45.207
94948
2023-05-24T05:16:43.710
2023-05-24T01:35:55.557
3060
58093
question
java
javaのScannerクラスについての質問です。


> `sc1.close()` などとしてcloseメソッドを呼び出したら、sc2の標準入力ストリームも閉じてしまうのでしょうか？

その文は正しいですが質問文のコードで起きているのは逆で、「`processInput()` 内で `sc2.close()` をしたため
`System.in` がクローズされ、`sc1` がデータを取れなくなった」です。

1つのストリームから複数の`Scanner`インスタンスを作るべきではありません。`processInput()` に `Scanner` 引数を足して
`sc1` を渡して使うべきです。


CC BY-SA 4.0
2023-05-23T22:51:38.923
94952
2023-05-24T01:36:18.550
2023-05-24T01:36:18.550
3060
3475
94948
answer