黑马程序员技术交流社区

标题: java 代码出现死循环 求解答 thx [打印本页]

作者: 张甲甲    时间: 2013-5-17 11:59
标题: java 代码出现死循环 求解答 thx
本帖最后由 张甲甲 于 2013-5-24 13:29 编辑

以下是我写的代码 为什么成了一个死循环 求解答
public class time
{public static void main(String[] args) {
int year = 0;
Scanner reader=new Scanner(System.in);
do{  
try{  System.out .print("输入年:");  
year=reader.nextInt();  
break;  }
catch(InputMismatchException n){  
System.out.println("必须输入数字");  }  
}while(true);
}
}
运行结果截图

ab.png (1.83 KB, 下载次数: 0)

ab.png

作者: 袁梦希    时间: 2013-5-17 12:18
楼主你好,因为while(true)后面多了个";"号
黑马云青年为您解答

作者: 萌小子    时间: 2013-5-17 12:20
本帖最后由 王盟盟 于 2013-5-17 12:50 编辑

  1. <P>//5楼正解啊
  2. import java.util.InputMismatchException;
  3. import java.util.Scanner;</P>
  4. <P>public class time {
  5. public static void main(String[] args) {
  6.   int year = 0;
  7.   Scanner reader;   
  8.   do{
  9.    
  10.    try{
  11.     System.out.println("输入年:");
  12.     reader=new Scanner(System.in);    //放在这里OK了
  13.     year=reader.nextInt();
  14.     }catch (InputMismatchException e) {      
  15.      System.out.println("必须输入数字");
  16.     }
  17.   }while(true);
  18. }
  19. }</P>
复制代码

作者: 萌小子    时间: 2013-5-17 12:33
袁梦希 发表于 2013-5-17 12:18
楼主你好,因为while(true)后面多了个";"号
黑马云青年为您解答

不是的啊,那个分号是语法上要带的
作者: 袁梦希    时间: 2013-5-17 12:34
王盟盟 发表于 2013-5-17 12:33
不是的啊,那个分号是语法上要带的

好的  我打开eclipse调试一下。
作者: 看穿    时间: 2013-5-17 12:43
do-while循环先执行一次循环体 输入非数字捕捉到异常 进入catch块 所以 break没有执行 循环继续。while的条件为真 进入循环体此时scanner因为之前扫描到了错误的非数字而不能继续 所以nextInt方法还是在扫描之前输入的非数字 所以死循环了。只需在catch里将reader = new Scanner(System.in);就可以了
作者: 袁梦希    时间: 2013-5-17 12:51
本帖最后由 袁梦希 于 2013-5-17 12:53 编辑

楼主你好,刚才我目测问题回答错了,我来解释一下,你定义的这个year,定义的year变量是个空的,没有用到
并且你用的是do...while循环,循环的特点是先运行一下do中的语句再进行循环
  1. public class RunDemo {

  2. public static void main(String[] args) {
  3. int year = 0;
  4. Scanner reader = new Scanner(System.in);
  5. do {
  6. try {
  7. System.out.print("输入年:");
  8. year = reader.nextInt();
  9. break;
  10. } catch (InputMismatchException n) {
  11. System.out.println("必须输入数字");
  12. }
  13. } while (false);//我不知道你是为了实现什么效果,我只知道这里的ture,改成false就会停止循环了。
  14. }
  15. }
复制代码
也可以这样实现
  1. public class RunDemo {

  2. public static void main(String[] args) {
  3. int year = 0;
  4. Scanner reader = null;
  5. do {
  6. try {
  7. reader = new Scanner(System.in);
  8. System.out.print("输入年:");
  9. year = reader.nextInt();
  10. break;
  11. } catch (InputMismatchException n) {
  12. System.out.println("必须输入数字");
  13. }
  14. } while (true);
  15. }
  16. }
复制代码
黑马云青年为您解答
作者: 刘正祥    时间: 2013-5-17 13:24
其实while(true)就是一个死循环!
作者: 张甲甲    时间: 2013-5-17 16:47
袁梦希 发表于 2013-5-17 12:51
楼主你好,刚才我目测问题回答错了,我来解释一下,你定义的这个year,定义的year变量是个空的,没有用到
...

谢了 可惜我不能给你加分。。。
作者: 袁梦希    时间: 2013-5-17 16:52
张甲甲 发表于 2013-5-17 16:47
谢了 可惜我不能给你加分。。。

谢谢你了   甲甲  :hug:
作者: 曹睿翔    时间: 2013-5-19 07:53
如果问题已解决请再次编辑,改为以解决,方便大家看帖,没有就继续追问
作者: 杨彬    时间: 2013-5-22 20:14
你while的判断条件是true啊 ,当你输入的不是int型,就会走catch,并输出System.out.println("必须输入数字"); 你的break根本没起作用,应该在catch块中加break
作者: 袁梦希    时间: 2013-5-24 01:37
楼主你好,如果问题以解决,请修改分类,谢谢合作。


作者: 吕振中    时间: 2013-5-24 09:42
路过,这个暂时没咋看懂!
作者: xiewen    时间: 2013-5-24 13:21
你输入的不是int类型的数字,运行进入到了catch块里而没有执行break语句,而且while(true),所以就出现了死循环了。




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2