没有合适的资源?快使用搜索试试~ 我知道了~
Java异常面试题 33道
资源推荐
资源详情
资源评论
Java 异常架构与异常关键字
1. Java 异常简介
Java 异常是 Java 提供的一种识别及响应错误的一致性机制。
Java 异常机制可以使程序中异常处理代码和正常业务代码分离,保证程序代码更加优雅,并提高程
序健壮性。在有效使用异常的情况下,异常能清晰的回答 what, where, why 这 3 个问题:异常类
型回答了“什么”被抛出,异常堆栈跟踪回答了“在哪”抛出,异常信息回答了“为什么”会抛出。
2. Java 异常架构
1. ThrowableThrowable 是 Java 语言中所有错误与异常的超类。
Throwable 包含两个子类:Error(错误)和 Exception(异常),它们通常用于指示发生了异常
情况。
Throwable 包含了其线程创建时线程执行堆栈的快照,它提供了 printStackTrace() 等接口用于
获取堆栈跟踪数据等信息。
2. Error(错误)
定义:Error 类及其子类。程序中无法处理的错误,表示运行应用程序中出现了严重的错误。
特点:此类错误一般表示代码运行时 JVM 出现问题。通常有 Virtual MachineError(虚拟
机运行错误)、NoClassDefFoundError(类定义错误)等。比如 OutOfMemoryError:内
存不足错误;StackOverflflowError:栈溢出错误。此类错误发生时,JVM 将终止线程。
这些错误是不受检异常,非代码性错误。因此,当此类错误发生时,应用程序不应该去处理此类
错误。按照 Java 惯例,我们是不应该实现任何新的 Error 子类的!
3. Exception(异常)
程序本身可以捕获并且可以处理的异常。Exception 这种异常又分为两类:运行时异常和编译时异
常。
运行时异常
定义:RuntimeException 类及其子类,表示 JVM 在运行期间可能出现的异常。
特点:Java 编译器不会检查它。也就是说,当程序中可能出现这类异常时,倘若既"没有通过
throws 声明抛出它",也"没有用 try-catch 语句捕获它",还是会编译通过。比如
NullPointerException 空指针异常、ArrayIndexOutBoundException 数组下标越界异常、
ClassCastException 类型转换异常、ArithmeticExecption 算术异常。此类异常属于不受检异常,
一般是由程序逻辑错误引起的,在程序中可以选择捕获处理,也可以不处理。虽然 Java 编译器不
会检查运行时异常,但是我们也可以通过 throws 进行声明抛出,也可以通过 try-catch 对它进
行捕获处理。如果产生运行时异常,则需要通过修改代码来进行避免。例如,若会发生除数为零的情
况,则需要通过代码避免该情况的发生!
RuntimeException 异常会由 Java 虚拟机自动抛出并自动捕获(就算我们没写异常捕获语句运行
时也会抛出错误!!),此类异常的出现绝大数情况是代码本身有问题应该从逻辑上去解决并改进
代码。
编译时异常
定义: Exception 中除 RuntimeException 及其子类之外的异常。
特点: Java 编译器会检查它。如果程序中出现此类异常,比如 ClassNotFoundException(没有
找到指定的类异常),IOException(IO 流异常),要么通过 throws 进行声明抛出,要么通过 try
catch 进行捕获处理,否则不能通过编译。在程序中,通常不会自定义该类异常,而是直接使用系
统提供的异常类。该异常我们必须手动在代码里添加捕获语句来处理该异常。
4. 受检异常与非受检异常
Java 的所有异常可以分为受检异常(checked exception)和非受检异常(unchecked
exception)。
受检异常
编译器要求必须处理的异常。正确的程序在运行过程中,经常容易出现的、符合预期的异常情况。
一旦发生此类异常,就必须采用某种方式进行处理。除 RuntimeException 及其子类外,其他的
Exception 异常都属于受检异常。编译器会检查此类异常,也就是说当编译器检查到应用中的某
处可能会此类异常时,将会提示你处理本异常——要么使用 try-catch 捕获,要么使用方法签名中
用 throws 关键字抛出,否则编译不通过。非受检异常
编译器不会进行检查并且不要求必须处理的异常,也就说当程序中出现此类异常时,即使我们没有
try-catch 捕获它,也没有使用 throws 抛出该异常,编译也会正常通过。该类异常包括运行时异常
(RuntimeException 极其子类)和错误(Error)。
3. Java 异常关键字
try – 用于监听。将要被监听的代码(可能抛出异常的代码)放在 try 语句块之内,当 try 语句块内发
生异常时,异常就被抛出。
catch – 用于捕获异常。catch 用来捕获 try 语句块中发生的异常。
fifinally – fifinally 语句块总是会被执行。它主要用于回收在 try 块里打开的物力资源(如数据库连
接、
网络连接和磁盘文件)。只有 fifinally 块,执行完成之后,才会回来执行 try 或者 catch 块中的
return 或者 throw 语句,如果 fifinally 中使用了 return 或者 throw 等终止方法的语句,则就不
会跳回执行,直接停止。
throw – 用于抛出异常。
throws – 用在方法签名中,用于声明该方法可能抛出的异常。
3. Java 异常处理
Java 通过面向对象的方法进行异常处理,一旦方法抛出异常,系统自动根据该异常对象寻找合适
异常处理器(Exception Handler)来处理该异常,把各种不同的异常进行分类,并提供了良好的
接口。在 Java 中,每个异常都是一个对象,它是 Throwable 类或其子类的实例。当一个方法出
现异常后便抛出一个异常对象,该对象中包含有异常信息,调用这个对象的方法可以捕获到这个异常
并可以对其进行处理。Java 的异常处理是通过 5 个关键词来实现的:try、catch、throw、throws
和 fifinally。
在 Java 应用中,异常的处理机制分为声明异常,抛出异常和捕获异常。
1. 声明异常
通常,应该捕获那些知道如何处理的异常,将不知道如何处理的异常继续传递下去。传递异常可以
在方法签名处使用 throws 关键字声明可能会抛出的异常。
注意非检查异常(Error、RuntimeException 或它们的子类)不可使用 throws 关键字来声明要
抛出的异常。
一个方法出现编译时异常,就需要 try-catch/ throws 处理,否则会导致编译错误。
2. 抛出异常
如果你觉得解决不了某些异常问题,且不需要调用者处理,那么你可以抛出异常。
剩余25页未读,继续阅读
资源评论
~卑微的搬砖人~
- 粉丝: 512
- 资源: 33
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功