2011-12-16 52 views
3

我試圖做到這一點詢問我的學習指導一個問題:直到用戶輸入的 整數1至5之間什麼是「異常控制」循環?

寫一個異常控制的循環,循環無法破譯這個問題的真正含義,因爲我從來沒有聽說過這個詞之前,但這是我最好的猜測:

Scanner input = new Scanner(System.in); 
    int a = 0; 

    while(a <= 0 || a > 5) 
    { 
     try { 
      a = input.nextInt(); 

      if(a <= 0 || a > 5) 
       throw new OutOfRangeException(); //my own Excpt. class 
     } catch (OutOfRangeException e) { 
      System.out.println(e.getMessage()); 
     } 
    } 

你是什麼你們覺得呢?我在這裏錯過了什麼嗎?

+1

這個問題本身的氣味,我喜歡它有一個就可以再用大牌子:'不要做' – Bobby 2011-12-16 13:06:14

+0

難道說,導向裝置沿着這些路線的東西:`而(true){if(1和5之間的輸入){throw Exception();}}`? – Bobby 2011-12-16 13:07:34

+0

作爲一個有趣的筆記,[你不是第一個覺得這件事(http://answers.yahoo.com/question/index?qid=20110513111627AAkoPV6)。 – Bobby 2011-12-16 13:09:42

回答

6

我認爲你的catch子句應該是循環

Scanner input = new Scanner(System.in); 
int a = 0; 
try 
{ 
    while(true) 
    {  
     a = input.nextInt(); 
     if(a <= 0 || a > 5) 
      throw new OutOfRangeException(); //my own Excpt. class 
    } 
} 
catch (OutOfRangeException e) { 
    System.out.println(e.getMessage()); 
} 

我沒有真正聽到這個詞「異常控制迴路」之外,但我認爲這意味着它是一個無限循環的異常在離開。似乎合乎邏輯。

正如評論說,如果你直到用戶輸入1和5之間的數字需要循環,扔條件應該是

if(a >= 1 && a <= 5) 
2

一個異常控制迴路的真難看例如:

String[] array = new String[] {"a", "b", "c"}; 

try { 
    for (int i = 0;;i++) { 
     System.out.println(array[i]); 
    } 
} catch (ArrayIndexOutOfBoundsException e) { 

} 

不是檢查的條件,並執行結束時,條件不成立了,像

i < array.length 

我們執行循環,直到引發異常。這,ofc,是一個非常醜陋的。它混淆了代碼,如果你在循環內部調用一個方法,也會拋出一個ArrayIndexOutOfBoundsException異常,這個異常就會被吞下。

1

感謝親愛的朋友Mr. Big-Number,我能夠挖掘an example for this stuff。雖然,我從來沒有聽說過這個詞之前,它突然有意義的人,你看一個例子:

Scanner scanner = new Scanner(System.in); 
int number = 0; 
boolean done = false; 

while(!done) { 
    try { 
     number = scanner.nextInt(); 
     done = true; 
    } catch(InPutMisMatchException ex) { 
     // tell the user that that's not a number! 
    } 
} 

我不能保證這是真正的引導是什麼意思!

2

「異常控制」不是一個標準術語,並且無論如何,使用控制流的異常是一個衆所周知的不良做法。但爲了最清楚地表明它(即不好),我將省略循環檢查,並且只寫while(true),以便明顯地由環路控制的例外情況是

1

「異常控制循環」可能意味着循環,同時捕獲異常,在達到正確輸入時退出。儘管這個詞似乎已經被那個「學習指南」所喚起了。

Bobby的答案是幾乎沒有,只是缺少2件重要的事情在catch塊,以防止它進入無限循環:

import java.util.InputMismatchException; 
import java.util.Scanner; 

public class LoopWhileException { 

    public static void main(String[] args) { 
     boolean isNumber = false; 
     int number = 0; 

     Scanner scan = new Scanner(System.in); 

     while(!isNumber) { 
      try { 
       System.out.print("Enter an integer: "); 
       number = scan.nextInt(); 

       System.out.print("Your integer is: " + number); 

       scan.close(); // close resources for good practice 

       // not true = false, exits loop on integer input 
       isNumber = true; // break; can also be used 

      } catch(InputMismatchException ime) { 
       System.out.print("Input is not a number!\n\n"); 

       scan.nextLine(); // clears input buffer 

       // not false = true, re-enters while loop on catch 
       isNumber = false; 
      } 
     } 
    } 
} 

如前所述,這樣的循環異常一般是不會接受的做法,但這只是所謂的「例外控制」情景的參考。

0

我想接受的答案是正確的和最近的一個。

也許這是指該技術在這本書中,這幾乎是同樣的技術:傑克·希拉茲-Java性能優化(第2版)-O'Reilly媒體(2003年),第7.3章異常終止循環

優化while循環的例外情況是:當while條件不滿足時,異常退出循環而不重新測試條件。 但在這種情況下,也許它不是最優化的,因爲它使用if來進行條件測試而不是while。

另一個鏈接:http://etutorials.org/Programming/Java+performance+tuning/Chapter+7.+Loops+Switches+and+Recursion/7.3+Exception-Terminated+Loops