对原程序功能进行了简化,不需要用户说明输入的是序号还是书名,程序可以自动判断^-^
先说一下原理。两种搜索途径参数是不同的,实现的方法也是不同的,所以不能混合在一起,还是作为两种独立的方法存在,这样修改起来也比较简单,那么关键就在于根据输入的信息判断搜索方法。
选择路径还是作为一个单独的方法来使用,只不过判断条件不再相同。我选择的判断条件是是否可以将输入信息转换为int类型,可以转换就使用序号查找,否则调用名称查找。
try…catch有点类似if…else,不同的是try…catch判断的是语句是否出错。在try块中放入一个可能出错的语句,如果该语句没有错误,程序就会继续运行try块中剩下的内容,否则会被对应的catch捕获,运行catch中的内容。所以Integer.parseInt();就是判断语句
下边是代码
主程序改了下名字
import java.util.*;
public class TestLendBookPlus
{
public static void main(String[] args)
{
LendBook lb=new LendBook();
lb.initialBook();//初始化书籍信息
lb.checkBook();//找书
}
}
借书系统,主要更改了路径选择方法
class LendBook
{
private String[] books=new String[4];
private String road;//存储从控制台输入的信息,用来判断搜索方法,并作为搜索参数
//初始化书籍
void initialBook(){
books[0]="西游记";
books[1]="三国演义";
books[2]="水浒传";
books[3]="红楼梦";
}
//找书总程序,在这里调用不同的找书途径,自定义异常在这里catch
void checkBook(){
Scanner in=new Scanner(System.in);
System.out.println("输入书名或者序号查找书籍:");
try{
road=in.next();
if(checkKind())numCheck();//road可以转换为数字
else nameCheck();//road不能转换为数字
}catch(BookException e){//捕获书籍不存在异常,输出信息
System.out.println("图书不存在");
checkBook();//重新调用找书程序
}
}
//根据输入数据判断使用何种搜索方式
boolean checkKind(){
try{
int i=Integer.parseInt(road);
return true;//返回值为true说明转换成功,意味着数字搜索
}catch(Exception e){
return false;//返回值为false说明转换出错,使用名称搜索
}
}
//通过名称查找书籍
void nameCheck()throws BookException{
String name=road;
for(String book:books){
if(book.equals(name)){
System.out.println("book: "+name);
return;//如果找到匹配项则直接返回
}
}
throw new BookException();//for循环结束还没找到,抛出异常
}
//通过序号查找异常
void numCheck()throws BookException{
int num=Integer.parseInt(road);
if(num>0 && num<5)
System.out.println("book: "+books[num-1]);
else throw new BookException();//序号超出范围,输出异常
}
}
自定义异常现在只需要一个就够了
//图书不存在异常
class BookException extends Exception
{
BookException(){super();}
}