黑马程序员技术交流社区

标题: try..catch 的问题 [打印本页]

作者: 齐国峰    时间: 2011-11-6 17:33
标题: try..catch 的问题
如果我输入一段字母,就会无限循环,大家帮我看看怎么回事,谢谢啦.
  1. import java.util.Scanner;

  2. public class GuessNumber {

  3.         public static void main(String[] args) {
  4.                 int number = (int) (Math.random() * 100 + 1);
  5.                 Scanner input = new Scanner(System.in);
  6.                 System.out.println("猜一个数字,在1到100之内.");
  7.                 for (int i = 0; i < 10; i++) {
  8.                         try {
  9.                                 System.out.println("输入你要猜得数 : ");
  10.                                 int guess = input.nextInt();
  11.                                 if (guess < 1 || guess > 100) {
  12.                                         System.out.println("这个数必须是1到100之内的整数.");
  13.                                         i--;
  14.                                 }
  15.                                 if (guess == number) {
  16.                                         System.out.println("对,这个数字是" + number);
  17.                                         return;
  18.                                 } else if (guess > number)
  19.                                         System.out.println("你猜得数字太大了!");
  20.                                 else
  21.                                         System.out.println("你猜得数字太小了!");
  22.                         } catch (Exception e) {
  23.                                 System.out.println("请输入中文!");
  24.                                 i--;
  25.                         }
  26.                 }
  27.                 System.out.println("10次都没猜中你不适合这个游戏!");
  28.         }

  29. }
复制代码

作者: 高美云    时间: 2011-11-6 18:21
你应该在输入之前判断一下输入的是字符还是整数,而你却在刚开始输入时就设值为整数了,int guess = input.nextInt();然后根据输入的整数就开始判断大小;
你的try,catch根本不对应,所以在catch里面的i--根本不起作用,当输入字符串时,他便会一直catch下去,当时是无限循环了。

作者: olkldksl    时间: 2011-11-6 18:43
本帖最后由 olkldksl 于 2011-11-6 18:47 编辑

scanner在要求用户输入的时候,其实是在内存中创建了一段用于用户输入,我们输入内容等就会存入该段内存。如果输入了非数字,当nextInt()调用时,就不能调出内存中的数据,因为它不是要调用的int类型,这时就会报输入不匹配错误。问题就在这儿,如果nextInt()调用没把该段内存中的东西提出来,他就会一直占用这段内存,导致二次输入时,就不会再要求用户输入了,他会继续试图调用该段内存数值。
而你catch里面的 i-- 会使for循环变成死循环
所以解决办法就是清空该段内存,或者把该段内存中的数值取出。在catch块中使用 next();就可以解决。因为next()是得到字符串所以可以把该段内存中的值取出。


作者: 齐国峰    时间: 2011-11-6 18:45
高美云 发表于 2011-11-6 18:21
你应该在输入之前判断一下输入的是字符还是整数,而你却在刚开始输入时就设值为整数了,int guess = input. ...

谢谢,
但是如果我把i-- 去掉的话,就会循环10次,然后结束.
我还是不太明白它为什么没停.
作者: 高美云    时间: 2011-11-6 18:58
齐国峰 发表于 2011-11-6 18:45
谢谢,
但是如果我把i-- 去掉的话,就会循环10次,然后结束.
我还是不太明白它为什么没停. ...

正解已经被楼上说明了,你可以试试!
作者: 齐国峰    时间: 2011-11-6 19:04
olkldksl 发表于 2011-11-6 18:43
scanner在要求用户输入的时候,其实是在内存中创建了一段用于用户输入,我们输入内容等就会存入该段内存。 ...

谢谢,明白一些啦~~~!
作者: 齐国峰    时间: 2011-11-6 19:04
贺行之 发表于 2011-11-6 18:50
07行的Scanner input = new Scanner(System.in);
将他放入循环内,如第12行,才能达到你想要的效果,不然值会 ...

谢谢,明白了~~~~!
作者: 齐国峰    时间: 2011-11-6 19:05
高美云 发表于 2011-11-6 18:58
正解已经被楼上说明了,你可以试试!

谢谢了,已经明白了.
作者: 刘福双    时间: 2011-11-6 19:11
import java.util.Scanner;

public class qw {

        public static void main(String[] args) {
                int number = (int) (Math.random() * 100 + 1);
                Scanner input = new Scanner(System.in);
                System.out.println("猜一个数字,在1到100之内.");
                try {
                                        for (int i = 0; i < 10; i++) {

                                                System.out.println("输入你要猜得数 : ");
                                                int guess = input.nextInt();
                                                if (guess < 1 || guess > 100) {
                                                        System.out.println("这个数必须是1到100之内的整数.");
                                                        i--;
                                                }
                                                if (guess == number) {
                                                        System.out.println("对,这个数字是" + number);
                                                        break;
                                                } else if (guess > number)
                                                        System.out.println("你猜得数字太大了!");
                                                else
                                                        System.out.println("你猜得数字太小了!");
                                        }
                                } catch (Exception e) {
                                        // TODO: handle exception
                                }
                //System.out.println("10次都没猜中你不适合这个游戏!");
        }

}
这是我改完的  :
1、try块里面包含for{}循环
2、如果相等break跳出循环




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