2014-05-23 31 views
-3

繼編程之後,卡住了。我得到這堆棧跟蹤:InputMismatchException,programmingbydoing第17課

Exception in thread "main" java.util.InputMismatchException 
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 Doing.LessonSeventeen.main(LessonSeventeen.java:23) 

也在第8行它說「資源泄漏」鍵盤從未關閉「。

package Doing; 

import java.util.Scanner; 

public class LessonSeventeen { 

    public static void main(String[] args) { 
     Scanner keyboard = new Scanner(System.in); // <- line 8 
     String FirstName, LastName, LoginName; 
     int Grade, IDNum; 
     double GPA; 

     System.out.println("What is your first name?"); 
     FirstName = keyboard.next(); 
     System.out.println("What is your last name?"); 
     LastName = keyboard.next(); 
     System.out.println("What is your grade (as a number)"); 
     Grade = keyboard.nextInt(); 
     System.out.println("What is your login name?"); 
     LoginName = keyboard.next(); 
     System.out.println("What is your Student ID number?"); 
     IDNum = keyboard.nextInt(); 
     System.out.println("And finally, what is your GPA? (Up to 4.0"); 
     GPA = keyboard.nextInt(); 

     System.out.println("Your information:"); 
     System.out.println("Login: " + LoginName); 
     System.out.println("ID: " + IDNum); 
     System.out.println("Name:" + LastName + ", " + FirstName); 
     System.out.println("GPA: " + GPA); 
     System.out.println("Grade: " + Grade); 
    } 
} 
+0

_沒有錯誤_,那麼你發佈錯誤。您是否搜索了警告的確切消息?資源泄漏......永遠不會關閉。 –

+0

**線程「主」**中的異常。這不是一個錯誤? – rpax

+0

「_keyboard永遠不會關閉_」所以關閉它。你真的需要我們嗎? – csmckelvey

回答

1

沒有關閉stdin的問題,JVM會幫你照顧它,並且沒有資源泄漏。

顯然,你有內置到尋找掃描儀(可能是任何東西,是可關閉的觸發這個)獲得封閉的,沒有找到它,並生成一個警告你的IDE一些靜態分析功能。

Scanner實現Closeable所以它有着密切的方法。行添加到主方法的末尾,就像

keyboard.close() 

同時添加throws Exception的主要方法簽名,因爲接近拋出IOException異常。再一次,這不是stdin實際會發生的事情。掃描器拋出IOException異常,因爲它處理各種輸入流,並且在某些情況下網絡問題可能會破壞事物。

這應該使你的警告消失。

至於堆棧跟蹤,你進入的鍵盤?您的掃描程序正在調用nextInt,因此它期望輸入一個整數。如果你把小數點放在那裏,它將不能處理它。考慮將您的等級改爲BigDecimal

僅僅因爲一個號碼有小數點是不足夠的理由來使用浮點類型。浮點適用於某些類型的計算。對於沒有計算涉及的情況,您不希望您輸入的內容與程序顯示的內容有任何區別,it's simpler to use BigDecimal

+0

無論我以前的評論,感謝一噸。我通過將GPA更改爲keyboard.nextDouble()修復了另一個錯誤; – Scinerio

+0

@Scinerio:我知道雙打似乎應該是自然選擇,因爲它們是內置於語言中的,但在實踐中,處理BigDecimal更容易,但出現更少的意外。我試圖引導你遠離問題:-)。 –

+0

所以任何時候我想我應該使用一個雙,只要去BigDecimal?我可以那樣做,謝謝。 – Scinerio