> 文章列表 > JavaSE异常

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异常
    • 一、异常的概念
    • 二、异常的体系结构
    • 三、异常的分类
    • 四、异常的处理
    • 五、自定义异常类

JavaSE异常

一、异常的概念

在Java中,将程序执行过程中发生的不正常行为称为异常

  • 常见逻辑异常:
  1. 算数异常
System.out.println(10 / 0);
// 执行结果
Exception in thread "main" java.lang.ArithmeticException: / by zero
  1. 数组越界异常
int[] arr = {1, 2, 3};
System.out.println(arr[100]);
// 执行结果
Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: 100
  1. 空指针异常
int[] arr = null;
System.out.println(arr.length);
// 执行结果
Exception in thread "main" java.lang.NullPointerException

二、异常的体系结构

  • Java内部维护了一个异常的体系结构:

JavaSE异常

  • 说明:
  1. Throwable:是异常体系的顶层类,其派生出两个重要的子类, Error 和 Exception
  2. Error:指的是Java虚拟机无法解决的严重问题,比如:JVM的内部错误、资源耗尽等,典型代表:StackOverflowError和OutOfMemoryError,一旦发生回力乏术
  3. Exception:异常产生后程序员可以通过代码进行处理,使程序继续执行

三、异常的分类

  • 根据发生的时机不同,可以将异常分为:
  1. 编译时异常:在程序编译期间发生的异常,称为编译时异常,也称为受检查异常

  2. 运行时异常:在程序执行期间发生的异常,称为运行时异常,也称为非受检查异常RunTimeException以及其子类对应的异常,都称为运行时异常

  • 注意:
  1. 编译时出现的语法性错误,不能称之为异常
  2. 运行时指的是程序已经编译通过得到class 文件了, 再由 JVM 执行过程中出现的错误

四、异常的处理

  1. 防御式编程LBYL:在操作之前就做充分的检查

  2. 事后认错型:EAFP先操作, 遇到问题再处理

注:异常处理的核心思想就是 EAFP

在Java中,异常处理主要的5个关键字:throw、try、catch、final、throws

  • throw关键字:抛出一个指定的异常对象,将错误信息告知给调用者
throw new XXXException("异常产生的原因");
  • 注意:
  1. throw必须写在方法体内部

  2. 抛出的对象必须是Exception 或者 Exception 的子类对象

  3. 如果抛出的是 RunTimeException 或者 RunTimeException 的子类,则可以不用处理,直接交给JVM来处理

  4. 如果抛出的是编译时异常,用户必须处理,否则无法通过编译

  5. 异常一旦抛出,其后的代码就不会执行

  • 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){