2012-11-24 117 views
2

我實際上遇到了我的程序問題。其實我在學校學習(11年級 - 大專),所以請用非常簡單的語言來解釋我。我正在開發一個測驗,非常基礎的學校項目,所以程序就這樣繼續下去......我希望用戶通過輸入1-4的數字輸入他/她的選擇。我不希望用戶輸入字母,字母或特殊字符或任何其他編號。除了1-4之外。我嘗試使用try和catch,但是我的程序在拋出異常後停止。即使在顯示錯誤信息System.out.println(「輸入無效,請在1-4之間輸入一個數字」)之後,我想讓程序代碼運行。 示例程序如何在java中嘗試並捕獲異常處理後恢復代碼

import java.io.*; 
    import java.lang; 
    public class 
    { 
    public static void main()throws IOException 
    { 
    InputStreamReader read =new InputStreamReader (System.in); 
    BufferedReader in =new BufferedReader (read); 
    System.out.println(" Select your category"); 
    System.out.println(" 1. Food"); 
    System.out.println(" 2. National"); 
    System.out.println(""); 
    System.out.println(" Enter your choice"); 
    int choice=Integer.parseInt(in.readLine()); 
    if(choice==1)//food category 
    { 
     int score = 0; 
     System.out.println("what are dynamites made?"); 
     System.out.println("1. peanuts");System.out.println("2. grapes"); 
     System.out.println("3. flaxseeds");System.out.println("4. fish"); 
     System.out.println(" Enter your choice"); 
     int food1= Integer.parseInt(in.readline()); 
     if(c1=1) 
     { System.out.println(" Correct answer"); 
     score=score+10 
     } 
     else 
     { 
     System.out.println(" Wronge answer"); 
     score=score+0 
     } 
     //then i have the second question with the same format 
    } 
     if(choice==2)//natioanl category with the same format as above 
     {//two question with if else statements in them } 
    } 
}// also help me where to add the try and catch statements 

回答

0

這是對此問題的更優雅的解決方案。沒有嘗試涉及。

import java.io.*; 
    import java.lang; 
    public class 
    { 
    //Compares response to the string representations of all numbers between 1 and numOptions, inclusive. 
    //Returns the matching integer or -1 otherwise. 
    public static int parseResponse(String response, int numOptions) 
    { 
      for(int i=1;i<=numOptions;i++) { 
       if(response.equals(Integer.toString(i))) return i; 
      } 
      return -1; 
    } 

    public static void main()throws IOException 
    { 
     InputStreamReader read =new InputStreamReader (System.in); 
     BufferedReader in =new BufferedReader (read); 
     System.out.println(" Select your category"); 
     System.out.println(" 1. Food"); 
     System.out.println(" 2. National"); 
     System.out.println(""); 
     System.out.println(" Enter your choice"); 

     //New code 
     int choice=-1; 
     while(choice==-1) { 
      choice=parseResponse(in.readLine(),2); 
      if(choice==-1) 
      { 
       System.out.println(" Invalid input. Please enter a number between 1-2"); 
      } 
     } 


     if(choice==1)//food category 
     { 
      int score = 0; 
      System.out.println("what are dynamites made?"); 
      System.out.println("1. peanuts");System.out.println("2. grapes"); 
      System.out.println("3. flaxseeds");System.out.println("4. fish"); 
      System.out.println(" Enter your choice"); 

      //New code 
      int food1=-1; 
      while(food1==-1) { 
       food1=parseResponse(in.readLine(),4); 
       if(food1==-1) 
       { 
        System.out.println(" Invalid input. Please enter a number between 1-4"); 
       } 
      } 

      if(food1==1) 
      { System.out.println(" Correct answer"); 
       score=score+10 
      } 
      else 
      { 
       System.out.println(" Wronge answer"); 
       score=score+0 
      } 
      //then i have the second question with the same format 
     } 
     if(choice==2)//natioanl category with the same format as above 
     {//two question with if else statements in them 
     } 
    } 
}// also help me where to add the try and catch statements 

如果你不知道:

if(response.equals(Integer.toString(i))) return i; 

相同

if(response.equals(Integer.toString(i))) 
{ 
     return i; 
} 
+0

謝謝!這真的很有幫助! –

1

嘿這裏是你可以運行的代碼。

import java.io.*; 

import java.lang.*; 

public class TestTryCatch 
{ 

public static void main(String args[]) 
{ 
    try 
    { 
     InputStreamReader read =new InputStreamReader (System.in); 
     BufferedReader in =new BufferedReader (read); 
     System.out.println(" Select your category"); 
     System.out.println(" 1. Food"); 
     System.out.println(" 2. National"); 
     System.out.println(""); 
     System.out.println(" Enter your choice"); 
     int choice=0; 
     try 
     { 
      choice = Integer.parseInt(in.readLine()); 
     } 
     catch(Exception e) 
     { 
      choice=0; 
     } 
     if(choice==0) 
     { 
      System.out.println("Invalid Input");   
     } 
     if(choice==1)//food category 
     { 
      int score = 0; 
      System.out.println("what are dynamites made?"); 
      System.out.println("1. peanuts");System.out.println("2. grapes"); 
      System.out.println("3. flaxseeds");System.out.println("4. fish"); 
      System.out.println(" Enter your choice"); 
      int food1= Integer.parseInt(in.readLine()); 
      if(food1==1) 
      { System.out.println(" Correct answer"); 
      score=score+10; 
      } 
      else 
      { 
       System.out.println(" Wronge answer"); 
       score=score+0; 
      } 

     } 
     if(choice==2) 
     { 
     } 
    } 
    catch(Exception e) 
    { 
     e.printStackTrace(); 
    } 
} 
} 

把你嘗試轉換成整型。如果你的代碼給出了異常,它會進入異常塊並處理任何你想要的值。在這裏,我把它作爲0,你也可以分配-1。

如果此代碼有幫助還原,請回復。

+0

請幫我...它沒有幫助,也許我感到困惑使用try和catch因爲我得到這個錯誤選擇可能還沒有初始化請發佈代碼嘗試並捕獲它,我可以直接複製和粘貼或簡化步驟使用try和catch if else語句 –

+0

hav你是否複製粘貼評論?因爲我已經在選擇。上面的代碼複製粘貼會正常運行。我也反覆測試過。 – Javadotnet

+0

請嘗試讓我知道它是否爲你工作 – Javadotnet

3

程序發生崩潰的地方就在這裏:

int food1= Integer.parseInt(in.readline()); 
if(c1=1) 
{ System.out.println(" Correct answer"); 
    score=score+10 
} 

「C1」不是一個定義的變量,所以使用它會導致程序,無論用戶輸入什麼崩潰。您應該將「c1」替換爲「food1」。此外,賦值運算符「=」應替換爲比較運算符「==」。

退房整數的Javadoc(谷歌「整型的javadoc」),你會發現,

public static int parseInt(String s) 
       throws NumberFormatException 

那麼NumberFormatException的是我們需要趕上。在運行程序時,您還可以通過查看堆棧跟蹤來找出拋出的異常和位置。

每當引發異常時,錯誤之後和下一個'}'之前的所有內容都會被跳過。由於大部分代碼應該在錯誤發生後執行很好,我們要保持我們的try-catch小,即

try { 
    int choice=Integer.parseInt(in.readLine()); 
} catch (NumberFormatException ex) { 
    //Not a number 
} 

我們需要的變量,「選擇」是我們嘗試的訪問之外,讓我們拭目以待在我們的嘗試之外聲明它。

int choice; 

try { 
    choice=Integer.parseInt(in.readLine()); 
} catch (NumberFormatException ex) { 
    //Not a number 
} 

但是,NumberFormatException不會告訴您用戶是否輸入了除1-4之外的數字。所以你必須添加你自己的驗證。

int choice; 

try { 
    choice=Integer.parseInt(in.readLine()); 
    if(choice<1 || choice>4) ; //Not 1-4 
} catch (NumberFormatException ex) { 
    //Not a number 
} 

最後,我們需要跟蹤我們的輸入是否有效,並在需要時循環。

boolean valid=false; 

while(!valid) { 

    int choice; 

    try { 
     choice=Integer.parseInt(in.readLine()); 
     if(choice<1 || choice>4) valid=false; //Not 1-4 
     else valid=true; 
    } catch (NumberFormatException ex) { 
     //Not a number 
     valid=false; 
    } 

    if(valid) { 
     //Handle valid response here 
    } else { 
     System.out.println(" Invalid input. Please enter a number between 1-4"); 
    } 
} 

祝你好運!

+0

請幫助我...它不幫助,也許我對使用try和catch感到困惑,因爲我得到這個錯誤選擇可能還沒有初始化請發佈代碼嘗試和趕上在其中我可以直接複製和粘貼或簡化步驟使用try和catch if else語句 - –

+0

因此,警告「選擇可能尚未初始化」不應阻止您編譯,但答案很簡單顯式初始化它,即:int choice = 0; (你需要練習閱讀和排除故障) – NewEndian