异常处理

Java 异常类型结构

在 Java 中,所有的异常都有一个共同的祖先 Throwable(可抛出)。Throwable 指定代码中可用异常传播机制通过 Java 应用程序传输的任何问题的共性。


异常类型结构.png

Throwable: 有两个重要的子类:Exception(异常)和 Error(错误),二者都是 Java 异常处理的重要子类,各自都包含大量子类。异常和错误的区别是:异常能被程序本身可以处理,错误是无法处理。

Error(错误):是程序无法处理的错误,表示运行应用程序中较严重问题。通常为一些虚拟机异常,如 内存不足、StackOverflowError 等。

Exception(异常):是程序本身可以处理的异常。分两大类:受检异常和非受检异常

受检异常和非受检异常

1.非受检异常:都是RuntimeException类及其子类异常,如NullPointerException(空指针异常)、IndexOutOfBoundsException(下标越界异常)等,这些异常是不检查异常,程序中可以选择捕获处理,也可以不处理。运行时异常的特点是Java编译器不会检查它,也就是说,当程序中可能出现这类异常,即使没有用try-catch语句捕获它,也没有用throws子句声明抛出它,也会编译通过。

2.受检异常 (编译异常):是RuntimeException以外的异常,类型上都属于Exception类及其子类。从程序语法角度讲是必须进行处理的异常,如果不处理,程序就不能编译通过。需要用try-catch代码块处理或者在方法签名上使用throws关键字声明抛出。

捕获异常

如果要想对异常进行处理,则必须采用标准的处理格式,处理格式语法如下:

try {
// 有可能发生异常的代码段
} catch(异常类型1 对象名1) {
// 异常的处理操作
} catch(异常类型2 对象名2) {
// try+catch的处理流程
} finally {
// 异常的统一出口
}

1、 一旦产生异常,则系统会自动产生一个异常类的实例化对象。
2、 那么,此时如果异常发生在try语句,则会自动找到匹配的catch语句执行,如果没有在try语句中,则会将异常抛出.
3、 所有的catch根据方法的参数匹配异常类的实例化对象,如果匹配成功,则表示由此catch进行处理。
4、在进行异常的处理之后,在异常的处理格式中还有一个finally语句,那么此语句将作为异常的统一出口,不管是否产生了异常,最终都要执行此段代码。

throws关键字
在程序中异常的基本处理已经掌握了,但是随异常一起的还有一个称为throws关键字,此关键字主要在方法的声明上使用,表示方法中不处理异常,而交给调用处处理。
格式:

返回值 方法名称() throws Exception {
}

throw关键字
throw关键字表示在程序中人为的抛出一个异常,因为从异常处理机制来看,所有的异常一旦产生之后,实际上抛出的就是一个异常类的实例化对象,那么此对象也可以由throw直接抛出。
代码: throw new Exception("抛着玩的。") ;

异常处理常见面试题

  1. try-catch-finally 中哪个部分可以省略?
    答: catch和finally可以省略其中一个 , catch和finally不能同时省略
    注意:格式上允许省略catch块, 但是发生异常时就不会捕获异常了,我们在开发中也不会这样去写代码.

  2. try-catch-finally 中,如果 catch 中 return 了,finally 还会执行吗?
    答:finally中的代码会执行
    详解:
    执行流程:
    先计算返回值, 并将返回值存储起来, 等待返回
    执行finally代码块
    将之前存储的返回值, 返回出去;
    需注意:
    返回值是在finally运算之前就确定了,并且缓存了,不管finally对该值做任何的改变,返回的值都不会改变
    finally代码中不建议包含return,因为程序会在上述的流程中提前退出,也就是说返回的值不是try或catch中的值
    如果在try或catch中停止了JVM,则finally不会执行.例如停电- -, 或通过如下代码退出
    JVM:System.exit(0);

  3. 常见的 RuntimeException 有哪些?
    ClassCastException(类转换异常)
    IndexOutOfBoundsException(数组越界)
    NullPointerException(空指针)
    ArrayStoreException(数据存储异常,操作数组时类型不一致)
    还有IO操作的BufferOverflowException异常

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 来源:https://www.cnblogs.com/Qian123/p/5715402.html#_label0...
    Alex笔记阅读 387评论 0 1
  • 异常的概念 异常是程序中的一些错误,但并不是所有的错误都是异常,并且错误有时候是可以避免的。 比如说,你的代码少了...
    發財大力阅读 223评论 0 1
  • 一、概念介绍 异常是发生在程序执行过程中阻碍程序正常执行的错误事件,当一个程序出现错误时,可能的情况分为以下3种:...
    布衣不才Jerry阅读 407评论 0 1
  • 1. Java异常体系 Java异常体系设计的目的在于通过使用少量代码,实现大型、健壮、可靠程序。 1.1. 异常...
    Geekhalo阅读 221评论 0 0
  • 1.Error和Exception的联系? 继承关系:Error和Exception都是继承于Throwable,...
    聂叼叼阅读 590评论 0 2