第一章 Java中级之异常处理
声明:以下内容参考https://how2j.cn/,仅供个人回顾基础知识点。
一、什么是异常?
定义: 导致程序的正常流程被中断的事件,叫做异常。
二、Java的异常处理办法
关键词:try,catch,finally,throws.,throw
代码中出现异常时,通常有两种处理方法:1.用try…catch进行捕获处理;2.不处理,在方法声明上把该异常用throws抛出去。
1.try…catch…finally
举例来说:当我们试图打开d盘目录下一个不存在的文件
代码如下(示例):
...
File f = new File("d:/LOL.exe");
try {
System.out.println("试图打开 d:/Onmyoji.exe ");
//不处理该异常,就会有编译错误。
new FileInputStream(f);//Unhandled exception: java.io.FileNotFoundException
System.out.println("打开成功");
} catch (FileNotFoundException e) {
System.out.println("d:/Onmyoji.exe 不存在");
e.printStackTrace();
}
...
有时候,一段代码中会抛出多种异常,此时,有两种处理方法:
一是分别进行catch:
...
File f = new File("d:/Onmyoji.exe");
try {
System.out.println("试图打开 d:/Onmyoji.exe ");
//不处理该异常,就会有编译错误。
new FileInputStream(f);//Unhandled exception: java.io.FileNotFoundException
System.out.println("打开成功");
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
Date date = sdf.parse("20210302");
} catch (FileNotFoundException e) {
System.out.println("d:/Onmyoji.exe 不存在");
e.printStackTrace();
} catch (ParseException e) {
System.out.println("日期格式解析错误");
e.printStackTrace();
}
...
二是把多个异常,放在一个catch里统一捕捉,但在判断具体异常类型时需要用instanceof进行判断:
...
File f = new File("d:/Onmyoji.exe");
try {
System.out.println("试图打开 d:/Onmyoji.exe");
new FileInputStream(f);
System.out.println("打开成功");
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
Date d = sdf.parse("20210302");
} catch (FileNotFoundException | ParseException e) {
if (e instanceof FileNotFoundException)
System.out.println("d:/Onmyoji.exe不存在");
if (e instanceof ParseException)
System.out.println("日期格式解析错误");
e.printStackTrace();
}
...
需要注意的是finally。事实上,不管是否catch到异常,finally代码块总会执行,分析相关源代码可以发现,finally代码块通常是最后执行的。
/**
* @description 练习:异常处理
* 假设有一个方法 public int method(), 会返回一个整数
* 在这个方法中有try catch 和 finally.
* try 里返回 1
* catch 里 返回 2
* finally 里 返回3
* 那么,这个方法到底返回多少?
*/
public class TestException2 {
public static void main(String[] args){
System.out.println(method());//3
}
private static int method(){
try{
//int i = 2 / 0;
return 1;
}catch (Exception e){
e.printStackTrace();
return 2;
}finally {
return 3;
}
}
}
2.throws/throw
首先,需要了解throws和throw的区别:
(1)throws出现在方法声明上,而throw往往存在于方法体中;
(2)throws 表示出现异常的一种可能性,并不一定会发生这些异常;throw则是抛出了异常,执行throw则一定抛出了某个异常对象。
代码如下(示例):
public class TextException {
public static void main(String[] args){
metho![在这里插入图片描述](https://img-blog.csdnimg.cn/20210302152516578.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L1NodVllbw==,size_16,color_FFFFFF,t_70)
d();
}
private static void method(){
try{
method2();
System.out.println("打开成功");
}catch(FileNotFoundException ffe){
System.out.println("d:/Onmyoji.exe 不存在");
ffe.printStackTrace();
}
}
private static void method2() throws FileNotFoundException{
File f = new File("d:/Onmyoji.exe");
System.out.println("试图打开 d:/Onmyoji.exe ");
new FileInputStream(f);//Unhandled exception: java.io.FileNotFoundException
}
}
三、Java异常的分类
如上图所示,异常一般分为三种:1)CheckedException,必须进行处理的异常;2)RuntimeException,运行时异常,不是必须进行try…catch的异常;3)Error,系统级别的异常,与运行时异常一样,错误也不要求强制捕捉。
四、Java Throwable接口
Throwable是类,Exception和Error都继承了该类
所以在捕捉的时候,也可以使用Throwable进行捕捉
如图: 异常分Error和Exception
Exception里又分运行时异常和可查异常。
五、自定义异常
类似Java内部帮我们定义好的异常,当进行自定义时,只需要正常声明,调用,利用好throw,throws,try…catch…finally等进行异常处理即可。
总结
文章主要简单了解了一下异常的基本概念、分类,以及如何处理等,并没有对底层源码进行深入分析。如有必要,后面会继续进行补充。