菜鸡的Java学习笔记——异常和异常处理

# Java学习笔记——异常和异常处理

  • Throwable:Error,Exception
  • Exception:RuntimeException(非检查异常),检查异常
  • RuntimeException:NullPointerException(空指针异常),ArrayIndexOutOfBoundsException(数组下标越界异常),ClassCastException(类型转换异常),ArithmeticException(算数异常)
  • 检查异常:IOException(文件异常),SQL异常(SQLException),需要手动添加捕获以及处理语句。

## 处理异常

try-catch

try{
    //一些会抛出异常的方法
}catch(Exception e){
    //处理该异常的代码块
}

如果抛出异常,则终止程序,程序的控制权将被转移交给catch块中的异常处理程序,可以发出警告,也可以进行错误日志记录,下面的例子对错误进行警告处理

try{
    System.out.print("请输入您的年龄:");
    Scanner input = new Scanner(System.in);
    int age = input.nextInt();
    System.out.println("十年后您" + (age + 10) + "岁");
}catch(InputMismatchException e){
    System.out.println("请输入整数!");
}
System.out.println("谢谢使用!");

输入小数,运行结果

image.png

如果抛出很多类型的异常,需要用到多重catch块

try{
    //一些会抛出异常的方法
}catch(Exception e){
    //处理异常Exception的方法
}catch(Exception2 e){
    //处理异常Exception2的方法
}...(n个catch)...{

}

下面的例子可能出现两种异常,针对每种异常分别处理

try{
    Scanner input = new Scanner(System.in);
    System.out.print("请输入第一个数:");
    int a = input.nextInt();
    System.out.print("请输入第二个数:");
    int b = input.nextInt();
    System.out.println("两数相除结果是:" + a / b);
}catch(InputMismatchException e){
    //e.printStackTrace();//打印异常
    System.out.println("请输入整数!");
}catch(ArithmeticException e){
    System.out.println("除数不能为0!");
}

运行结果

image.png

image.png

在catch异常时,要按照子类-父类的顺序进行检测,在上面的例子中,InputMismatchException异常必须在ArithmeticException异常的前面,否则编译器会报错

try-catch-finaly

用于最终将要执行的代码,进行“善后工作”

try{
    //一些会抛出异常的方法
}catch(Exception e){
    //处理异常Exception的方法
}catch(Exception2 e){
    //处理异常Exception2的方法
}...(n个catch)...{

}finally{
    //最终要执行的一些代码
}

## 异常抛出

throw——将产生的异常抛出(动作)
throws——声明将要抛出何种类型的异常(声明)

public void divide(int a, int b) throws Exception{
    if(b == 0)//出现异常
        throw new Exception("除数不能为0!");//向上级报告
    else
        System.out.println("相除结果为:" + a /b);
}

## 自定义异常

借助于Java现存的异常类型,例如Exception,自定义异常要继承Exception类或者其子类 public class 异常名 extends Exception

例子:在图书查询系统中,若查询的书不存在,则出现BooknotExistException异常,定义方法如下

public class BooknotExistException extends Exception{
    public BooknotExistException(){
        super("图书不存在!");
    }
}
//异常检测中输出错误信息

catch(BooknotExistException e){
            System.out.println(e.getMessage());

## 图书查询系统文件代码

//自定义异常
public class BooknotExistException extends Exception{
    public BooknotExistException(){
        super("图书不存在!");
    }
}

//自定义异常
public class ErrorCommandException extends Exception{
    public ErrorCommandException(){
        super("命令输入错误,请根据提示输入命令!");
    }
}



import java.util.InputMismatchException;
import java.util.Scanner;

public class SearchBook{

    String[] Book={"数据结构","大学物理"};
    Scanner input = new Scanner(System.in);
    int command;
    String name;
    int num;

    public static void main(String[] args) {
        while(true){
            SearchBook searchBook = new SearchBook();
            searchBook.inputCommand();
            if(searchBook.command == 1)
                searchBook.inputName();
            else if(searchBook.command == 2)
                searchBook.inputNumber();
            else if(searchBook.command == 0)
                break;
        }
    }

    public void inputCommand(){
        try{
            System.out.println("输入命令:1-按照名称查找图书,2-按照序号查找图书,0-结束查询");
            command = input.nextInt();
            if(command != 1 && command != 2 && command !=0){
                throw new ErrorCommandException();
            }
        }catch(InputMismatchException e1){
            ErrorCommandException ee = new ErrorCommandException();
            System.out.println(ee.getMessage());
        } catch(ErrorCommandException e){
            System.out.println(e.getMessage());
        }
    }

    public void inputName(){
        try{
            System.out.println("输入图书名称:");
            name = input.next();
            for(int i = 0; i < Book.length; i++){
                if(Book[i].equals(name)){
                    System.out.println("book:" + Book[i]);
                    return;
                }
            }
            throw new BooknotExistException();
        }catch(BooknotExistException e){
            System.out.println(e.getMessage());
        }
    }

    public void inputNumber(){
        try{
            System.out.println("输入图书序号:");
            num = input.nextInt();
            if(num > 2 ){
                throw new BooknotExistException();
            }
            System.out.println("book:" + Book[num - 1]);
        }catch(InputMismatchException e1){
            input.nextLine();
            ErrorCommandException ee = new ErrorCommandException();
            System.out.println(ee.getMessage());
        }catch(BooknotExistException e2){
            System.out.println(e2.getMessage());
        }
    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值