作業(yè)。scanner怎么不能關(guān)閉
package try_catch;
import java.util.Scanner;
public class TryCatchPractice2 {
//在類開始聲明,則其他方法都能調(diào)用
Scanner in=new Scanner(System.in);
NoBookException NoB=new NoBookException();
String[] books={"語文","數(shù)學(xué)","英語"};
static TryCatchPractice2 trycat=new TryCatchPractice2();
//主函數(shù)
public static void main(String[]args) throws Exception{
trycat.InputClassException();
}
//命令錯誤
public void InputClassException()throws Exception{
????try{
????????System.out.println("歡迎光臨本圖書管理系統(tǒng)");
????????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("錯誤命令,請輸入整數(shù)1或2");//如果輸入數(shù)字非1,2則拋出
???????????}
????}catch(NoBookException e){
// InputMismatchException InE=new InputMismatchException();
// InE.initCause(e);
// 求教如何在掃描儀我輸入非int型時會提示錯誤命令,例如a
????????e.printStackTrace();
????????System.out.println("請重新輸入:");
????????InputClassException();
????}catch(Exception e){
????????backRoll();
????}
????}
//當(dāng)輸入值為非整數(shù)時,調(diào)用此方法//不要問我為什么另外新建一個方法,只是因為提示變紅字
public void backRoll() throws Exception{
???? try{
???????? throw new Exception("錯誤命令,請輸入整數(shù)");
???? }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){//如果查詢?yōu)榭?,拋出異?/p>
????????????throw new NoBookException("圖書不存在");
????????????}
????}catch(NoBookException e){
????????e.printStackTrace();//捕捉到異常后輸出異常位置
????????NoB.initCause(e);
????????System.out.println("請重新輸入:");
????????InputClassException();//重新進入系統(tǒng)
????}
}
//查找序號
????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{//越界則拋出數(shù)組越界異常
???????????? throw new NoBookException("序號錯誤");
???????? }
???? }catch(NoBookException e){
???????? e.printStackTrace();//捕捉到異常后輸出異常位置
???????? NoB.initCause(e);
???????? System.out.println("請重新輸入:");
???????? InputClassException();//重新進入系統(tǒng)
???? }
????}
//in.close();//為什么這里打in.close.關(guān)閉掃描儀會報錯
}
2019-05-16
代碼沒有用代碼語言格式上傳確實有點閱讀困難,沒有全部仔細看完實在不好意思。但是我個人也遇到類似問題,查了相關(guān)資料有些見解,希望能夠解答你的問題。
首先,Scanner對象在關(guān)閉時,也會自動調(diào)用它的輸入流進行關(guān)閉,也就是scanner.close()的時候,會導(dǎo)致System.in的關(guān)閉。所以scanner不能再次獲取輸入。所以建議是:全局使用一個scanner對象,并且只在整個程序運行結(jié)束的時候只關(guān)閉一次scanner。
具體的可以參考這篇博客,我覺得記載得很詳細。scanner注意要項