1


カードゲームを作成しようとしているこの単純なコードで例外が発生する理由がわかりません。ユーザーが彼の手でカードのインデックスを望んでいました(ドイツ語です)

public Karte abschlagen(Karte gegnK) {
    System.out
            .println("Bitte die Zahl für die jeweilige Karte auswählen: ");
    gibHandAus(); // prints the users cards with their indexes 

    try {
        Scanner sc = new Scanner(System.in);
        int index = sc.nextInt();
        if (index < 0 || index >= getHand().size()) {
            System.out
                    .println("Bitte nur eine der gegebenen Zahlen auswählen!");
                     sc.close();
            return abschlagen(gegnK);
        }
        Karte k = getHand().get(index);
        getHand().remove(index);
        sc.close();

では、ここで何が問題なのですか?
番号を選択する前に、noSuchElement 例外がスローされます。
close() メソッドがこれを引き起こしている可能性があるという別の質問を読みましたが、それでもそれなしでそれを行いました。

エラーメッセージは次のとおりです。

Exception in thread "main" java.util.NoSuchElementException
   at java.util.Scanner.throwFor(Unknown Source) 
   at java.util.Scanner.next(Unknown Source) 
   at java.util.Scanner.nextInt(Unknown Source) 
   at java.util.Scanner.nextInt(Unknown Source) 
   at durak.Spiel.spielerWehrtAb(Spiel.java:229) 
   at durak.Spiel.main(Spiel.java:314) 

編集: spielerWehrAb() のコード:

public static boolean spielerWehrtAb(Karte k) {
.
.
.
try {
Scanner sc = new Scanner(System.in);
int x = sc.nextInt();
sc.close();

if (x == 0) {
... }
else if(x == 1) {
System.out.println("1 ausgewählt");
Karte k2 = spieler.abschlagen(k);
....
} 
else return spielerWehrAb(k);
4

1 に答える 1

1

問題はScanner.close();、基になるストリームを閉じることです。2 回目は、閉じたストリームから読み込もうとしているので、明らかに失敗します。

ここでこの動作を実証するために設計したテストを参照してください: System.in で使用した場合の java.util.Scanner の奇妙な動作

解決策は、を閉じた後に読まないことScannerです。たとえば、 をScannerクラス メンバーとして定義し、常にそのメンバーを使用することができます。

于 2013-01-19T00:10:39.677 に答える