2011-12-16 24 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