手记

在while循环中的try-catch语句,输入类型不匹配后为何会陷入死循环?

package 模拟借书系统;
import java.util.Scanner;
import java.util.InputMismatchException; 
public class rendBook {

    public static void main(String[] args) {
        // TODO Auto-generated method stub
       String[] book={"语文","数学","英语","政治","历史","地理"};
       Scanner input=new Scanner(System.in);
       boolean x=true;
       do{
           System.out.println("请输入命令:1-按照名称查找图书;2-按照序号查找图书");
           try{
               int order=input.nextInt(); 
               if(order==1){
                   System.out.println("请输入图书名称:");
                   String s1=input.next();
                   System.out.println(s1);
                   for(int i=0;i<book.length;i++){
                       if(book[i].equals(s1)){
                           System.out.println("有这本书:"+book[i]);
                           break;
                       }    
                       if(i==book.length-1)
                           System.out.println("图书不存在!");
                   }

               }
               else{
                   System.out.println("请输入图书序号:");
                   int num=input.nextInt();
                   if(num>book.length){
                       System.out.println("图书不存在!");       
                   }
                   else{
                       System.out.println("有这本书:"+book[num-1]);
                   }
               }
             break;  
           }
           catch(InputMismatchException e){
            System.out.println("输入有误,请重新输入!");
           }   
       }while(x);

       }

}

运行情况:
请输入命令:1-按照名称查找图书;2-按照序号查找图书
输入:a //类型不匹配,抛出异常!
//就会陷入如下死循环,很明显再次循环时,程序只执行了catch语句,而没有执行try
输入有误,请重新输入!
请输入命令:1-按照名称查找图书;2-按照序号查找图书
输入有误,请重新输入!
请输入命令:1-按照名称查找图书;2-按照序号查找图书

求高手解答

1人推荐
随时随地看视频
慕课网APP

热门评论

是由于input是全局的,把Scanner sc = new Scanner(System.in);放在do后面就可以了,我的就是这样修正的,因为如果放在里面就会重新创建一个对象,上次输入的不规范字符就不会保存下来,那么就不会死循环了

小白瞎BB 高手无视

try在无异常的情况下,是不会触发catch的。(废话)

但是一旦触发了异常,try本身就再也不会执行了,try就默认触发异常,随后就直接执行catch(类似:一朝被蛇咬十年怕井绳)。在循环里触发了异常,就会不断发出错误的报告。


System.out.println("输入有误,请重新输入!");

break;

后面加个break;退出循环?

查看全部评论