2014-02-28 35 views
0

我想不通,爲什麼我得到的錯誤:for循環和if語句錯誤發生的歷史

java.util.NoSuchElementException null(in java.util.Scanner)

在我的方法

public void processTransactions(Scanner transFile){ 

     while (transFile.hasNext()){ 
      for(i = 0; i < ids.length; i++){ 
       finalInventory[i] = startingInventory[i]; 

       if(ids[i] == transFile.next()){ 
        finalInventory[i] += transFile.nextInt(); 
       } 
      } 
     } 
    } 

這是我construtor:

public SoftDrinkInventory(Scanner inventoryFile) { 

     initializeString(names); 
     initializeString(ids); 
     initializeInt(startingInventory); 
     initializeInt(finalInventory); 
     initializeInt(transactionCounts); 

     while (inventoryFile.hasNext()){ 
      names[i] = inventoryFile.next(); 
      ids[i] = inventoryFile.next(); 
      startingInventory[i] = inventoryFile.nextInt(); 
      i++; 
     } 
    } 

所有變量都已經在類中聲明過了。

+4

如果您的掃描儀在'for'循環的一次迭代期間用完輸入會發生什麼? –

+0

你正在寫這個transFile.nextInt();兩次........ if(ids [i] == transFile.next()){finalInventory [i] + = transFile.nextInt();}當控制器是控制器時,它將控制器移動到最後的+1元素最後元素 – Sambhav

+0

哦..錯過了..謝謝@DavidWallace – stinepike

回答

2

我有點猜測,但我認爲你的代碼應該是這個。

public void processTransactions(Scanner transFile){ 

    while (transFile.hasNext()){ 
     String key = transFile.next(); 
     int value = transFile.nextInt(); 
     for(i = 0; i < ids.length; i++){ 
      finalInventory[i] = startingInventory[i]; 

      if(ids[i].equals(key)){ 
       finalInventory[i] += value; 
      } 
     } 
    } 
} 

你只想做next()nextInt()while循環迭代一次。目前,您在for循環的每次迭代中都重複使用next(),這實際上並不是您想要的。

請注意,這不是您的問題的最有效的解決方案,但它帶走您的錯誤。

此外,您還沒有指定ids的類型,但我認爲它是String[]

+0

+1但我們不知道該文件的格式是什麼,或者它應該快速失敗(或者只是記錄並繼續)。 –

+0

是的,但從文件中有一些關鍵字(我猜這不一定是'String',但也可能是),這是很明顯的,並且每個關鍵字之後都必須是一個整數「補充」到庫存盤點。這個答案在一些沒有提供的細節中可能是不正確的,但它足夠「接近」,讓OP再次運行。 –

+0

到目前爲止工作。如果我無法弄清下一步我需要做什麼,我會轉貼。謝謝! –

1

要調用hasNext()但使用nextInt() ...一個解決方案是使用,

while (transFile.hasNextInt()){ 
    // As before. 
} 

另一個是跳過任何不是一個int,也許像這樣

while (transFile.hasNext()){ 
    if (!transFile.hasNextInt()) { 
    transFile.next(); 
    continue; 
    } 
    // As before. 
} 
+0

不,hasNext()後的下一個調用是next(),而不是nextInt()。我相信你誤解了這一點。但是,我不會倒退,因爲這個問題是絕對不清楚的。 –