2017-02-09 5 views
-1

このスキャナ関連のバグを修正するにはどうすればよいですか?このコードはコンパイルされていても

import java.util.Scanner; // imports the Scanner class from the java.util package 

public class ScannerPractice { 

public static void main(String args[]) { 

    Scanner word = new Scanner("word 1 2 3 4"); // creates a new Scanner objecrt with a string as its input 
    String scaStr = word.nextLine(); // converts scanner to string 

    String strArr[] = new String[10]; 
    // as long as the scanner has another character... 
    for (int i = 0; i < scaStr.length(); i++) { 

     int j = 0; 
     String k = ""; 
     // if the next token is an integer... 
     if (word.hasNextInt()) { 

      j = word.nextInt(); 
      k = String.valueOf(j); 
      strArr[i] = k; 

     } 

     // otherwise, skip over that token 
     else { 

      word.next(); 

     } 

    } 

    String k = ""; 
    // for each character in charArr 
    for (int i = 0; i < strArr.length; i++) { 

     // Accumulate each element of charArr to k 
     k += " " + strArr[i]; 

    } 
    System.out.print(k); 

} 
} 

私はこのエラーを取得する:

Exception in thread "main" java.util.NoSuchElementException 
    at java.util.Scanner.throwFor(Unknown Source) 
    at java.util.Scanner.next(Unknown Source) 
    at ScannerPractice.main(ScannerPractice.java:28) 

例外はある、28行を参照:

word.next(); 

私は私を見て試してみましたforループは値を文字列配列に代入しますが、私はまだエラーを見つけることができませんでした。

私はこれを解決しようとしています。ヒントさえも高く評価されます。

+0

文書によると、スキャナは 'next()'を呼び出してそれ以上のトークンが利用できない場合、それをスローします。まだ入力されていないため利用できません。 –

+0

コードは意味をなさない。なぜなら、トークンを処理できるが、フラットな文字列を反復処理するスキャナを作成するからです。だから、スキャナを使ってトークン化したいのですか、通常の文字列でトークン化したいですか? –

+0

あなたのループに 'scaStr.length()'を使用している場合、何回の繰り返しを繰り返しているか考えてみてください。文字通り文字列からすべてのintをパースしようとしている場合は、 'word.hasNextInt()'を使用して継続したいかどうかを判断できます。 – Dana

答えて

1

この行のScannerにあるすべての文字列は既に使用しています。

String scaStr = word.nextLine();

ので、スキャナは、より多くのcharacteresを持っていない、あなたはそのエラーを取得している理由です。

私はあなたがそれを反復するために 'あなたのスキャナを文字列に変換する必要はないと思います。 whileを使用してScannerに残りの文字があるかどうかを確認できます。

while(word.hasNext()) { 
    int j = 0; 
    String k = ""; 
    // if the next token is an integer... 
    if (word.hasNextInt()) { 
     j = word.nextInt(); 
     k = String.valueOf(j); 
     strArr[i] = k; 
    } 
    // otherwise, skip over that token 
    else { 
     word.next(); 
    } 
} 
0

変更ループがスキャナが、それ以上の入力があるかどうかを確認する:

Scanner word = new Scanner("word 1 2 3 4"); 
String strArr[] = new String[10]; 
int i = 0; 

while (word.hasNext()) { 
    int j = 0; 
    String k = ""; 

    if (word.hasNextInt()) { 
     j = word.nextInt(); 
     k = String.valueOf(j); 
     strArr[i] = k; 
    } 
    else { 
     word.next(); 
    } 
} 

、あなたので、それはあなたがすでにスキャナから消費文字列を反復しても意味がありません。トークンに一致する能力を失う。文字列トークナイザを使用する場合は、それを行うことができますが、スキャナを使用してドロップすることができます。

0

、あなたのコードがへの入力を変更正しく実行する場合:改行文字が問題を解決追加

Scanner word = new Scanner("word"+"\n"+"1"+"\n"+"2"+"\n"+"3"+"\n"+"4"); 

関連する問題