目录
前言
异常
什么是异常
异常(Exception)和错误(Error)
异常的处理
异常的作用
前言
我们用一个简单情形引入异常:
class Devide{
public int divide(int a ,int b ){
return a / b ;
}
}
public class Main{
public static void main(String[] args){
Devide divide = new Devide();
divide.divide(1 ,0) ;
}
}
我们假设有这样一段代码,显然,这段代码是有错误的,因为我们使得除数为0,假使运行,我们将得到以下结果:
可以看到,编译器给我们报了 ArithmeticException(算数异常),中断了程序,并告诉我们是由除0引起的,这就是一个最简单的异常。
异常
什么是异常
Java 异常是在程序执行过程中发生的意外情况,它们可以中断正常的程序流程,并提供了一种机制来处理这些意外情况。异常通常分为两种类型:受检异常(Checked Exception)和非受检异常(Unchecked Exception)。
-
受检异常(Checked Exception):
- 受检异常是指在编译时被检查的异常,即在代码中必须显式地捕获或声明抛出以避免编译错误。
- 典型的受检异常包括 I/O 异常(如文件不存在或读写失败)、SQL 异常(如数据库连接错误或查询错误)等。
- 受检异常通常是可以恢复的,并且程序应该有相应的处理机制来解决这些异常。
-
非受检异常(Unchecked Exception):
- 非受检异常是指在运行时发生的异常,不需要在代码中显式地捕获或声明抛出。
- 典型的非受检异常包括空指针异常(NullPointerException)、数组越界异常(ArrayIndexOutOfBoundsException)、类型转换异常(ClassCastException)等。
- 非受检异常通常是由编程错误引起的,比如访问 null 对象的属性或方法、数组访问越界等。
在 Java 中,所有异常都是 Throwable 类的子类。Throwable 类有两个主要的子类:Exception 和 Error。
异常(Exception)和错误(Error)
-
Exception:Exception 是程序正常运行中可以预料到的意外情况所引发的异常的超类。它又分为受检异常和非受检异常两种。
-
Error:Error 是指程序无法处理的系统错误或资源耗尽等严重问题所引发的异常。与一般的异常不同,Error 通常发生在 JVM 或底层系统中,无法通过代码来解决。
简要的理解,异常往往指的是得到的结果和预期不一致,会中断程序的运行,但其实不代表程序就不能够向下运行了。而错误一旦发生,程序就连运行都做不到了。
异常的处理
Java 提供了一套异常处理机制,通过 try-catch-finally 语句来捕获和处理异常。一个典型的异常处理代码结构如下:
try {
// 可能会抛出异常的代码
// 比如可能发生除以零的操作、访问 null 对象等
} catch (ExceptionType1 e1) {
// 处理 ExceptionType1 类型的异常
} catch (ExceptionType2 e2) {
// 处理 ExceptionType2 类型的异常
} finally {
// 无论是否发生异常,都会执行的代码块
// 通常用来释放资源等清理工作
}
在 try 代码块中,放置可能会引发异常的代码;catch 代码块用来捕获和处理特定类型的异常;finally 代码块中的代码无论是否发生异常都会被执行,通常用来进行资源的释放或清理工作。
除了 try-catch-finally 语句外,还可以使用 throws 关键字来声明方法可能抛出的异常,从而将异常的处理责任交给调用者。
异常的作用
异常机制的最重要作用就是“保护”,我们说,出现异常并不是说程序就完全不能运行了,而是得不到预期的结果。但Java的工程师们为什么要在异常发生时强行中断程序呢?试想刚刚的例子,一个数除以0交给系统去运算,不清楚到底会得到一个什么样的值,如果这时不中断程序,而是继续运行,那之后要是用到了这个值呢?后果是不堪设想的,所以Java的异常机制就是在保护我们程序的健壮性。
本篇博文到此就结束了,新手上路,水平有限,如有错误,还望海涵并指出!