2015-10-07 112 views
1

試圖編寫一個程序,用戶在該程序中輸入一週的費用。 麻煩來了,我希望程序重新詢問用戶是否輸入了不可接受的輸入。我想出瞭如何檢測負值,但是當試圖捕捉輸入不匹配異常(如果輸入字符或字符串時),該循環無限期地運行「星期一費用:」 如何使其成爲用戶給了另一個機會來回答?我試了一下,但是,這也爆發了do while while循環,這是我不想要的。這是爲什麼當循環無限運行時呢?

這裏是我到目前爲止的代碼:

import java.util.Scanner; 

    public class BarGraph{ 
    public static void main (String[] args){ 

Scanner myScanner; 
myScanner = new Scanner(System.in); 

double mon, tues, wed, thurs, fri, sat, sun; 

do{ 
    try{ 
     System.out.print("Expenses for Monday: "); 
     mon = myScanner.nextDouble(); 
    }catch(Exception e){ 
     mon = -1; 
    } 
}while(mon<0); 

System.out.println(mon); 

} 
} 

感謝您的幫助

+1

Scanner myScanner = new Scanner(System.in);將使您的生活比掃描儀myScanner更容易; myScanner = //等等等等等等 –

回答

1

你可以使用myScanner.nextLine();在開始下一個循環之前轉儲出緩存中所有不必要的字符

import java.util.Scanner; 

public class BarGraph { 

    public static void main(String[] args) { 

     Scanner myScanner; 
     myScanner = new Scanner(System.in); 

     double mon, tues, wed, thurs, fri, sat, sun; 

     do { 
      try { 
       System.out.print("Expenses for Monday: "); 
       mon = myScanner.nextDouble(); 
      } catch (Exception e) { 
       mon = -1; 
       myScanner.nextLine(); 
      } 
     } while (mon < 0); 

     System.out.println(mon); 
    } 
} 
+0

謝謝,這是最簡單的答案 – Clarisa

0

更換

mon = myScanner.nextDouble(); 

與以下

mon = Double.parseDouble(myScanner.next()); 
1

這是因爲它總是去捕捉阻止當sca內爾不能解析雙重價值。 這符合你的條件

mon<0 

都能得到-1值,它會導致無限循環 你可能誤會了你的病情到

while(mon>0) 
2

調用到nextDouble()不會消耗非double從你的Scanner。你需要類似的東西,

if (myScanner.hasNextDouble()) { 
    mon = myScanner.nextDouble(); 
} else { 
    System.out.printf("%s is not a double.%n", myScanner.next()); 
} 

此外,我建議你提取該邏輯到一個方法。像,

static double getExpensesForDay(Scanner scanner, String day) { 
    while (true) { 
     System.out.printf("Expenses for %s: ", day); 
     System.out.flush(); 
     if (scanner.hasNextDouble()) { 
      return scanner.nextDouble(); 
     } 
     System.out.printf("%s is not a double.%n", scanner.nextLine()); 
    } 
} 

然後,你可以這樣調用它

public static void main(String args[]) { 
    Scanner myScanner = new Scanner(System.in); 
    double mon = getExpensesForDay(myScanner, "Monday"); 
    double tues = getExpensesForDay(myScanner, "Tuesday"); 
    double wed = getExpensesForDay(myScanner, "Wednesday"); 
    double thurs = getExpensesForDay(myScanner, "Thursday"); 
    double fri = getExpensesForDay(myScanner, "Friday"); 
    double sat = getExpensesForDay(myScanner, "Saturday"); 
    double sun = getExpensesForDay(myScanner, "Sunday"); 
    // ... 
} 
0

您可以嘗試下面的代碼。它將通過整個陣列。您可以根據需要添加更多驗證。

import java.util.Scanner; 
public class BarGraph 
{ 

public static void main(String[] args) 
{ 
    System.out.println("Welcome to Expenses Program: " + "\n"); 

    week(); 
} 

public static void week() 
{ 
    Scanner myScanner; 
    myScanner = new Scanner(System.in); 
    String [] day = new String[] {"mon", "tues", "wed", "thurs", "fri", "sat", "sun"}; 

     for (String days : day) 
     { 
      System.out.println("Expenses for " + days + ":"); 
      float exp = myScanner.nextFloat(); 

     } 
} 
} 
相關問題