1.异常
异常是指程序在编译或者运行的过程中可能出现的问题。
比如数组越界,空指针异常,日期格式化异常等等。
异常处理机制能让程序在异常发生时,按照代码的预先设定的异常处理逻辑,针对性地处理异常,让程序尽最大可能恢复正常并继续执行,且保持代码的清晰。
Java中的异常可以是函数中的语句执行时引发的,也可以是程序员通过throw 语句手动抛出的,只要在Java程序中产生了异常,就会用一个对应类型的异常对象来封装异常,JRE就会试图寻找异常处理程序来处理异常。
2.异常体系结构
Throwable是java异常体系中的根类,里面有两个常用方法:
- void printStackTrace();==>打印栈中的异常信息
- String getMessage();==>获取异常信息
有两个子类:
- Error:错误,是Java程序无法处理的(内存溢出等)
- Exception:异常,出现的一般性问题,可以使用java中的异常处理机制进行处理的
3.关键字
- try==>执行可能产生异常的代码
- catch==>捕获异常
- finally==>无论是否发生异常,代码总能执行
- throws==>声明方法可能要抛出的各种异常
- throw==>手动抛出异常
try {
// 可能会抛出异常的代码
}
catch (ExceptionType1 e1) {
// 处理异常的代码块1
}
catch (ExceptionType2 e2) {
// 处理异常的代码块2
}
finally {
// 无论是否有异常都要执行的代码
}
其中,try块和catch块是必须的,finally块可以省略。
如果try块中的代码抛出异常,程序将跳转到最近的catch块,并执行相应的代码块。如果没有catch块捕获该异常,异常将会被抛到调用者处继续处理。
无论try块中是否有异常,finally块中的代码都会被执行。通常,在finally块中释放资源(如文件、流等)或执行善后工作。
[修饰符] 返回值类型 方法名(参数列表) throws 异常类型1,异常类型2,...{
// 方法体
}
其中,throws后面的异常类型可以是多个,用逗号分隔。如果方法将会抛出多个异常,可以使用一个throws语句来声明所有的异常类型。
public void readFile(String fileName) throws FileNotFoundException, IOException {
FileInputStream fis = new FileInputStream(fileName);
// 读取文件内容
fis.close();
}
需要注意的是,使用throws声明方法抛出异常,并不是要求方法必须抛出异常,而是在方法中可能会抛出这些异常。如果方法没有抛出任何异常,也不会报错。
public void checkAge(int age) {
if (age < 0) {
throw new IllegalArgumentException("Age cannot be negative"); // 抛出IllegalArgumentException异常
} else if (age > 150) {
throw new IllegalArgumentException("Age cannot be greater than 150"); // 抛出IllegalArgumentException异常
} else {
System.out.println("Age is: " + age);
}
}
在上面的示例中,如果传入的age参数小于0或大于150,则会抛出IllegalArgumentException异常。通过手动抛出异常,可以使程序更加灵活和健壮。
4.自定义异常
Java中可以通过继承Exception或RuntimeException类来自定义异常。一般情况下,我们会继承Exception类,因为RuntimeException及其子类表示的是程序错误,而Exception及其子类表示的是程序异常情况。
步骤
-
创建一个类,继承Exception或RuntimeException类。
-
在构造方法中调用父类的构造方法,并传入错误信息。
-
在需要抛出异常的地方,使用throw关键字抛出自定义异常对象。
// 自定义异常类
class MyException extends Exception {
public MyException(String message) {
super(message);
}
}
// 调用自定义异常的类
public class Test {
public static void test() throws MyException {
throw new MyException("MyException occurred"); // 抛出自定义异常
}
public static void main(String[] args) {
try {
test();
} catch (MyException e) {
e.printStackTrace();
}
}
}
上述代码中,自定义了一个MyException异常类,并在方法test()中使用throw关键字抛出了自定义异常对象。在主函数中通过try-catch语句捕获异常,并打印异常信息。
作用:
标记业务逻辑的异常,避免与标准异常混淆。