关于java中的异常(throw和throws的使用以及异常分类)

关于java中的异常(throw和throws的使用以及异常分类)

由于博主总是忘记这方面内容,特开贴记录,如有错漏请多多指正

需要注意的是所有的异常类型都继承自Throwable类型
继承关系如下:

Object
  └── Throwable
       ├── Error
       │     ├── OutOfMemoryError
       │     ├── StackOverflowError
       │     └── ...
       └── Exception
             ├── RuntimeException
             │       ├── NullPointerException
             │       ├── ArithmeticException
             │       └── ...
             ├── IOException
             ├── SQLException
             └── ...

Exception的分类

RuntimeException:非受检查(unchecked)异常

可以运行,不需要强制处理

  1. 空指针:NullPointException
  2. 数值下标越界:ArrayIndexOutOfBoundsException
  3. 运算异常:ArithmeticException
  4. 类型转换异常:ClassCastException

Exception:受检查(checked)异常

必须强制处理(Exception)

  1. IO异常
  2. sql异常

throw和throws

throw

throw 是一个语句,用于在代码中显式抛出一个异常。
它后面跟着的是你想要抛出的异常实例。
throw 可以用来抛出任何类型的 Throwable 对象,包括错误(Error)和异常(Exception)。
throw 可以用于抛出预定义的异常,也可以用于抛出自定义异常。(不一定要处理)

    public static void divide(int a, int b) {
        if(b == 0)
            throw new ArithmeticException("除数不能为0"); // 简单举例
        System.out.println(a/b);
    }

throws

throws 是一个关键字,用于在方法签名中声明该方法可能会抛出的异常。
方法通过 throws 关键字告诉调用者,它可能会抛出指定的异常类型。
throws 后面跟着的是异常类型的列表,这些异常类型都是 Exception 的子类,但不包括 RuntimeException 及其子类。
使用 throws 声明的异常,调用者必须处理,要么通过 try-catch 语句捕获,要么通过在调用者的方法签名中使用 throws 继续声明。

    public static void calc() throws Exception {
        System.out.println(5/0);
    }

自定义异常示例

InvalidTransactionException extends Exception (这是一个自定义异常)

    public Transaction(String date, String type, double amount, String note) throws InvalidTransactionException {
        if(amount <= 0) throw new InvalidTransactionException("Invalid amount: " + amount);

        this.date = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss z",Locale.CHINA);
        this.type = type;
        this.amount = amount;
        this.note = note;
    }
    
    public class InvalidTransactionException extends Exception { //这是一个自定义异常
    // 无参构造函数
    public InvalidTransactionException() {
        super();
    }

用非受检查(unchecked)异常阻止受检查(checked)异常强制处理

在Java中,可以通过在方法内部捕获受检查异常,并在捕获后抛出一个非受检查异常来实现用非受检查(unchecked)异常阻止受检查(checked)异常强制处理。这样,调用者就不需要显式地处理受检查异常,因为非受检查异常会阻止受检查异常的传播。

public class ExceptionHandlingExample {

    // 该方法声明抛出受检查异常
    public void methodThatThrowsCheckedException() throws Exception {
        // 模拟抛出受检查异常
        throw new Exception("这是一个受检查异常");
    }

    // 该方法使用非受检查异常来阻止受检查异常的传播
    public void methodThatPreventsCheckedException() {
        try {
            methodThatThrowsCheckedException();
        } catch (Exception e) {
            // 捕获受检查异常,并抛出非受检查异常
            throw new RuntimeException("非受检查异常阻止了受检查异常", e);
        }
    }

    public static void main(String[] args) {
        ExceptionHandlingExample example = new ExceptionHandlingExample();

        try {
            example.methodThatPreventsCheckedException();
        } catch (RuntimeException e) {
            System.out.println("捕获到非受检查异常:" + e.getMessage());
            // 可以选择在这里处理非受检查异常
        }
        // 注意:这里不需要捕获受检查异常,因为它已经被非受检查异常阻止了
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值