JavaSE异常
嘿,程序员朋友们,今天咱们聊聊JavaSE中的异常处理,这可是编程界的“故障排查指南”啊!
首先,抛个问题:你有没有遇到过程序突然崩溃,控制台蹦出一堆红字,然后你一脸懵圈的情况?没错,那就是异常在作祟!异常就是程序执行过程中的“小插曲”,比如你试图除以零,或者访问一个不存在的数组元素,程序就会大喊:“我受不了了,我要崩溃!”
那么,问题来了:怎么处理这些“小插曲”呢?Java给我们提供了两大法宝:防御式编程(LBYL)和事后认错型(EAFP)。防御式编程就像个“事前诸葛亮”,操作前先检查,确保万无一失;而事后认错型则是“事后诸葛亮”,先干了再说,出了问题再处理。在Java里,我们更倾向于后者,因为异常处理的核心就是EAFP。
接下来,Java还给了我们五个关键词来对付异常:throw、try、catch、final、throws。简单概括,throw是“抛出异常”,try是“试一下”,catch是“抓住异常”,finally是“无论怎样都执行”,throws是“甩锅给调用者”。
举个例子,如果你写了个打开配置文件的方法,发现文件名不对,就可以throw一个FileNotFoundException,然后调用者要么处理这个异常,要么继续throws甩锅。或者,你可以用try-catch结构,把可能出问题的代码放在try里,如果出了问题,catch就抓住它,然后你可以优雅地处理掉,而不是让程序直接崩溃。
所以,下次遇到异常,别慌,拿起Java的“故障排查指南”,优雅地解决问题吧!
文章目录
- JavaSE异常
-
- 一、异常的概念
- 二、异常的体系结构
- 三、异常的分类
- 四、异常的处理
- 五、自定义异常类
JavaSE异常
一、异常的概念
在Java中,将程序执行过程中发生的不正常行为称为异常
- 常见逻辑异常:
- 算数异常
System.out.println(10 / 0);
// 执行结果
Exception in thread "main" java.lang.ArithmeticException: / by zero
- 数组越界异常
int[] arr = {1, 2, 3};
System.out.println(arr[100]);
// 执行结果
Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: 100
- 空指针异常
int[] arr = null;
System.out.println(arr.length);
// 执行结果
Exception in thread "main" java.lang.NullPointerException
二、异常的体系结构
- Java内部维护了一个异常的体系结构:
- 说明:
- Throwable:是异常体系的顶层类,其派生出两个重要的子类, Error 和 Exception
- Error:指的是Java虚拟机无法解决的严重问题,比如:JVM的内部错误、资源耗尽等,典型代表:StackOverflowError和OutOfMemoryError,一旦发生回力乏术
- Exception:异常产生后程序员可以通过代码进行处理,使程序继续执行
三、异常的分类
- 根据发生的时机不同,可以将异常分为:
-
编译时异常:在程序编译期间发生的异常,称为编译时异常,也称为受检查异常
-
运行时异常:在程序执行期间发生的异常,称为运行时异常,也称为非受检查异常RunTimeException以及其子类对应的异常,都称为运行时异常
- 注意:
- 编译时出现的语法性错误,不能称之为异常
- 运行时指的是程序已经编译通过得到class 文件了, 再由 JVM 执行过程中出现的错误
四、异常的处理
-
防御式编程LBYL:在操作之前就做充分的检查
-
事后认错型:EAFP先操作, 遇到问题再处理
注:异常处理的核心思想就是 EAFP
在Java中,异常处理主要的5个关键字:throw、try、catch、final、throws
- throw关键字:抛出一个指定的异常对象,将错误信息告知给调用者
throw new XXXException("异常产生的原因");
- 注意:
-
throw必须写在方法体内部
-
抛出的对象必须是Exception 或者 Exception 的子类对象
-
如果抛出的是 RunTimeException 或者 RunTimeException 的子类,则可以不用处理,直接交给JVM来处理
-
如果抛出的是编译时异常,用户必须处理,否则无法通过编译
-
异常一旦抛出,其后的代码就不会执行
- throws:将异常抛给方法的调用者来处理
修饰符 返回值类型 方法名(参数列表) throws 异常类型1,异常类型2...{
}
public void OpenConfig(String filename) throws FileNotFoundException{if(filename.equals("config.ini")){throw new FileNotFoundException("配置文件名字不对");} // 打开文件
}
注:调用声明抛出异常的方法时,调用者必须对该异常进行处理,或者继续使用throws抛出
- try-catch捕获并处理:真正要对异常进行处理
try{// 将可能出现异常的代码放在这里
}catch(要捕获的异常类型 e){// 如果try中的代码抛出异常了,此处catch捕获时异常类型与try中抛出的异常类型一致时,或者是try中抛出异常的基类时,就会被捕获到// 对异常就可以正常处理,处理完成后,跳出try-catch结构,继续执行后序代码
}[catch(异常类型 e){