你真的了解异常处理吗?遇到错误不慌,学会这些技巧才能游刃有余!
开篇语
哈喽,各位小伙伴们,你们好呀,我是喵手。运营社区:C站/掘金/腾讯云/阿里云/华为云/51CTO;欢迎大家常来逛逛
今天我要给大家分享一些自己日常学习到的一些知识点,并以文字的形式跟大家一起交流,互相学习,一个人虽可以走的更快,但一群人可以走的更远。
我是一名后端开发爱好者,工作日常接触到最多的就是Java语言啦,所以我都尽量抽业余时间把自己所学到所会的,通过文章的形式进行输出,希望以这种方式帮助到更多的初学者或者想入门的小伙伴们,同时也能对自己的技术进行沉淀,加以复盘,查缺补漏。
小伙伴们在批阅的过程中,如果觉得文章不错,欢迎点赞、收藏、关注哦。三连即是对作者我写作道路上最好的鼓励与支持!
前言
在我们日常编程中,错误是不可避免的!它们像“程序中的小魔鬼”,时刻准备跳出来捣乱。但不要担心,亲爱的开发者们,错误虽然可怕,却也可以被掌控。通过良好的异常处理,我们不仅能保证程序的稳定性,还能让用户体验更加友好。
在这篇文章中,我们将带你深入了解异常的概念与分类,掌握如何使用try-catch-finally块来捕捉并处理异常,同时了解自定义异常以及异常链的神奇世界。看完这篇文章,你再也不用担心代码中的“错误小怪兽”啦!
目录:
- 异常的概念与分类(Checked、Unchecked)
- try-catch-finally块
- 自定义异常
- 异常链与堆栈跟踪
1. 异常的概念与分类(Checked、Unchecked)
在程序运行过程中,可能会发生各种错误,比如输入不合法、资源不可用、数据处理异常等。这些错误通常被称为异常。但是,异常并不是一种“坏事”,它反而是程序的一种正常现象——它帮助我们发现问题并加以处理。
1.1 Checked 异常
所谓的Checked异常,是指那些在编译时就能检测到的异常。它们通常是由于外部因素(比如文件读写、网络连接、数据库操作等)导致的。对于这种类型的异常,Java编译器要求你在代码中显式地进行异常处理,否则会报错。
例如,文件操作时,如果文件不存在,就会抛出FileNotFoundException
,这是一个典型的Checked异常。我们必须要使用try-catch
语句捕捉并处理。
import java.io.File;
import java.io.FileNotFoundException;
import java.util.Scanner;
public class CheckedExceptionDemo {
public static void main(String[] args) {
try {
File file = new File("nonexistentfile.txt");
Scanner scanner = new Scanner(file);
} catch (FileNotFoundException e) {
System.out.println("文件未找到!请检查路径是否正确。");
}
}
}
1.2 Unchecked 异常
与Checked异常相对的,是Unchecked异常,这些异常一般是在程序运行时出现的错误,如数组下标越界、空指针访问等。它们通常继承自RuntimeException
类。虽然Unchecked异常也是错误,但编译器并不强制要求我们在代码中进行显式的异常处理,程序在运行时出现这些异常时会直接抛出。
比如下面这个例子,数组越界就是一个常见的Unchecked异常:
public class UncheckedExceptionDemo {
public static void main(String[] args) {
int[] arr = {1, 2, 3};
System.out.println(arr[5]); // 这里会抛出ArrayIndexOutOfBoundsException异常
}
}
2. try-catch-finally块
接下来,我们来聊聊异常处理的常见工具——try-catch-finally
块。通过这个结构,我们可以捕捉程序中的异常并处理它,让程序在面对异常时不至于崩溃。
2.1 try块
try
块用于包裹可能发生异常的代码。如果代码中出现了异常,程序会跳出当前try
块并进入catch
块。
try {
int result = 10 / 0; // 这里会抛出ArithmeticException
} catch (ArithmeticException e) {
System.out.println("除数不能为零!");
}
2.2 catch块
catch
块用于捕捉try
块中抛出的异常,并处理它。可以有多个catch
块来处理不同类型的异常。
try {
String s = null;
System.out.println(s.length()); // 会抛出NullPointerException
} catch (NullPointerException e) {
System.out.println("不能对空对象调用方法!");
}
2.3 finally块
finally
块是在try-catch
语句之后执行的,不管是否发生异常,finally
块中的代码都会执行。通常,finally
块用于释放资源,比如关闭文件流、数据库连接等。
public class FinallyDemo {
public static void main(String[] args) {
try {
int[] arr = {1, 2};
System.out.println(arr[3]); // 这里会抛出ArrayIndexOutOfBoundsException
} catch (ArrayIndexOutOfBoundsException e) {
System.out.println("数组下标越界!");
} finally {
System.out.println("执行完毕,清理资源!");
}
}
}
3. 自定义异常
有时,程序中会出现一些业务相关的异常,这些异常是系统默认的异常类无法满足的。这个时候,你就可以自定义异常类。自定义异常类需要继承自Exception
(或者RuntimeException
,如果你想要它是Checked异常或Unchecked异常)。
3.1 自定义Checked异常
class InvalidAgeException extends Exception {
public InvalidAgeException(String message) {
super(message);
}
}
public class CustomCheckedExceptionDemo {
public static void main(String[] args) {
try {
throw new InvalidAgeException("年龄不能小于18岁!");
} catch (InvalidAgeException e) {
System.out.println(e.getMessage());
}
}
}
3.2 自定义Unchecked异常
class NegativeValueException extends RuntimeException {
public NegativeValueException(String message) {
super(message);
}
}
public class CustomUncheckedExceptionDemo {
public static void main(String[] args) {
throw new NegativeValueException("不能传递负值!");
}
}
4. 异常链与堆栈跟踪
在复杂的程序中,异常可能会在多个层次传递,我们称这种现象为异常链。通过异常链,我们可以追踪异常发生的根源,便于调试和定位问题。
4.1 异常链
Java允许将一个异常作为另一个异常的原因(通过Throwable
类的构造方法传递),从而形成异常链。通过这种方式,我们可以捕捉到多个层次的异常信息。
public class ExceptionChainDemo {
public static void main(String[] args) {
try {
try {
throw new IllegalArgumentException("参数无效");
} catch (IllegalArgumentException e) {
throw new RuntimeException("运行时异常", e); // 抛出新的异常,并将原始异常作为原因
}
} catch (RuntimeException e) {
System.out.println("捕获到异常:" + e.getMessage());
e.printStackTrace(); // 打印堆栈跟踪
}
}
}
4.2 堆栈跟踪
堆栈跟踪(stack trace)是异常发生时,系统自动记录的调用链信息。它展示了异常发生的具体位置以及异常传播的路径。通过堆栈跟踪,你可以轻松定位问题所在。
try {
int[] arr = {1};
System.out.println(arr[2]); // 这会抛出数组下标越界异常
} catch (Exception e) {
e.printStackTrace(); // 打印堆栈跟踪
}
总结
异常处理是程序设计中非常重要的一部分,掌握了正确的异常处理技巧,不仅能让你的代码更健壮,还能让你在面对bug时更加从容不迫。通过合理使用try-catch-finally
块,灵活自定义异常,善用异常链与堆栈跟踪,你会发现编写稳定、可维护的代码其实是很有趣的事。
所以,下次当你遇到异常时,记得要冷静对待,运用这些技巧,像个编程高手一样轻松解决问题!🚀
… …
文末
好啦,以上就是我这期的全部内容,如果有任何疑问,欢迎下方留言哦,咱们下期见。
… …
学习不分先后,知识不分多少;事无巨细,当以虚心求教;三人行,必有我师焉!!!
wished for you successed !!!
⭐️若喜欢我,就请关注我叭。
⭐️若对您有用,就请点赞叭。
⭐️若有疑问,就请评论留言告诉我叭。
版权声明:本文由作者原创,转载请注明出处,谢谢支持!
- 点赞
- 收藏
- 关注作者
评论(0)