一, 异常
就是不正常的意思.
异常 : 指的是程序在执行过程中, 出现的非正常的情况, 最终会导致 JVM 的非正常停止.
1. Throwable 体系
Error: 严重错误 Error, 无法通过处理的错误, 只能事先避免, 好比绝症.
Exception: 表示异常, 异常产生后程序员可以通过代码的方式纠正, 使程序继续运行, 是必须要处理的. 好比感冒, 阑尾炎.
常用方法:
public void printStackTrace(): 打印异常的详细信息.
public String getMessage(): 获取发生异常的原因.
public String toString(): 获取异常的类型和异常描述信息 (不用).
异常分类:
编译时期异常: checked 异常.
运行时期异常: runtime 异常.
2. 异常的处理
Java 异常处理的五个关键字: try,catch,finally,throw,throws
throw new 异常类名 (参数);
- throw new NullPointerException("要访问的 arr 数组不存在");
- throw new ArrayIndexOutOfBoundsException("该索引在数组中不存在, 已超出范围");
- /*
- * 根据 索引找到数组中对应的元素
- */
- public static int getElement(int[] arr,int index){
- // 判断 索引是否越界
- if(index<0 || index>arr.length-1){
- /*
- 判断条件如果满足, 当执行完 throw 抛出异常对象后, 方法已经无法继续运算.
- 这时就会结束当前方法的执行, 并将异常告知给调用者. 这时就需要通过异常来解决.
- */
- throw new ArrayIndexOutOfBoundsException("哥们, 角标越界了~~~");
- }
- int element = arr[index];
- return element;
- }
Objects 非空判断
public static <T> T requireNonNull(T obj): 查看指定引用对象不是 null.
- public static <T> T requireNonNull(T obj) {
- if (obj == null)
- throw new NullPointerException();
- return obj;
- }
声明异常 throws
修饰符 返回值类型 方法名 (参数) throws 异常类名 1, 异常类名 2...{ }
- public class ThrowsDemo {
- public static void main(String[] args) throws FileNotFoundException {
- read("a.txt");
- }
- // 如果定义功能时有问题发生需要报告给调用者. 可以通过在方法上使用 throws 关键字进行声明
- public static void read(String path) throws FileNotFoundException {
- if (!path.equals("a.txt")) {// 如果不是 a.txt 这个文件
- // 我假设 如果不是 a.txt 认为 该文件不存在 是一个错误 也就是异常 throw
- throw new FileNotFoundException("文件不存在");
- }
- }
- }
- public class ThrowsDemo2 {
- public static void main(String[] args) throws IOException {
- read("a.txt");
- }
- public static void read(String path)throws FileNotFoundException, IOException {
- if (!path.equals("a.txt")) {// 如果不是 a.txt 这个文件
- // 我假设 如果不是 a.txt 认为 该文件不存在 是一个错误 也就是异常 throw
- throw new FileNotFoundException("文件不存在");
- }
- if (!path.equals("b.txt")) {
- throw new IOException();
- }
- }
- }
捕获异常 try...catch
try{
编写可能会出现异常的代码
}catch(异常类型 e){
处理异常的代码
- // 记录日志 / 打印异常信息 / 继续抛出异常
- }
- public class TryCatchDemo {
- public static void main(String[] args) {
- try {// 当产生异常时, 必须有处理方式. 要么捕获, 要么声明.
- read("b.txt");
- } catch (FileNotFoundException e) {// 括号中需要定义什么呢?
- //try 中抛出的是什么异常, 在括号中就定义什么异常类型
- System.out.println(e);
- }
- System.out.println("over");
- }
- /*
- *
- * 我们 当前的这个方法中 有异常 有编译期异常
- */
- public static void read(String path) throws FileNotFoundException {
- if (!path.equals("a.txt")) {// 如果不是 a.txt 这个文件
- // 我假设 如果不是 a.txt 认为 该文件不存在 是一个错误 也就是异常 throw
- throw new FileNotFoundException("文件不存在");
- }
- }
- }
finally 代码块
try...catch....finally: 自身需要处理异常, 最终还得关闭资源.
- public class TryCatchDemo4 {
- public static void main(String[] args) {
- try {
- read("a.txt");
- } catch (FileNotFoundException e) {
- // 抓取到的是编译期异常 抛出去的是运行期
- throw new RuntimeException(e);
- } finally {
- System.out.println("不管程序怎样, 这里都将会被执行.");
- }
- System.out.println("over");
- }
- /*
- *
- * 我们 当前的这个方法中 有异常 有编译期异常
- */
- public static void read(String path) throws FileNotFoundException {
- if (!path.equals("a.txt")) {// 如果不是 a.txt 这个文件
- // 我假设 如果不是 a.txt 认为 该文件不存在 是一个错误 也就是异常 throw
- throw new FileNotFoundException("文件不存在");
- }
- }
- }
注意事项
try{
编写可能会出现异常的代码
}catch(异常类型 A e){ 当 try 中出现 A 类型异常, 就用该 catch 来捕获.
处理异常的代码
// 记录日志 / 打印异常信息 / 继续抛出异常
}catch(异常类型 B e){ 当 try 中出现 B 类型异常, 就用该 catch 来捕获.
处理异常的代码
- // 记录日志 / 打印异常信息 / 继续抛出异常
- }
3. 自定义异常
- // 业务逻辑异常
- public class RegisterException extends Exception {
- /**
- * 空参构造
- */
- public RegisterException() {
- }
- /**
- *
- * @param message 表示异常提示
- */
- public RegisterException(String message) {
- super(message);
- }
- }
- public class Demo {
- // 模拟数据库中已存在账号
- private static String[] names = {"bill","hill","jill"};
- public static void main(String[] args) {
- // 调用方法
- try{
- // 可能出现异常的代码
- checkUsername("nill");
- System.out.println("注册成功");// 如果没有异常就是注册成功
- }catch(RegisterException e){
- // 处理异常
- e.printStackTrace();
- }
- }
- // 判断当前注册账号是否存在
- // 因为是编译期异常, 又想调用者去处理 所以声明该异常
- public static boolean checkUsername(String uname) throws LoginException{
- for (String name : names) {
- if(name.equals(uname)){// 如果名字在这里面 就抛出登陆异常
- throw new RegisterException("亲"+name+"已经被注册了!");
- }
- }
- return true;
- }
- }
来源: http://www.bubuko.com/infodetail-3438383.html