1 回答

TA貢獻2036條經驗 獲得超8個贊
您不應該將 try-with-resource 與您自己沒有打開的資源一起使用,尤其是 with ,System.in它永遠不應該被應用程序關閉。
除此之外,您應該更喜歡事先測試條件,而不是捕獲異常。此外,盡量避免代碼重復,您最終會得到一個更簡單的解決方案:
public static void main(String[] args) {
? ? Scanner sc = new Scanner(System.in).useDelimiter("\\R");
? ? System.out.print("Enter first numeric value: ");
? ? double d1 = getDouble(sc);
? ? System.out.print("Enter second numeric value: ");
? ? double d2 = getDouble(sc);
? ? System.out.print("Choose an operation (+ - * /): ");
? ? while(!sc.hasNext("[-+*/]")) {
? ? ? System.out.println(sc.next()+" is not a valid operation");
? ? }
? ? String operation = sc.next();
? ? double result;
? ? switch (operation) {
? ? ? ? case "+": result = d1 + d2; break;
? ? ? ? case "-": result = d1 - d2; break;
? ? ? ? case "*": result = d1 * d2; break;?
? ? ? ? case "/": result = d1 / d2; break;
? ? ? ? default:
? ? ? ? ? ? throw new AssertionError("should not happen due to pretest");
? ? }
? ? System.out.println(d1+operation+d2);
? ? System.out.println("The answer is " + result);
}? ??
private static double getDouble(Scanner sc) {
? ? while(!sc.hasNextDouble()) {
? ? ? ? System.out.println(sc.next()+" is not a number");
? ? }
? ? return sc.nextDouble();
}
該解決方案用于hasNextDouble()詢問掃描器下一個令牌是否具有雙精度格式,并且只有在確認的情況下,應用程序才會通過 獲取它nextDouble()。否則,它用于next()獲取無效令牌,該令牌同時服務于報告并將其從未處理的輸入中刪除。同樣,hasNext("[-+*/]")檢查輸入是否與支持的四個運算符之一匹配。
由于編譯器不知道現在只能出現四個有效輸入之一,因此我們必須在 的情況下放置一個拋出語句default,switch否則編譯器會說result可能尚未初始化。我們可以初始化result為默認值,但如果程序流程未按預期工作,最好有一個強信號,而不是將默認值打印為錯誤結果。
使用Scanner可配置的分隔符來決定令牌的構成,因此該解決方案使用useDelimiter("\\R")換行符作為分隔符,將每一行視為一個令牌,就像原始代碼一樣。因此該類Pattern對語法進行了完整的描述。
添加回答
舉報