手记

第三季 Exception课后练习——图书管理


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人推荐
随时随地看视频
慕课网APP

热门评论

为什么我的进入了死循环?

定义findByNmae()对象时,System.out.println("馆中有您查找的书\n信息 "+"*书名:"+book.name+" *图书序号:"+book.id); return;运行会有问题

改成System.out.println("馆中有您查找的书\n信息 "+"*书名:"+bookName+" *图书序号:"+bookId);run(); 

查看全部评论