lukaliou123 / lukaliou123.github.io

lukaliou123在2022年的面试用知识点总结
Other
5 stars 0 forks source link

Java基础--异常篇 #5

Open lukaliou123 opened 2 years ago

lukaliou123 commented 2 years ago

1.Java异常类层次结构图概览

image

lukaliou123 commented 2 years ago

2.Exception 和Error有什么区别

在Java中,所有的异常都有一个共同的祖先Java.lang包中的Throwable类。Throwable类有两个重要的子类 1.Exception:程序本身可以处理的异常,可以通过catch来进行捕获。Exception又可以分为Checked Exception(受检查异常,必须处理)和Unchecked Exception(不受检查异常,可以不处理)

2.Error: Error属于程序无法处理的错误,我们没办法通过catch来进行捕获。例如Java虚拟机运行错误(Virtual MachineError)、虚拟机内存不够错误(OutOfMemoryError)、类定义错误(NoClassDefoundError)等。这些异常发生时,Java虚拟机(JVM)一般会选择线程终止

3.常见异常

1.illegalAccessError:违法访问错误。当一个应用试图访问、修改某个类的域(Field)或者调用其方法,但是又违反域或方法的可见性声明,则抛出该异常。 2.InstantiationError:实例化错误。当一个应用试图通过Java的new操作符构造一个抽象类或者接口时抛出该异常。 3.OutOfMemoryError:内存不足错误。当可见内存不足以让Java虚拟机分配给一个对象时,抛出该错误 4.StackOverflowError:堆栈溢出错误。当一个应用递归调用的层次太深而导致堆栈溢出或者陷入死循环时抛出该错误。 5.ClassCastException:类造型异常。假设有类A和B(A不是B的父类或子类),O是A的实例,那么当强制将O构造为类B的实例时抛出该异常

4.Checked Exception 和 Unchecked Exception有什么区别

Checked Exception即受检查异常,Java代码在编译过程中,如果受检查异常没有被catch/throw处理的话,就没办法通过编译 比如 image 除了RuntimeException以及其子类以外,其他的Exception及其子类都属于受检查异常。常见的受检查异常有:IO相关的异常、ClassNotFoundExcepion、SQLException…

Unchecked Exception 即不受检查异常,Java代码在编译过程中,我们即使不处理不受检查异常也可以正常通过编译

RuntimeException及其子类都统称为非受检查异常:例如:NullPointerException、NumberFormatException(字符串转换为数字)、ArrayIndexOutOfBoundsException(数组越界)、ClassCastException(类型转换错误)、ArithmeticException(算术错误)。

4.1.Throwable 类常用方法有哪些? 1.String getMessage(): 返回异常发生时的简要描述 2.String toString(): 返回异常发生时的详细信息 3.String getLocalizedMessage(): 返回异常对象的本地化信息。使用 Throwable 的子类覆盖这个方法,可以生成本地化信息。如果子类没有覆盖该方法,则该方法返回的信息与 getMessage()返回的结果相同 4.void printStackTrace(): 在控制台上打印 Throwable 对象封装的异常信息

4.2.为什么要有两种exception

设计这两种类型的异常的主要原因是,有一些问题是你可以并且应该在编写代码时处理的,比如打开一个文件时可能会出现的IOException。这些问题的出现通常并不意味着程序存在错误,可能只是因为外部环境(如文件不存在)导致的,这就是检查异常

然而,有些问题则是由于程序本身存在错误,比如空指针访问、数组下标越界,这些问题一旦出现,通常意味着程序本身存在问题,需要修正源代码。这种情况就会产生非检查异常。这些问题出现时,不应该让程序继续执行下去,因为可能会导致更严重的错误或者使错误更难以发现。所以,对于这类异常,Java设计者认为应该由程序员在编写代码时就避免它们,而不是等到程序运行时再处理。

lukaliou123 commented 2 years ago

5.Java异常处理

image Java通过面向对象的方法进行异常处理,一旦方法抛出异常,系统自动根据异常对象寻找合适异常处理器(Exception Handler)来处理异常,把各种不同的异常进行分类,并提供了良好的接口。 在Java中,每个异常都是一个对象,它是Throwable类或其子类的实例。当一个方法出现异常后便抛出一个异常对象,该对象中包含有异常信息,调用这个对象的方法可以捕获到这个异常并可以对其进行处理。 Java的异常处理是通过5个关键词来实现的:try、catch、throw、throws和finally.

在Java应用中,异常的处理机制分为声明异常,抛出异常和捕获异常

1.声明异常: 通常,应该捕获那些知道如何处理的异常,将不知道如何处理的异常继续传递下去。传递异常可以在方法签名处使用throws关键字声明可能会抛出的异常 注意:非检查异常不可使用throws关键字来声明要抛出的异常

2.抛出异常:1.如果你觉得解决不了某些异常问题,且不需要调用者处理,那么你可以抛出异常。Throw关键字作用是在方法内部抛出一个Throwable类型的异常。任何Java代码都可以通过throw语句抛出异常 image

3.捕获异常程序通常在运行之前不报错,但是运行后可能会出现某些未知的错误,但是还不想直接抛出到上一级,那么就需要通过try…catch…的形式进行异常捕获,之后根据不同的异常情况来进行相应的处理。

lukaliou123 commented 2 years ago

6.try-catch-finally如何使用?

1.try块:用于捕获异常。其后可接零个或多个catch块,如果没有catch块,则必须跟一个finally块 2.catch块:用于处理try捕获到的异常 3.finally块:无论是否捕获或处理异常,finally块里的语句都会被执行。当在try块或catch块中遇到return语句时,finally语句块将在方法返回之前被执行 image

现在大家基本都用try-with-resources ,结构上也就是少了个finally,隐式地关闭资源

7.Throwable类常用方法有哪些?

String getMessage(): 返回异常发生时的简要描述 String toString():返回异常发生时的详细信息 String getLocalizedMessage():返回异常对象的本地化信息。使用 Throwable 的子类覆盖这个方法,可以生成本地化信息。如果子类没有覆盖该方法,则该方法返回的信息与 getMessage()返回的结果相同 Void printStackTrace():在控制台上打印 Throwable 对象封装的异常信息

8.finally中的代码一定会执行吗?

不一定,比如说finally之前虚拟机被终止运行的话,finally中的代码就不会被执行 或者程序所在的线程死亡,或者关闭CPU image