Book类
package imooc.com;
/*1.创建Book类,定义Book属性id、name,便于创建Book数组以及打印时能够输出所有属性
*/
public class Book {
//定义Book属性id、name
public String name;
public int id;
/*
* 定义Book类有参构造方法:构造方法有一个用途就是传参数,如果声明了参数,
* 那么在实例化对象的时候,可以将参数传过来。因为实例化对象必须要用到构造方法。
* 类名 对象名 = new 构造方法(参数);
* 过程就是:实例化对象调用构造方法,并且传入参数构造方法内this对传入的
* 参数id、name进行为属性赋值
*/
public Book(int id,String name){
this.id=id;
this.name=name;
}
}
测试类-BookSystemTest
package imooc.com;
import java.util.Scanner;//导入Scanner包,来获取用户输入的值
/*
* 用户会进行3个输入选择:①查询书的方式(序号/书名);②按书名查询时输入书名;③按序号查询时输入序号;所以把这三个输入选择写成3个方法;方便修改及理清逻辑。
* 1.查询书的方式(序号/书名)的chose()方法;
* 2.按书名查询时输入书名的findByName()方法;
* 3.按序号查询时输入序号的findById()方法;
* 程序逻辑过程:选择查询书籍的方式chose()(正确)输入书名或序号findByName()/findById()
* (书名或序号不正确)
* (方式不正确)
*
* 上述逻辑过程存在一个问题:如果输入的方式、书名、序号不正确,直接调用chose方法,chose方法在发生异常的catch块中再调用chose方法?
* 那chose方法执行完后,那剩下的输入书名和序号两个方法怎么执行?这样会逻辑混乱,过程存在缺陷,无法完成。所以我这里再定义一个把上面3个方法组合起来运行的方法run()
* 这样的好处是:出现输入错误,catch到Exception后直接调用run()方法,从头来过。那直接用main方法不行吗?不行,main方法是程序入口不能调用 。
*
* 4.Book类数组:
* 创建长度为2的Book数组:Book[] bookShop=new Book[2];等同于Book bookShop[]=new Book[2];
* 对数组元素赋值:bookShop[0]=new Book(参数1);
* bookShop[1]=new Book(参数2);
* 上面的过程连起来 : Book[] bookShop ={new Book(参数1),new Book(参数2)}
*
* 5.判断用户输入的书名和序号是不是Book数组里的
* ①可以用for或者foreach进行数组遍历;
* ②用户输入的书名或序号在数组内存在,直接Return。数组遍历完后没有相等的,则抛出异常;
* 判断相等:String要用equals,int可以用==;
*/
public class BookSystemTest {
static int chose1;//查询方式(书名or序号)
static String bookName;//用户选书名查询后输入的书名
static int bookId;//用户选序号查询后输入的序号
Book[] bookShop={new Book(1,"物理"),new Book(2,"化学"),new Book(3,"语文"),new Book(4,"英语"),new Book(5,"数学"),new Book(6,"历史"),new Book(7,"地理"),new Book(8,"政治")};
/**
* @throws Exception
*
*/
//由于main方法调用会抛出异常的run()方法,所以需要声明抛出异常。但实际上异常部分不需要main方法处理,在run()会处理完成;
public static void main(String[] args)throws Exception {
BookSystemTest test=new BookSystemTest();
test.run(); //调用非静态run()
}
//**将3各方法按条件进行组合,因调用的3个方法会抛出异常,需要声明throws Exception
public void run()throws Exception{
chose();//查询书的方式
//按书名进行查询
if(chose1==1){
findByNmae();
}
//按书的序号进行查询
if(chose1==2){
findById();
}
}
//查书的方式,catch块中调用了run(),声明会抛出异常,同时方法内对异常进行处理
public void chose()throws Exception{
try{
System.out.println("请输入选书命令:1-按名称查找 2-按序号查找");
Scanner input1=new Scanner(System.in);
chose1=input1.nextInt();//获取用户查找方式并保存在变量chose1
if(chose1!=1&chose1!=2) {
throw new Exception();//查询方式输入错误,抛出异常
}
}catch(Exception e){//捕获抛出的异常,并进行处理(打印异常信息,调用run()方法)
System.out.println("命令输入错误,请根据提示输入数字命令");
run();
}
}
//**按名字进行选书,catch块中调用了run(),声明会抛出异常,同时方法内对异常进行处理
public void findByNmae()throws Exception{
try{
System.out.println("请输入图书名称:");
Scanner input2=new Scanner(System.in);
bookName=input2.next();//获取用户输入的书名
for(Book book:bookShop ){//foreach遍历数组,如果找到与输入的书名相等的,return;遍历完Book数组没找到,抛出异常
if(book.name.equals(bookName)){
System.out.println("馆中有您查找的书\n信息 "+"*书名:"+book.name+" *图书序号:"+book.id);
return;
}
}
//遍历完Book数组没找到与输入值相等的,抛出异常
throw new Exception();
}catch(Exception e){//捕获抛出的异常,并进行处理(打印异常信息,调用run()方法)
System.out.println("您查找的图书不存在");
run();
}
}
//**按序号进行选书,catch块中调用了run(),声明会抛出异常,同时方法内对异常进行处理
public void findById()throws Exception{
try{
System.out.println("请输入图书序号:");
Scanner input3=new Scanner(System.in);
bookId=input3.nextInt();//获取用户输入的序号
for(Book book:bookShop ){//foreach遍历数组,如果找到与输入的序号相等的,return;遍历完Book数组没找到,抛出异常
if(book.id==bookId){
System.out.println("馆中有您查找的书\n信息 "+"*书名:"+book.name+" *图书序号:"+book.id);
return;
}
}
//遍历完Book数组没找到与输入值相等的,抛出异常
throw new Exception();
}catch(Exception e){
System.out.println("您查找的图书不存在");
run();
}
}
}
点击查看更多内容
47人点赞
评论
共同学习,写下你的评论
评论加载中...
作者其他优质文章
正在加载中
感谢您的支持,我会继续努力的~
扫码打赏,你说多少就多少
赞赏金额会直接到老师账户
支付方式
打开微信扫一扫,即可进行扫码打赏哦