2011-10-04 49 views
3

每次我运行此代码时,控制台进入无限循环打印“请输入数字”。我不明白为什么会发生这种情况。提前致谢。无限循环的来源

boolean check = true; 
    int temp = 0; 
    while(check==true){ 
     try{ 

      temp= asker.nextInt(); 
      check = false; 
     } 
     catch(InputMismatchException e){ 
      System.out.println("Please input a number."); 
     } 
    } 

编辑:asker是一个扫描仪。代码的目的是循环直到用户输入一个整数。

+0

我的猜测是'asker.nextInt()'抛出一个异常 – acqu13sce

+0

大概InputMismatchException时发生?如果您在“请输入数字”后添加check = false。代码停止? –

+0

什么是“问”。如果提交者未定义或者没有NextInt()函数,则代码将无限循环 – Sparky

回答

4

方法asker.NextInt()被抛出InputMismatchException,表明从asker接收到的输入(假设这是一个Scanner)实际上不是一个整数。此异常会导致循环重新启动,但不会将check设置为false。

在catch块中打印异常以获取有关失败的更多信息。但最有可能的是,你正在为应用程序提供一些东西(如果它是循环的,那么它就是很多很多东西),它实际上并不包含整数值。

+0

非常感谢回复。是的,无论何时我输入一个非整数都会发生无限循环。我需要插入什么,所以循环不断要求输入,直到输入整数为止? – rmp2150

+0

这几乎是你现在拥有的@ rmp2150。你发送什么样的数据? –

+0

我发送随机字符串只是为了测试它是否会通知用户已提交非整数值。然而,无论何时我发送一个字符串,它都会继续打印“请输入一个数字”,绝不允许用户再次输入。 – rmp2150

0

什么是asker,一个Scanner?如果nextInt()失败,它不会消耗任何输入,因此当您捕获您的异常并循环回去重试时,它最终会再次读取相同的错误输入。

你应该在catch块中做点什么来消耗无效输入,这样下次它可以读取一些不同的输入。也许可以拨打asker.nextLine(),并忽略返回值。

0

你需要打破循环,并报告为什么出现回路

boolean NotValid = true; 
int temp = 0; 
while(NotValid){ 
    try{ 

     temp= asker.nextInt(); 
     NotValid = false; 
     break; // stop 
    } 
    catch(InputMismatchException e){ 
     System.out.println("Please input a number. reason why:"); 
     System.out.println(e); 
     NotValid = true; 
    } 
} 
1

你永远要真正“使用” try/catch语句 - 我的意思是不使用它作为你的计划的一部分逻辑 - 这就是你在做什么。

一个大问题是,就像你的应用程序一样,你没有看到堆栈跟踪。在例外情况下吃堆栈跟踪几乎总是错误的。

如果你有捕捉异常,处理它捕捉附近,以及你可以,但最好是设置您的代码,使异常不能无论如何抛出。

如果你的老师让你这样做,那么请放弃这个建议,但记住你的想法是不好的形式。

也不要告诉你的老师,这是一种欠佳:)他要么不知道在这种情况下,他不会明白,为什么他还是不知道并使用此向您展示如何的try/catch作品。

+0

哈哈谢谢。我对编程相对比较陌生,我不是try/catch的粉丝。但我相信我的老师希望看到我们有能力使用try/catch。 – rmp2150