怀旧网个人博客网站地址:怀旧网,博客详情:Java异常详解
一、什么是异常
Java中的异常(Exception)是程序执行过程中可能遇到的问题,它们可以由程序中的错误、逻辑问题或其他外部条件引起。异常通常分为可检查异常(Checked Exception)和运行时异常(Runtime Exception)。以下是详细介绍:
-
可检查异常。这类异常在编译时必须被处理,否则编译器会报错。常见的可检查异常包括文件未找到、网络连接中断、输入格式错误等。这些异常通常表示程序在运行过程中可能出现的外部条件或错误。
-
运行时异常。这类异常在程序运行过程中发生,不需要在代码中显式处理。常见的运行时异常包括空指针异常、数组索引越界异常、算术异常等。这些异常通常表示程序错误或逻辑错误。
在Java中,处理异常的关键字包括try、catch、throw和throws。try语句用来包围可能抛出异常的代码块,catch语句用于捕获并处理这些异常,finally语句用于执行清理操作,无论是否出现异常。throw语句用于在方法内部抛出异常对象,而throws语句用于在方法声明中声明可能抛出的异常类型。
二、异常的体系结构
异常是程序运行过程中出现的错误。本文主要讲授的是Java语言的异常处理。Java语言的异常处理框架, 是Java语言健壮性的一个重要体现。
Java把异常当作对象来处理,并定义一个基类java.lang.Throwable作为所有异常的超类。 在Java API中已经定义了许多异常类,这些异常类分为两大类,错误Error和异常Exception。 Java异常体系结构呈树状,其层次结构图如图
三、Java异常处理机制
Java的异常处理机制是Java语言的重要特性之一,它允许程序在运行时检测并处理异常情况,以保证程序的可靠性和稳定性。Java的异常处理机制主要包括以下几个方面:
-
异常类:Java中定义了一个Exception类和其子类,包括RuntimeException和CheckedException等。当程序出现异常情况时,将会抛出一个异常对象。
-
异常处理:Java提供了try-catch语句和throw语句来捕获和处理异常。try块中抛出异常后,catch块将会捕获该异常并进行处理。
-
异常链:Java中的异常可能会产生异常链,即一个异常由另一个异常所引发而产生。
-
异常处理顺序:当程序产生多个异常时,Java会按照特定的顺序处理这些异常,首先处理Exception及其子类的异常,然后再处理RuntimeException及其子类的异常。
Java的异常处理机制是一种重要的防御性编程手段,能够有效地捕获和处理程序中的异常情况,提高程序的健壮性和可靠行。
四、处理异常
当程序在运行中如果遇到不可预测的问题的时候,可以通过添加tyr-catch-finally 来进行异常检测处理:
public static void main(String[] args){
try{
int a = 10 / 0;
}catch (ArithmeticException e){
e.printStackTrace();
System.out.println("当捕获到异常后执行的代码!");
}finally {
System.out.println("程序结束必须执行的代码!");
}
System.out.println("over!");
}
代码执行运行结果如上,当捕获到异常就会输出catch里面的语句,然后finally的代码也会执行,而且最外边的输出也同样执行了。
当需要捕获多个异常时:
public static void a(){
b();
}
public static void b(){
a();
}
我们调整代码进行异常捕获
public static void main(String[] args){
try{
a();
}catch (ArithmeticException e){
e.printStackTrace();
System.out.println("当捕获到异常后执行的代码!");
}finally {
System.out.println("程序结束必须执行的代码!");
}
System.out.println("over!");
}
同样报错,添加异常捕获catch重试
public static void main(String[] args){
try{
a();
}catch (ArithmeticException e){
e.printStackTrace();
System.out.println("当捕获到异常后执行的代码!");
}catch (StackOverflowError e){
e.printStackTrace();
System.out.println("当捕获到异常后执行的代码1!");
}finally {
System.out.println("程序结束必须执行的代码!");
}
System.out.println("over!");
}
成功捕获异常。
当遇到多个异常时:需要遵守规则-先捕获小异常在捕获大异常否则编译报错
调整位置-可以进行编译
五、自定义异常类
1、创建类 并且继承Exception类
public class MyException extends Exception{
}
2、编写构造方法-和记录错误的属性
public class MyException extends Exception{
public String message;
public MyException(String message) {
this.message = message;
}
}
3、使用-编辑测试方法-用来测试传入年龄是否合法,不合法就抛出错误
public static void test(int age) throws MyException {
if(age < 0 || age > 200){
throw new MyException("年龄不能小于 0 或大于 200");
}
System.out.println("年龄: " + age);
}
4、调用测试
public static void main(String[] args){
try {
test(-10);
} catch (MyException e) {
System.out.println(e.message);
}
}
public static void main(String[] args){
try {
test(-10);
} catch (MyException e) {
System.out.println(e.message);
}
}
成功捕获异常---------------
六、总结
1、处理运行时异常时,采用逻辑去合理规避同时辅助try-catch处理
2、在多重catch块后面,可以加一个catch(Exception)来处理可能会被遗漏的异常
3、对于不确定的代码,也可以加上try-catch,处理潜在的异常
4、尽量去处理异常,切记只是简单的调用printStackTrace()去打印
5、具体如何处理异常,要根据不同的业务需求和异常类型去决定
6、尽量添加finally语句块去释放占用的资源