2011-03-18 74 views
1

我使用try-catch異常處理寫這個程序:嵌套循環不會工作的Java程序

Scanner keyboard = new Scanner(System.in); 
    String[] employees = new String[5]; 
    boolean done1 = false; 

    //input and error exception for entering employee names into an array 
    for (int i = 0; i < 5; i++) 
    {//begin for 

     while (!done1) 
     {//begin while 

      System.out.println("Please enter employee's name: "); 
      try 
      {//begin try 
       employees[i] = keyboard.nextLine(); 

       if (employees[i].length() == 0) 
        throw new Exception("No name was entered."); 

       if (employees[i].length() >= 31) 
        throw new Exception("Name entered contains too many " 
          + "characters"); 

       for (int check = 0; check < employees[i].length(); check++) 
       {//begin for 
        if(Character.isDigit(employees[i].charAt(check))) 
         throw new Exception("Input contains invalid " 
           + "charaters."); 
       }//end for 

       done1 = true; 
      }//end try 

      catch (Exception a) 
      {//begin catch 
       System.out.println("Error: " + a.getMessage()); 
      }//end catch 

     }//end while 

    }//end for 

當我運行程序時,它踢出來的for循環,只有輸入一審我和其餘的都是空的。我如何讓程序停留在這個循環中並讓它保持錯誤檢查?

回答

0

在您的for循環中簡單地放置另一個try catch塊可能是最容易的。當引發異常時,它將使用for循環的catch並繼續迭代。

事情是這樣的:

for (int check = 0; check < employees[i].length(); check++) 
      {//begin for 
       try { 
        if(Character.isDigit(employees[i].charAt(check))) 
         throw new Exception("Input contains invalid " 
           + "charaters."); 
       } 
       catch(Exception e) 
       { //Handle Error 
       } 
      }//end for 
+0

你根本不應該爲這類事情使用例外。 – 2011-03-18 22:58:26

+0

@Martin爲什麼不呢?我可以看到這是將錯誤處理與算法分開的簡單方法。對於我們所知道的,後來他可能想要做日誌記錄或其他事情,這可能是許多代碼行。 – 2011-03-18 23:01:41

+0

如果必須的話,您可以輕鬆調用situe中的日誌記錄方法 - 但是我們是否真的記錄了我們丟棄的無效數據?例外情況出現在特殊情況下。 – 2011-03-28 12:27:10

2

done1變量的第一個循環後仍true,造成後續while語句不進入循環體。

它可能是更好地完全消除done1變量,使用這樣的結構:

for (...) { 
    while (true) { 
     try { 
      // get user input 
      break; 
     } catch (Exception e) { 
      // .. 
     } 
    } 
} 
1

設置done1回到false。或插入done1 = false作爲主要for週期的第一行。

0

您沒有使用正確的例外...

例外的是處理這樣的邏輯很昂貴的方式,和你在剛創建一個沒有特定的異常和使用的方法是錯誤的。例外是爲了處理可能發生在您的程序中的特殊情況而設計的 - 資源不可用性,連接超時 - 這類事情。

您正在查看的問題應該僅通過流量控制來處理。

希望這會有所幫助...

Martin。

Ps。您的代碼,通過一些更合理的替代例外,可能是這樣的:

import java.util.Scanner; 
public class SOExample { 

    /** 
    * @param args 
    */ 
    public static void main(String[] args) { 

     Scanner keyboard = new Scanner(System.in); 
     String[] employees = new String[5]; 
     boolean done1 = false; 
     String strMessage = ""; 
     //input and error exception for entering employee names into an array 
     for (int i = 0; i < 5; i++) 
     {//begin for 
      done1 = false; 

      while (!done1) 
      {//begin while 
       strMessage=""; 
       System.out.println("Please enter employee's name: "); 
       employees[i] = keyboard.nextLine(); 

       if (employees[i].length() == 0) 
        strMessage = "No name was entered."; 

       if (employees[i].length() >= 31) 
        strMessage = "Name entered contains too many " 
          + "characters"; 
       if (strMessage == ""){ 
        for (int check = 0; check < employees[i].length(); check++) 
        {//begin for 
         if(Character.isDigit(employees[i].charAt(check))){ 
          strMessage = "Input contains invalid " 
            + "charaters."; 
          break; 
         } 
        }//end for 
       } 

       done1 = (strMessage == ""); 
       if (!done1){ 
        System.out.println("Error: " + strMessage); 
       } 

      }//end while 

     }//end for 

    } 

} 
0

你進入while循環DONE1表現在第一時間計算爲真,因爲DONE1是假的。在最後,您將done1設置爲true。當您評估!done1以再次執行循環時,由於您在第一遍中將done1設置爲true,因此表達式現在爲false。