java空指针异常处理-状态码500空指针异常
前言:
每个人都熟悉 Java 异常。 但是对于它如何归类,JVM如何处理,在代码中如何处理,应该如何使用,底层如何实现等等,可能就不是那么清楚了。 基于此,本文对异常的类型、实现方式以及使用时的注意事项进行了简要的探讨。
1.异常实现及分类
1.先看异常类的结构图
上图可以简要展示异常类的实现结构图。 当然,上图也不全是例外。 用户还可以自定义异常实现。 上图足以帮助我们解释和理解异常实现:
1.所有异常都继承自Throwable,Throwable是所有异常的共同祖先。
2、Throwable有两个子类,Error和Exception。 其中Error是错误,所有的编译时错误和系统错误都是通过Error抛出的。 这些错误表明故障发生在虚拟机本身,或者虚拟机试图执行应用程序时,如Java虚拟机运行错误(Virtual MachineError)、类定义错误(NoClassDefFoundError)等。 这些错误是无法追踪的,因为它们超出了应用程序的控制和处理能力,而且大多数是程序运行时不允许出现的情况。 对于设计良好的应用程序,即使确实发生了错误java空指针异常处理java空指针异常处理,它也不应该天生就尝试处理它引发的异常情况。 在 Java 中,错误由 Error 的子类描述。
3.Exception是另一个非常重要的异常子类。 它指定的异常是程序本身可以处理的异常。 异常和错误的区别在于异常可以被处理,而错误不能被处理。
4.检查异常
Checkable异常在编码中非常常用,所有的checked异常都需要在代码中处理。 它们的发生是可以预见的、正常的、可以合理管理的。 比如IOException,或者一些自定义的异常。 除了RuntimeException及其子类外,都是checked exception。
5. 未经检查的异常
RuntimeException 及其子类是未经检查的异常。 例如NPE空指针异常、除数为0的算术异常、ArithmeticException等。这类异常发生在运行时,无法提前捕获和处理。 Error也是unchecked exception,无法进行预处理。
2.异常处理
代码中的异常处理实际上是处理已检查的异常。
1.通过try...catch语句块来处理:
例如
try { // 程序代码 }catch(ExceptionName e1) { //Catch 块 }
Catch 语句包含要捕获的异常类型的声明。 当受保护的代码块中发生异常时,将检查 try 之后的 catch 块。
如果发生的异常包含在一个 catch 块中,则异常将被传递到 catch 块,这与将参数传递给方法相同。
2.另外,也可以不在特定位置处理,直接throw,然后通过throws/throw向上层处理。 具体来说,如果一个方法没有捕获到已检查的异常,则必须使用 throws 关键字声明该方法。 throws 关键字放在方法签名的末尾。 您还可以使用 throw 关键字来抛出异常,无论它是新实例化的还是刚刚捕获的。
以下方法的声明抛出 RemoteException:
import java.io.*;
public class className
{
public void deposit(double amount) throws RemoteException
{
// Method implementation
throw new RemoteException();
}
//Remainder of class definition
}
3.finally关键字
finally 关键字用于创建在 try 块之后执行的代码块。
无论是否发生异常,finally 块中的代码将始终执行。
在 finally 代码块中,您可以运行具有整理性质的语句,例如清理类型。
finally代码块出现在catch代码块的末尾,语法如下:
try{
// 程序代码
}catch(异常类型1 异常的变量名1){
// 程序代码
}catch(异常类型2 异常的变量名2){
// 程序代码
}finally{
// 程序代码
}
概括:
本文简单梳理了异常的结构关系、分类、处理体系,可以帮助我从理论上将它们联系起来,也希望对有需要的朋友有所帮助。