package try_catch;
import java.util.Scanner;
public class TryCatchPractice2 {
//在类开始声明,则其他方法都能调用
Scanner in=new Scanner(System.in);
NoBookException NoB=new NoBookException();
String[] books={"语文","数学","英语"};
static TryCatchPractice2 trycat=new TryCatchPractice2();
//主函数
public static void main(String[]args) throws Exception{
trycat.InputClassException();
}
//命令错误
public void InputClassException()throws Exception{
try{
System.out.println("欢迎光临本图书管理系统");
System.out.println("1.书名查询。2.序号查询");
int a=in.nextInt();
switch(a){
case 1: //查找图书
trycat.findBooks();
break;
case 2://查找序号
trycat.findBooksNum();
break;
default:
throw new NoBookException("错误命令,请输入整数1或2");//如果输入数字非1,2则抛出
}
}catch(NoBookException e){
// InputMismatchException InE=new InputMismatchException();
// InE.initCause(e);
// 求教如何在扫描仪我输入非int型时会提示错误命令,例如a
e.printStackTrace();
System.out.println("请重新输入:");
InputClassException();
}catch(Exception e){
backRoll();
}
}
//当输入值为非整数时,调用此方法//不要问我为什么另外新建一个方法,只是因为提示变红字
public void backRoll() throws Exception{
try{
throw new Exception("错误命令,请输入整数");
}catch(Exception e){
e.printStackTrace();
in.next();
System.out.println("请重新输入:");
InputClassException();
}
}
//查找图书
public void findBooks()throws Exception{
System.out.println("请输入您要查询的图书:");
String b=in.next();
boolean flag=false;
try{
for(int i=0;i<books.length;i++){
if(b.equals(books[i])){//如果查询的书名不为空,输出书本信息
System.out.println("查询成功"+books[i]);
flag=true;
}
}
while(flag==false){//如果查询为空,抛出异常
throw new NoBookException("图书不存在");
}
}catch(NoBookException e){
e.printStackTrace();//捕捉到异常后输出异常位置
NoB.initCause(e);
System.out.println("请重新输入:");
InputClassException();//重新进入系统
}
}
//查找序号
public void findBooksNum()throws Exception{
System.out.println("请输入您要借阅的图书序号:");
int i=in.nextInt();
try{
if(i<books.length&&i>=0){//如果查询的序号不越界,输出书本信息
System.out.println("查询成功");
System.out.println("您查询的是"+books[i]);
}else{//越界则抛出数组越界异常
throw new NoBookException("序号错误");
}
}catch(NoBookException e){
e.printStackTrace();//捕捉到异常后输出异常位置
NoB.initCause(e);
System.out.println("请重新输入:");
InputClassException();//重新进入系统
}
}
//in.close();//为什么这里打in.close.关闭扫描仪会报错
}
代码没有用代码语言格式上传确实有点阅读困难,没有全部仔细看完实在不好意思。但是我个人也遇到类似问题,查了相关资料有些见解,希望能够解答你的问题。
首先,Scanner对象在关闭时,也会自动调用它的输入流进行关闭,也就是scanner.close()的时候,会导致System.in的关闭。所以scanner不能再次获取输入。所以建议是:全局使用一个scanner对象,并且只在整个程序运行结束的时候只关闭一次scanner。
具体的可以参考这篇博客,我觉得记载得很详细。scanner注意要项