2014-04-28 25 views
-1
int option; 
    while(true) { 
     try { 
      option = sc.nextInt(); 
     } 
     catch(Exception e) { 
      System.out.println(e); 
      continue; 
     } 
     if(option != 1 && option !=2) { 
      System.out.println("Please choose one of the above options!"); 
      continue; 
     } 
     break; 
    } 

那么为什么如果我输入一个字符串代码进入一个无限循环?捕捉异常时进入无限循环

回答

0

因为当你发现你呼叫continue,循环直接进入下一次迭代。

编辑:傻我,你需要在致电nextInt()之前致电hasNextInt()。您可能已经耗尽了输入,因此同样的异常会一遍又一遍地抛出。

请注意,如果使用输入流,hasNextInt()将会阻塞。这将基本上模拟“等待”用户输入的程序。

+0

OK,并且在下一次迭代中代码应该再次询问我是否有输入,但它不会自动跳到“catch”块并重复打印错误消息! – 3la210

0

因为您不会在循环中间暂停以重新扫描下一个用户输入。

0

我假设你正在努力使用户选择选项1或选项2:

您的代码表示,如果他们的选择是不是两个1和2,然后继续。应该说,如果他们的选择不是1或2,然后再继续,这将是这样进行编码:

if(option != 1 && option != 2) { 
    System.out.println("Please choose one of the options"); 
    continue; 
} 

顺便说一句,用继续突破是坏的编码。相反,在if条件中使用while循环。

编辑:

这里是正确的while循环:

try { 
    option = sc.nextInt(); 
    while(option != 1 && option != 2) 
     System.out.println("Please choose one of the options"); 
} catch (Exception e) { 
    e.printStackTrace(); 
} 

编辑#2:

你也试图抓住可能的异常后继续代码。无论是否有例外情况,您都应该将该代码放在finally {}区块中,以确保其运行正常。但是,在这种情况下,它不是必需的。通常,finally{}块用于I/O流。

+0

你是对的,我想让用户选择1或2,但“或”不正确,因为如果它是||例如option = 1,那么(option!= 2)=> true,如果选项== 1,代码将进入“if”块 – 3la210

+0

,那么条件永远不会达到(选项== 2)。但是,如果选项== 2,它首先检查并找到(选项!= 1),然后检查并找到(选项== 2)(如||所述)。这使用户只能输入1或2,或者通过while循环重复输入。因此,||是正确的,而不是&& –

+0

编辑:想到它后,你是正确的:它应该是&&而不是||。我很抱歉。 –