java.util.NoSuchElementException原因分析以及解決方法

java輸入流報錯:

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

原因分析:

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--;
     }
}

分析:第二次使用 iter.next() 時,遊標已經指向下一個位置了,中間多出來一個空值!

2、在函數中,聲明瞭一個 scanner 對象,並且調用了 close 方法,再次啓動 scanner 的時候(或者在另一個函數中重新啓動 scanner 時),就會遇到異常!

解決方法:

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--;
     }
}

2、類如原因二的可以這樣解決:

使用多次Scanner get=new Scanner(System.in); 但是隻在最後使用 iter.close() 函數;
或者將Scanner get=new Scanner(System.in); 放在所有函數外層,同時在前面加上static修飾符,並且只在最後使用 iter.close() 函數!

發佈了81 篇原創文章 · 獲贊 56 · 訪問量 5萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章