关于java中的异常(throw和throws的使用以及异常分类)
由于博主总是忘记这方面内容,特开贴记录,如有错漏请多多指正
需要注意的是所有的异常类型都继承自Throwable类型
继承关系如下:
Object
└── Throwable
├── Error
│ ├── OutOfMemoryError
│ ├── StackOverflowError
│ └── ...
└── Exception
├── RuntimeException
│ ├── NullPointerException
│ ├── ArithmeticException
│ └── ...
├── IOException
├── SQLException
└── ...
Exception的分类
RuntimeException:非受检查(unchecked)异常
可以运行,不需要强制处理
- 空指针:NullPointException
- 数值下标越界:ArrayIndexOutOfBoundsException
- 运算异常:ArithmeticException
- 类型转换异常:ClassCastException
Exception:受检查(checked)异常
必须强制处理(Exception)
- IO异常
- 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());
// 可以选择在这里处理非受检查异常
}
// 注意:这里不需要捕获受检查异常,因为它已经被非受检查异常阻止了
}
}

1万+

被折叠的 条评论
为什么被折叠?



