1. ホーム
  2. プログラミング言語
  3. ジャワ

java.util.NoSuchElementException 原因解析と解決方法

2022-01-21 23:11:30
<パス

java 入力ストリームのエラー報告。

Exception in thread "main" java.util.NoSuchElementException
	at java.base/java.util.Scanner.throwFor(Unknown Source)
	Scanner.next(Unknown Source) at java.base/java.util.
	Scanner.nextInt(Unknown Source) at java.base/java.util.
	at java.base/java.util.Scanner.nextInt(Unknown Source)

  • 1
  • 2
  • 3
  • 4
  • 5

原因分析。

1. おそらく、イテレータが複数回使用され、空っぽを指しているためだと思われます

Scanner iter=new Scanner(System.in);
while(iter.hasNext()) {
    ArrayList<SprintUserStory> undoneUserStoriesList = SprintUtil.getUndoneUserStoriesList(iter.next().getID(),iter.next().getPkey( )); 
    if(undoneUserStoriesList.size() >0){
        willdonefeautre--;
     }
}

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7

解析してください。iter.next()を2回目に使ったとき、カーソルはすでに次の位置を指していて、途中に余分なnull値があるのです!

2. 関数の中で、宣言が スキャナ オブジェクトを作成し、close メソッドを呼び出すと、スキャナを再び起動したとき (または別の関数でスキャナを再起動したとき)、例外に遭遇することになります!

回避策

1. 原因1のようなクラスは、中間変数に iter.next() を代入することで解決できます。

Scanner iter=new Scanner(System.in);
while (iter.hasNext()) {
    JIRAFeature jirafeaturetemp = iter.next();
    ArrayList<SprintUserStory> undoneUserStoriesList = SprintUtil.getUndoneUserStoriesList(jirafeaturetemp.getID(),jirafeaturetemp. getPkey());
     if(undoneUserStoriesList.size() >0){
        willdonefeautre--;
     }
}

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8

2. 原因2のようなクラスは、このように解決することができます。

複数の Scanner get=new Scanner(System.in); ただし、iter.close()関数は最後だけ使用します。
または Scanner get=new Scanner(System.in); をすべての関数の外層に置き、その前に static 修飾子を使って、最後に iter.close() 関数を使うだけです!