Java异常报错的详细解析(一)
异常简介
提供的一种识别及响应错误的一致性机制
异常机制可以使程序中异常处理代码和正常业务代码分离,提高程序健壮性,在有效使用异常的情况下,异常可以清晰地回答what,where,why这3个问题:异常回答了"什么"被抛出,异常堆栈跟踪回答了"在哪"抛出,异常信息回答了"为什么被抛出"
Throwable
1.Throwable是所有错误与异常的超类
2.Throwable包含两个子类:Error和Exception,它们通常用于指示发生了异常情况
3.Throwable包含了其线程创建时线程执行堆栈的快照,它提供了printStackTrace()等接口用于获取堆栈跟踪数据等信息
Error
定义:Error类及其子类,程序中无法处理的错误,表示运行应用程序出现了严重错误。
特点:此类错误一般表示代码运行时JVM出现问题。通常有Virtual MachineError(虚拟机运行错误)、NoClassDefFoundError(类定义错误)等。如OutOfMemoryError:内存不足错误、StackOverflowError:栈溢错误,这类错误放生时,JVM将终止线程
这些错误是不受检异常,非代码性错误。因此,当此类错误发生时,应用程序不应该去处理此类错误,按照惯例,我们不应该实现任何新的Error子类
Exception
程序本身可以捕获并且可以处理的异常,Exception分为两类:运行时异常和编译时异常
运行时异常
定义:RuntimeException类及其子类,表示JVM在运行期间可能出现的异常。
特点:
编译器不会检查它,当程序中可能出现这类异常时,如果没有通过throws声明抛出它,也没有用try-catch语句捕获它,还是会编译通过。
例如:
NullPointerException空指针异常
ArrayIndexOutBoundException数组下标越界异常
ClassCastException类型转换异常
ArithmeticException算术异常
这些异常属于不受检异常,一般由程序逻辑错误引起的,在程序中可以选择捕获处理或者不处理,虽然编译器不会检查运行时异常,但是我们可以通过throws进行声明抛出,也可以通过try-catch对它进行捕获处理。如果产生运行时异常,则需要通过修改代码来进行避免,例如,若发生除数为0的情况,则需要通过代码避免该情况发生。
RuntimeException异常由虚拟机自动抛出并自动捕获,我们不写异常捕获语句运行时也会抛出错误,这些异常的出现绝大多数情况是代码本身有问题应该从逻辑上解决并改进代码
编译时异常
定义:Exception中除了RuntimeException及其子类之外的异常
特点:编译器会检查它,如果程序中出现此类异常
例如:
ClassNotFoundException(没有找到指定类)
IOException(IO流异常)
要么通过throws进行声明抛出,要么通过try-catch进行捕获处理,否则不能通过编译。
在程序中,通常不会自定义该类异常,而是直接使用系统提供的异常类。该异常我们必须手动在代码里添加捕获语句来处理该异常。
受检异常和非受检异常
所有异常可以分为受检异常和非受检异常
受检异常
编译器要求必须处理的异常。正确的程序在运行时,经常容易出现、符合预期的异常情况。一旦发生此类异常,就必须采用某种方式进行处理。除了
RuntimeException及其子类外,其它的Exception异常都属于受检异常。编译器会检查此类异常,当编译器检查应用中的某处可能会出现此类异常时,将会提示你处理本异常-要么使用try-catch,要么使用throws关键字抛出,否则编译不通过
非受检异常
编译器不会进行检查并且不要求必须处理的异常,当程序中出现此类异常时,即使我们没有try-catch捕获它,也没有使用throws抛出该异常,编译也会通过。该类异常包括运行时异常(RuntimeException及其子类)和错误。
异常关键字
try-用于监听。
将要被监听的代码(可能抛出异常的代码)放在try语句内,当try语句块内发生异常时,异常就被抛出。
catch-用于捕获异常。catch用来捕获try语句块中发生的异常
finally-finally语句块总是会被执行。它主要用于回收在try块里打开的物力资源(如数据库连接、网络连接和磁盘文件)。只有finally块,执行完成之后,才会 回来执行try或者catch块中的return或者throws语句。如果finally中使用了return或者throw等终止方法的语句,则不会跳回执行,直接停止。
throw-用于抛出异常
throws-用在方法声名中,用于声明该方法可能抛出的异常
异常处理
抛出异常 throw
异常处理 捕获异常 try catch finally
声明异常 throws
异常的处理机制分为声明异常,抛出异常和捕获异常。
声明异常
通常,应该捕获那些知道如何处理的异常,将不知道如何处理的异常继续传递下去。传递异常可以在方法声明处使用throws关键字声明可能会抛出的异常。
注意:
·非检查异常(Error、RuntimeException或它们的子类)不可以使用throws关键字来声明要抛出的异常
·一个方法出现编译时异常,就需要try-catch/throws处理,否则会导致编译错误
抛出异常
如果觉得解决不了某些异常问题,且不需要调用者处理,那么你可以抛出异常
throw关键字作用是在方法内部抛出一个Throwable类型的异常。任何代码都可以通过throw语句抛出异常
捕获异常
程序通常在运行之前不报错,但是运行后可能会出现某些未知错误,但是还不想直接抛出到上一级,那么就需要通过try…catch…的形式进行异常捕获,之后根据不同的异常情况来进行相应的处理。
如何选择异常类型
无法解决 必须处理
是否可以解决某些异常?->调用者是否必须处理->声明受检异常
|可以解决 |不需要处理
捕获异常 抛出运行时异常(非受检异常)
常见的RuntimeException有哪些
NullPointerException空指针异常
ArrayIndexOutBoundException数组下标越界异常
ClassCastException类型转换异常
ArithmeticException算术异常
ArrayStoreException(数据存储异常,操作数组时类型不一致)
IO操作:
BufferOverflowException
————————————————
版权声明:本文为博主「菠萝印象威」的原创文章