本文由 ImportNew - 韩远青 翻译自 Journaldev。java
Java提供了一个健壮的、面向对象的方法来处理出现异常,称为Java异常处理。我之前写过一篇长文章来介绍Java异常处理,今天我将列出一些重要的Java异常面试的问题及答案,但愿对大家的面试有所帮助。面试
答:异常是发生在程序执行过程当中阻碍程序正常执行的错误事件。好比:用户输入错误数据、硬件故障、网络阻塞等都会致使出现异常。只要在Java语句执行中产生了异常,一个异常对象就会被建立,JRE就会试图寻找异常处理程序来处理异常。若是有合适的异常处理程序,异常对象就会被异常处理程序接管,不然,将引起运行环境异常,JRE终止程序执行。 Java异常处理框架只能处理运行时错误,编译错误不在其考虑范围以内。数组
答:框架
· throw:有时咱们须要显式地建立并抛出异常对象来终止程序的正常执行。throw关键字用来抛出并处理运行时异常。翻译
· throws:当咱们抛出任何“被检查的异常(checked exception)”并不处理时,须要在方法签名中使用关键字throws来告知调用程序此方法可能会抛出的异常。调用方法可能会处理这些异常,或者一样用throws来将异常传给上一级调用方法。throws关键字后可接多个潜在异常,甚至是在main()中也可使用throws。调试
· try-catch:咱们在代码中用try-catch块处理异常。固然,一个try块以后能够有多个catch子句,try-catch块也能嵌套。每一个catch块必须接受一个(且仅有一个)表明异常类型的参数。日志
· finally:finally块是可选的,而且只能配合try-catch一块儿使用。虽然异常终止了程序的执行,可是还有一些打开的资源没有被关闭,所以,咱们能使用finally进行关闭。无论异常有没有出现,finally块总会被执行。对象
答:Java异常是层级的,并经过继承来区分不一样种类的异常。
· Throwable是全部异常的父类,它有两个直接子对象Error,Exception,其中Exception又被继续划分为“被检查的异常(checked exception)”和”运行时的异常(runtime exception,即不受检查的异常)”。 Error表示编译时和系统错误,一般不能预期和恢复,好比硬件故障、JVM崩溃、内存不足等。
· 被检查的异常(Checked exception)在程序中能预期,并要尝试修复,如FileNotFoundException。咱们必须捕获此类异常,并为用户提供有用信息和合适日志来进行调试。Exception是全部被检查的异常的父类。
· 运行时异常(Runtime Exception)又称为不受检查异常,源于糟糕的编程。好比咱们检索数组元素以前必须确认数组的长度,不然就可能会抛出ArrayIndexOutOfBoundException运行时异常。RuntimeException是全部运行时异常的父类。
4.Java异常类有哪些的重要方法?
答:Exception和它的全部子类没有提供任何特殊方法供使用,它们的全部方法都是来自其基类Throwable。
· String getMessage():方法返回Throwable的String型信息,当异常经过构造器建立后可用。
· String getLocalizedMessage():此方法经过被重写来获得用本地语言表示的异常信息返回给调用程序。Throwable类一般只是用getMessage()方法来实现返回异常信息。
· synchronized Throwable getCause():此方法返回异常产生的缘由,若是不知道缘由的话返回null。(原文有拼写错误 应该是if 不是id)
· String toString():方法返回String格式的Throwable信息,此信息包括Throwable的名字和本地化信息。
· void printStackTrace():该方法打印栈轨迹信息到标准错误流。该方法能接受PrintStream 和PrintWriter做为参数实现重载,这样就能实现打印栈轨迹到文件或流中。
5.描述Java 7 ARM(Automatic Resource Management,自动资源管理)特征和多个catch块的使用
答:若是一个try块中有多个异常要被捕获,catch块中的代码会变丑陋的同时还要用多余的代码来记录异常。有鉴于此,Java 7的一个新特征是:一个catch子句中能够捕获多个异常。示例代码以下:
catch(IOException | SQLException | Exception ex){
logger.error(ex);
throw new MyException(ex.getMessage());
}
大多数状况下,当忘记关闭资源或因资源耗尽出现运行时异常时,咱们只是用finally子句来关闭资源。这些异常很难调试,咱们须要深刻到资源使用的每一步来肯定是否已关闭。所以,Java 7用try-with-resources进行了改进:在try子句中能建立一个资源对象,当程序的执行完try-catch以后,运行环境自动关闭资源。下面是这方面改进的示例代码:
try (MyResource mr = new MyResource()) {
System.out.println("MyResource created in try-with-resources");
} catch (Exception e) {
e.printStackTrace();
}