为了账号安全,请及时绑定邮箱和手机立即绑定

作业问题.当提示输入命令时,输入a(非int类型),就会捕获输入类型错误。按理,它应该能回去循环,重新输入命令,结果它停不下来了。求解

package imooc_java_3_1_9;
import java.util.InputMismatchException;
import java.util.Scanner;
import java.util.*;

/*
 * 1.定义字符串数组保存书籍信息
 * 
 * 2.提示用户输入,分别按“书名”和“图书序号”查找图书
 * 
 * 3.根据输入的信息进行适当的异常处理
 * 	a.如果输入类型错误,抛出“错误命令异常”,并提示重新输入
 * 	b.如果书名不存在,抛出“图书不存在异常”,并提示重新输入
 * 	c.如果图书序号超过字符串数组范围,抛出“图书不存在异常”,并提示重新输入
 */
public class RunThisProject {
	
	//根据书名查找图书
	public void searchAsName ( String bookName,String [] bookInfo) throws Exception {
		int checkIfHave = 0;//用于计数,若存在和书名一样的书则+1
		//遍历图书信息数组,和输入的书名比对,若书名存在,则输出书名,否则抛出“图书不存在”异常
		for(int i = 0; i < bookInfo.length; i++){
			if(bookName.equals(bookInfo[i])){
				System.out.println("book:"+bookInfo[i]);
				checkIfHave ++;
			}
		}
		if(checkIfHave < 1){
			throw new Exception("图书不存在!");
		}
	}
	
	//根据序号查找图书
	public void searchAsNo(int bookNo , String[] bookInfo)throws Exception {
//		如果输入的图书序号小于最小下标0 或 大于最大下标,即超出数组范围,则提示异常“此图书序号不存在”,否则输出序号对应图书名
		if((bookNo < 0)||(bookNo > bookInfo.length )){
			throw new Exception("此图书序号不存在!");
		}else{
			System.out.println("book:"+bookInfo[bookNo]);
		}
	}
	
	public static void main(String[] args) throws Exception  {
		
	String[] bookInfo = new String[]{"高等数学","大学物理","大学英语","软件工程","线性代数"};//用字符串数组存储图书信息
	RunThisProject rtp1 = new RunThisProject();//实例化RunThisProject类的对象,用于调用此类中的方法
	Scanner input = new Scanner(System.in);
	
	
	boolean controler = true;//用于控制循环是否继续
	while(controler){
		System.out.println("请输入命令:1-按照名称查找图书	2-按照图书序号查找图书");
	try{
		int checkWay = 0; //存储用户的选择
		checkWay = input.nextInt();
//		如果选择1-按照名称查找图书
		if(checkWay == 1){
			System.out.println("请输入您要查找的图书名称:");//提醒用户输入
			String bookName;//存储用户输入的书名
			bookName = input.next();//输入书名
			rtp1.searchAsName(bookName, bookInfo);//调用searchAsName方法
		}
		
//		如果选择2-按照图书序号查找图书
		if(checkWay == 2){
			System.out.println("请输入您要查找的图书序号:");//提示用户输入图书序号
			int bookNo = input.nextInt();//输入序号
			rtp1.searchAsNo(bookNo, bookInfo);//调用searchAsNo方法
		}
		controler = false;//若正常执行,无异常,则让controler借书,停止while循环
		
	}catch(InputMismatchException e ){//捕获输入类型不符合的异常
		System.out.println("命令输入错误,请根据提示输入数字命令!");
		
	}catch(Exception e2){//捕获图书检测的异常,此图书不存在 或 此序号不存在 两种异常
		System.out.println(e2.getMessage());
	}
	}
	System.out.println("程序结束了!");
	}
	
}

56c084930001e78004100096.jpg

56c0849300010e2304030370.jpg

附上可能的问题,求解决问题。

When a scanner throws an InputMismatchException, the scanner will not pass the token that caused the exception, so that it may be retrieved or skipped via some other method. 


正在回答

2 回答

把Scanner input=new Scanner(System.in)塞到try的肚子里面去

0 回复 有任何疑惑可以回复我~
#1

l_yanlei 提问者

测试过可行?
2016-02-28 回复 有任何疑惑可以回复我~
#2

慕粉3562401

catch吧
2016-07-19 回复 有任何疑惑可以回复我~

已解决。

0 回复 有任何疑惑可以回复我~
#1

呜拉巴哈哈

请问怎么修改?
2016-02-23 回复 有任何疑惑可以回复我~
#2

l_yanlei 提问者 回复 呜拉巴哈哈

为什么会出现这样的问题?就是异常里所描述的,但Scanner跑出一个InputMismatchException时,Scanner可能会无法正常运作,会一直保持着一开始读进来的“a”,于是不断的报错。那么解决办法就是,让Scanner销毁它现在存储的这个错误的命令(“a”),当它变空了,就能重新读入正确的命令了。而让Scanner销毁当前对象,你只需在跑出错误的时候,补写一句input.next();就好了。不知道我说明白没有- -
2016-02-28 回复 有任何疑惑可以回复我~

举报

0/150
提交
取消

作业问题.当提示输入命令时,输入a(非int类型),就会捕获输入类型错误。按理,它应该能回去循环,重新输入命令,结果它停不下来了。求解

我要回答 关注问题
意见反馈 帮助中心 APP下载
官方微信