异常是什么
Java 异常是 Java 编程语言中的一种错误处理机制,异常表示在程序执行期间发生的意外情况.
Java异常的类图
受检查异常(Checked Exceptions):已检查异常是在编译时由 Java 编译器强制要求处理的异常。这些异常通常是由外部因素引起的,比如文件不存在、网络连接失败等。开发者必须通过 try-catch 块或者在方法签名中声明 throws 子句来处理这些异常,否则编译器将报错。例如 IOException。
运行异常(Runtime Exceptions):未检查异常是在运行时可能会出现的异常,通常是由程序编码错误或者运行环境问题导致的。这些异常不需要在编码时显式处理,但如果未被处理,将在运行时导致程序终止。常见的未检查异常包括 NullPointerException、ArrayIndexOutOfBoundsException、ArithmeticException 等。
Error错误:一般是指与虚拟机相关的问题,如OutOfMemoryError(内存不足)、StackOverflowError(递归调用或者方法调用栈溢出)、InternalError(虚拟机内部错误),这种错误无法恢复或不可能捕获,将导致应用程序中断。通常应用程序无法处理这些错误,因此应用程序不应该试图使用catch 块来捕获Error对象。
在定义该方法时,也无须在其throws子句中声明该方法可能抛出Error及其任何子类。
异常的优势
1、提高程序的稳定性和可靠性: 异常处理允许程序在出现错误或异常情况时进行适当的处理,从而防止程序因为异常而崩溃或产生不可预测的行为。通过捕获异常并采取相应的措施,可以使程序更加健壮和可靠。
2、分离正常业务逻辑和异常处理逻辑: 使用异常处理机制可以将正常业务逻辑与错误处理逻辑分离开来,使代码更加清晰、易于理解和维护。这样可以使开发者专注于编写核心业务逻辑,而将异常处理交给专门的代码块来处理。
3、提高代码的可读性: 通过在关键位置捕获异常并在适当的地方处理它们,可以使代码更具可读性。异常处理代码通常与正常的业务逻辑分开,这样可以使代码更加清晰,易于理解。
4、提供更好的用户体验: 在用户交互的应用程序中,良好的异常处理可以提供更好的用户体验。通过捕获并处理异常,程序可以向用户提供友好的错误信息,帮助用户理解发生的问题并采取适当的措施。
5、调试和错误排查: 异常处理提供了一种机制来调试和排查程序中的错误。通过捕获异常并打印相关信息,可以帮助开发者定位问题所在,并采取适当的措施来解决问题。
java中异常的使用
try {
// 可能会引发异常的代码段
// 比如:打开文件、连接数据库、进行数组访问等
} catch (ExceptionType1 e) {
// 处理特定类型的异常
} catch (ExceptionType2 e) {
// 处理另一种类型的异常
} finally {
// 无论是否发生异常都会执行的代码段
// 比如:关闭文件、关闭数据库连接等
}
throw:抛出一个异常
public class Example {
public static void main(String[] args) {
int age = -1; // 假设年龄为负数,这是一个不合法的输入
try {
if (age < 0) {
throw new IllegalArgumentException("年龄不能为负数");
}
} catch (IllegalArgumentException e) {
System.out.println("捕获到异常:" + e.getMessage());
}
}
}
throws:在方法上使用
import java.io.FileNotFoundException;
public class Example {
public static void main(String[] args) {
try {
readFile("example.txt");
} catch (FileNotFoundException e) {
System.out.println("文件未找到:" + e.getMessage());
}
}
public static void readFile(String fileName) throws FileNotFoundException {
// 读取文件的代码
// 假设文件不存在,抛出 FileNotFoundException 异常
throw new FileNotFoundException("文件不存在");
}
}
自定义异常
public class MyException extends RuntimeException{
public MyException(String message){
super(message);
}
public MyException(String message, Throwable cause) {
super(message, cause);
}
public MyException(Throwable cause) {
super(cause);
}
}
public class Example {
public static void main(String[] args) {
try {
int result = divide(10, 0);
System.out.println("结果:" + result);
} catch (MyException e) {
System.out.println("发生自定义运行时异常:" + e.getMessage());
}
}
public static int divide(int dividend, int divisor) {
if (divisor == 0) {
throw new MyException ("除数不能为零");
}
return dividend / divisor;
}
}
常见异常
图片来自这