目录
典型回答
什么是Throwable
Error和Exception的区别和联系
Java异常处理相关的几个关键字,以及简单用法
什么是自定义异常,如何使用自定义异常
Java异常体系结构
以下关于异常处理的代码有哪些问题
-
典型回答
- Java中的异常,主要可以分为两大类,即受检异常(checked exception)和 非受检异常(unchecked exception)
- 对于受检异常来说,如果一个方法在声明的过程中证明了其要有受检异常抛出:
- 那么,当在程序中调用他的时候,一定要对该异常进行处理(捕获或者向上抛出),否则是无法编译通过的
- 这是一种强制规范
- 这种异常在IO操作中比较多
- 比如FileNotFoundException,当使用IO流处理一个文件的时候,有一种特殊情况,就是文件不存在,所以在文件处理的接口定义时他会显示抛出FileNotFoundException,目的就是告诉这个方法的调用者,我这个方法不保证一定可以成功,是有可能找不到对应的文件的,你要明确的对这种情况做特殊处理
- 所以说,当我们希望我们的方法调用者,明确的处理一些特殊情况的时候,就应该使用受检异常
- 对于非受检异常来说,一般是运行时异常,继承自RuntimeException
- 在编写代码的时候,不需要显示的捕获,但是如果不捕获,在运行期如果发生异常就会中断程序的执行
- 这种异常一般可以理解为是代码原因导致的
- 比如发生空指针、数组越界等
- 所以只要代码写的没问题,这些异常都是可以避免的
- 也就不需要我们显示的进行处理
- 试想一下,如果你要对所有可能发生空指针的地方做异常处理的话,那相当于你的所有代码都需要做这件事
-
什么是Throwable
- Throwable是java中最顶级的异常类,继承Object,实现了序列化接口
- 有两个重要的子类:Exception和Error,二者都是 Java 异常处理的重要子类,各自都包含大量子类
-
Error和Exception的区别和联系
- error表示系统级的错误,是java运行环境内部错误或者硬件问题,不能指望程序来处理这样的问题,除了退出运行外别无选择,它是Java虚拟机抛出的
- 如OutOfMemoryError、StackOverflowError这两种常见的错误都是ERROR
- exception表示程序需要捕捉、需要处理的异常,是由与程序设计的不完善而出现的问题,程序必须处理的问题
- 分为RuntimeException和其他异常
- 异常能被程序本身处理,错误是无法处理
-
Java异常处理相关的几个关键字,以及简单用法
- throws、throw、try、catch、finally
- 1-try用来指定一块预防所有异常的程序
- 2-catch子句紧跟在try块后面,用来指定你想要捕获的异常的类型
- 3-finally为确保一段代码不管发生什么异常状况都要被执行
- 4-throw语句用来明确地抛出一个异常
- 5-throws用来声明一个方法可能抛出的各种异常
-
什么是自定义异常,如何使用自定义异常
- 自定义异常就是开发人员自己定义的异常,一般通过继承Exception的子类的方式实现
- 编写自定义异常类实际上是继承一个API标准异常类,用新定义的异常处理信息覆盖原有信息的过程
- 这种用法在Web开发中也比较常见,一般可以用来自定义业务异常
- 如余额不足、重复提交等
- 这种自定义异常有业务含义,更容易让上层理解和处理
-
Java异常体系结构
- Java中所有的异常都来自顶级父类Throwable
- Throwable继承自Object,实现了序列化接口
- Throwable下面有两个子类Exception和Error
- 二者都是Java异常处理的重要子类,各自都包含大量子类
-
以下关于异常处理的代码有哪些问题
- 1-#start 方法不会发生IOException,所以不需要throw
- 2-RuntimeExcption不需要显式的throw
- 3-catch的时候,要先从子类开始catch,代码中catch的顺序不对
- 4-没有关闭流
- 5-return之前的finally block是会被执行的
- 上述代码,如何优化
- try-with-resource的原理
- javac使用了语法糖进行优化
- Java中异常的处理方式有哪几种?一般如何选择
- 异常的处理方式有两种
- 1-自己处理
- 2-向上抛,交给调用者处理
- 异常,千万不能捕获了之后什么也不做
- 或者只是使用e.printStacktrace
- 具体的处理方式的选择其实原则比较简明:自己明确的知道如何处理的,就要处理掉;不知道如何处理的,就交给调用者处理
- finally中代码一定会执行吗
- 通常情况下,finally的代码一定会被执行
- 但是这是有前提的:
- 1-对应 try 语句块被执行
- 2-程序正常运行
- 如果没有符合这两个条件的话,finally中的代码就无法被执行
- 如发生以下情况,都会导致finally不会执行:
- 1-System.exit()方法被执行
- 2-Runtime.getRuntime().halt()方法被执行
- 3-try或者catch中有死循环
- 4-操作系统强制杀掉了JVM进程,如执行了kill -9
- 5-其他原因导致的虚拟机崩溃了
- 6-虚拟机所运行的环境挂了,如计算机电源断了
- 7-finally块即将被后台线程(deamon)执行前,其他的所有非后台线程都已执行完了