老师布置的课后习题,我不按规定的输入整型数字而是输入字符的时候程序陷入死循环怎么解决

来源:1-9 经验总结

泪在笑里哭

2017-04-08 15:30

主类:

package com.imooc.borrowBook;

import java.util.Scanner;

public class BookManager {


public static void main(String[] args) {

// TODO Auto-generated method stub

Scanner in = new Scanner(System.in);

Book books[] = {new Book("高数",1),new Book("JavaEE",2),new Book("Html5",3),

       new Book("数据结构",4),new Book("C++",5),new Book("操作系统",6)};

while(true){

System.out.println("请选择查找方式:");

System.out.println("1.按书名查找图书     2.按序号查找图书    3.退出");

try{

int num = in.nextInt();

if(num==1){

System.out.println("请输入书名:");

String num_1 = in.next();

//boolean name = false;

for(int i=0;i<books.length;i++){

if(num_1.equals(books[i].bookName)){

System.out.println("book:"+books[i].bookName);

//name = true;

}else

throw new NoExistException();

}

}else if(num==2){

System.out.println("请输入书的序号:");

int num_2 = in.nextInt();

//boolean number = false;

for(int i=0;i<books.length;i++){

if(num_2 == books[i].bookNum){

System.out.println("book:"+books[i].bookName);

//number = true;

}else if (num_2>books.length||num_2<=0){

throw new NoExistException();

}

}

}else if(num==3){

System.out.println("欢迎下次再来!");

System.exit(0);

}else 

throw new Exception();

//System.out.println("命令输入错误,请按提示输入!!!");

}

catch(NoExistException e){

//e.printStackTrace();

System.out.println("该图书不存在!");

System.out.println();

}catch(Exception e){

//e.printStackTrace();

System.out.println("命令输入错误,请按提示输入!!!");

System.out.println();

}

}

}

}



书类:

package com.imooc.borrowBook;


public class Book {

public String bookName;

public int bookNum;

public Book(String bookName,int bookNum){

this.bookName = bookName;

this.bookNum = bookNum;

}


}



自定义异常类:

package com.imooc.borrowBook;


public class NoExistException extends Exception {

public NoExistException(){

}

public NoExistException(String message){

super(message);

}


}


写回答 关注

2回答

  • 慕粉4044482
    2017-04-08 17:06:58
    已采纳

    Scanner in = new Scanner(System.in);这句代码应该放在while循环内,因为你放在外面的话每次都会直接使用上次输入的字符串值,放进去的话会重新定义一个in,就不会出现死循环了。

    泪在笑里哭

    非常谢谢你的帮助,完美的帮我解决了问题。

    2017-04-09 09:26:34

    共 1 条回复 >

  • 慕粉0038445131
    2017-04-08 16:09:01

    试了下你的代码确实存在这个问题。想了想应该和c中输入缓冲区不能正常清除的问题是一样的。

    大概原因是当Scanner读入了字符的时候,输入缓冲区中读到的字符没有清除,因此之后的每一次while循环就会默

    认的再次把之前输入的值读一遍,导致无限循环。

    解决的办法很直接,就是把缓冲区中的数据读走(相当于清空),可以在你的第二个catch block中添加一行代码

    in.nextLine();

    这样就可以了。

    慕粉0038... 回复泪在笑里哭

    没关系 问题解决了就好啦

    2017-04-09 21:15:22

    共 2 条回复 >

Java入门第三季

Java中你必须懂得常用技能,不容错过的精彩,快来加入吧

409792 学习 · 4340 问题

查看课程

相似问题