Java面试之异常专题

1、下面关于java.lang.Exception类的说法正确的是()

A 继承自Throwable      B Serialable      CD 不记得,反正不正确

答案:A

解析:Java异常的基类为java.lang.Throwable,java.lang.Error和java.lang.Exception继承 Throwable,RuntimeException和其它的Exception等继承Exception,具体的RuntimeException继承RuntimeException。

扩展:错误和异常的区别(Error vs Exception) 

1) java.lang.Error: Throwable的子类,用于标记严重错误。合理的应用程序不应该去try/catch这种错误。绝大多数的错误都是非正常的,就根本不该出现的。

java.lang.Exception: Throwable的子类,用于指示一种合理的程序想去catch的条件。即它仅仅是一种程序运行条件,而非严重错误,并且鼓励用户程序去catch它。

2)  Error和RuntimeException 及其子类都是未检查的异常(unchecked exceptions),而所有其他的Exception类都是检查了的异常(checked exceptions).

checked exceptions: 通常是从一个可以恢复的程序中抛出来的,并且最好能够从这种异常中使用程序恢复。比如FileNotFoundException, ParseException等。检查了的异常发生在编译阶段,必须要使用try…catch(或者throws)否则编译不通过。

unchecked exceptions: 通常是如果一切正常的话本不该发生的异常,但是的确发生了。发生在运行期,具有不确定性,主要是由于程序的逻辑问题所引起的。比如ArrayIndexOutOfBoundException, ClassCastException等。从语言本身的角度讲,程序不该去catch这类异常,虽然能够从诸如RuntimeException这样的异常中catch并恢复,但是并不鼓励终端程序员这么做,因为完全没要必要。因为这类错误本身就是bug,应该被修复,出现此类错误时程序就应该立即停止执行。 因此,面对Errors和unchecked exceptions应该让程序自动终止执行,程序员不该做诸如try/catch这样的事情,而是应该查明原因,修改代码逻辑。

RuntimeException:RuntimeException体系包括错误的类型转换、数组越界访问和试图访问空指针等等。

处理RuntimeException的原则是:如果出现 RuntimeException,那么一定是程序员的错误。例如,可以通过检查数组下标和数组边界来避免数组越界访问异常。其他(IOException等等)checked异常一般是外部错误,例如试图从文件尾后读取数据等,这并不是程序本身的错误,而是在应用环境中出现的外部错误。 

 

 

2、getCustomerInfo()方法如下,try中可以捕获三种类型的异常,如果在该方法运行中产生了一个IOException,将会输出什么结果()

public void getCustomerInfo() {

try {

// do something that may cause an Exception

} catch (java.io.FileNotFoundException ex) {

System.out.print("FileNotFoundException!");

} catch (java.io.IOException ex) {

System.out.print("IOException!");

} catch (java.lang.Exception ex) {

System.out.print("Exception!");

}

}

A 、IOException!

B、IOException!Exception!

C、FileNotFoundException!IOException!

D、FileNotFoundException!IOException!Exception!

答案:A

解析:考察多个catch语句块的执行顺序。当用多个catch语句时,catch语句块在次序上有先后之分。从最前面的catch语句块依次先后进行异常类型匹配,这样如果父异常在子异常类之前,那么首先匹配的将是父异常类,子异常类将不会获得匹配的机会,也即子异常类型所在的catch语句块将是不可到达的语句。所以,一般将父类异常类即Exception老大放在catch语句块的最后一个。

 

3、下列哪种异常是检查型异常,需要在编写程序时声明 ?

A、NullPointerException        B、ClassCastException     

C、FileNotFoundException       D 、IndexOutOfBoundsException 

答案:C

 

4、请列出 5 个运行时异常。

http://blog.csdn.net/woshixuye/article/details/8230407

NullPointerException:空指针异常 ArrayIndexOutOfBoundsException:数组下标越界 NumberFormatException:数字转换异常 IllegalArgumentException:参数不匹配异常 InstantiationException:对象初始化异常 ArithmeticException:算术异常

 

5、Java中异常分为哪两种?

编译时异常 运行时异常

 

6、说几个常见的编译时异常类?

ClassNotFoundException

CloneNotSupportedException

FileAlreadyExistsException

FileNotFoundException

InterruptedException

IOException

SQLException

TimeoutException

UnknownHostException

 

7、异常的处理机制有几种?

异常捕捉:try…catch…finally,异常抛出:throws。

 

8、如何自定义一个异常

继承一个异常类,通常是RumtimeException或者Exception

 

9、在异常捕捉时,如果发生异常,那么try.catch.finally块外的return语句会执行吗?

会执行,如果有finally,在finally之后被执行,如果没有finally,在catch之后被执行

 

10、Try.catch.finally是必须要存在的吗?

Try块必须存在,catch和finally可以不存在,但不能同时不存在

 

11、如果在try或catch块上放置return语句或System.exit()会发生什么?最后会阻止执行吗?

这是一个非常流行的棘手的Java问题,它很棘手,因为许多程序员认为无论如何,但finally块将始终执行。这个问题通过在try或catch块中放置一个return语句或从try或catch块调用System.exit()来挑战该概念。在Java中回答这个棘手的问题是,即使你在try块或catch块中放入一个return语句,finally块也会执行,但是如果你从try或catch块调用System.exit(),最后块将无法运行。

 

12、简单描述java异常体系

相比没有人不了解异常体系,关于异常体系的更多信息可以见

白话异常机制:http://blog.csdn.net/dd864140130/article/details/42504189

 

13、什么是异常链

详情直接参见上面的白话异常机制,不做解释了。

 

14、throw和throws的区别

throw用于主动抛出java.lang.Throwable 类的一个实例化对象,意思是说你可以通过关键字 throw 抛出一个 Error 或者 一个Exception,如:throw new IllegalArgumentException(“size must be multiple of 2″), 

而throws 的作用是作为方法声明和签名的一部分,方法被抛出相应的异常以便调用者能处理。Java 中,任何未处理的受检查异常强制在 throws 子句中声明。

 

15、在线程中你怎么处理不可捕捉异常   

      为了保证主线程不被阻塞,线程之间基本相互隔离,所以线程之间不论是异常还是通信都不共享。当然,因为你抓异常是主线程,而异常是在子线程出现,可以用thread.setUncaughtExceptionHandler()去处理线程的异常。在Thread中,Java提供了一个setUncaughtExceptionHandler的方法来设置线程的异常处理函数,你可以把异常处理函数传进去,当发生线程的未捕获异常的时候,由JVM来回调执行。类似的功能就可以组成线程池自己的异常处理机制,正常来说,你想在主线程异步执行子线程的代码并得知是否执行成功,可以直接使用Promise模式,即Java中线程池返回的Future对象。    

 

 

你可能感兴趣的:(Java面试)