作业。scanner怎么不能关闭

来源:1-9 经验总结

每天学一点明天会更好

2019-01-07 21:30

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.关闭扫描仪会报错

}



写回答 关注

1回答

  • 向远之航
    2019-05-16 14:59:47

    代码没有用代码语言格式上传确实有点阅读困难,没有全部仔细看完实在不好意思。但是我个人也遇到类似问题,查了相关资料有些见解,希望能够解答你的问题。

    首先,Scanner对象在关闭时,也会自动调用它的输入流进行关闭,也就是scanner.close()的时候,会导致System.in的关闭。所以scanner不能再次获取输入。所以建议是:全局使用一个scanner对象,并且只在整个程序运行结束的时候只关闭一次scanner。

    具体的可以参考这篇博客,我觉得记载得很详细。scanner注意要项

Java入门第三季

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

409792 学习 · 4340 问题

查看课程

相似问题