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对象。