主类:
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);
}
}
Scanner in = new Scanner(System.in);这句代码应该放在while循环内,因为你放在外面的话每次都会直接使用上次输入的字符串值,放进去的话会重新定义一个in,就不会出现死循环了。
试了下你的代码确实存在这个问题。想了想应该和c中输入缓冲区不能正常清除的问题是一样的。
大概原因是当Scanner读入了字符的时候,输入缓冲区中读到的字符没有清除,因此之后的每一次while循环就会默
认的再次把之前输入的值读一遍,导致无限循环。
解决的办法很直接,就是把缓冲区中的数据读走(相当于清空),可以在你的第二个catch block中添加一行代码
in.nextLine();
这样就可以了。