- 1、finally 块中的代码什么时候被执⾏?
- 答:
在 Java 语⾔的异常处理中,finally 块的作⽤就是为了保证⽆论出现什么情况,finally 块⾥的代码⼀定会被执⾏。
由于程序执⾏ return 就意味着结束对当前函数的调⽤并跳出这个函数体,因此任何语句要执⾏都只能在 return 前
执⾏(除⾮碰到 exit 函数),因此 finally 块⾥的代码也是在 return 之前执⾏的。
此外,如果 try-finally 或者 catch-finally 中都有 return,那么 finally 块中的 return 将会覆盖别处的 return 语
句,最终返回到调⽤者那⾥的是 finally 中 return 的值。
———————————————————————————————————————————— - 2、finally 是不是⼀定会被执⾏到?
- 答:
不⼀定。下⾯列举两种执⾏不到的情况:
(1)当程序进⼊ try 块之前就出现异常时,会直接结束,不会执⾏ finally 块中的代码;
(2)当程序在 try 块中强制退出时也不会去执⾏ finally 块中的代码,⽐如在 try 块中执⾏ exit ⽅法。
————————————————————————————————————————————— - 3、try-catch-finally 中,如果 catch 中 return 了,finally 还会执⾏
吗? - 答:
会。程序在执⾏到 return 时会⾸先将返回值存储在⼀个指定的位置,其次去执⾏ finally 块,最后再返回。因此,
对基本数据类型,在 finally 块中改变 return 的值没有任何影响,直接覆盖掉;⽽对引⽤类型是有影响的,返回的
是在 finally 对 前⾯ return 语句返回对象的修改值。
—————————————————————————————————————————————— - 4、try-catch-finally 中那个部分可以省略?
- 答:
catch 可以省略。try 只适合处理运⾏时异常,try+catch 适合处理运⾏时异常+普通异常。也就是说,如果你只⽤
try 去处理普通异常却不加以 catch 处理,编译是通不过的,因为编译器硬性规定,普通异常如果选择捕获,则必
须⽤ catch 显示声明以便进⼀步处理。⽽运⾏时异常在编译时没有如此规定,所以 catch 可以省略,你加上 catch
编译器也觉得⽆可厚⾮。
———————————————————————————————————————————————— - 5、Error 和 Exception 的区别?
- 答:
Error 类和 Exception 类的⽗类都是 Throwable 类。主要区别如下:
Error 类: ⼀般是指与虚拟机相关的问题,如:系统崩溃、虚拟机错误、内存空间不⾜、⽅法调⽤栈溢出等。这类
错误将会导致应⽤程序中断,仅靠程序本身⽆法恢复和预防;
Exception 类:分为运⾏时异常和受检查的异常。
—————————————————————————————————————————————————— - 6、运⾏时异常与受检异常有何异同?
- 答:
运⾏时异常:如:空指针异常、指定的类找不到、数组越界、⽅法传递参数错误、数据类型转换错误。可以编译通
过,但是⼀运⾏就停⽌了,程序不会⾃⼰处理;
受检查异常:要么⽤ try … catch… 捕获,要么⽤ throws 声明抛出,交给⽗类处理。
—————————————————————————————————————————————————— - 7、throw 和 throws 的区别?
- 答:
(1)throw:在⽅法体内部,表示抛出异常,由⽅法体内部的语句处理;throw 是具体向外抛出异常的动作,所
以它抛出的是⼀个异常实例;
(2)throws:在⽅法声明后⾯,表示如果抛出异常,由该⽅法的调⽤者来进⾏异常的处理;表示出现异常的可能
性,并不⼀定会发⽣这种异常。
———————————————————————————————————————————————————— - 8、常⻅的异常类有哪些?
- 答:
NullPointerException:当应⽤程序试图访问空对象时,则抛出该异常。
SQLException:提供关于数据库访问错误或其他错误信息的异常。
IndexOutOfBoundsException:指示某排序索引(例如对数组、字符串或向量的排序)超出范围时抛出。
FileNotFoundException:当试图打开指定路径名表示的⽂件失败时,抛出此异常。
IOException:当发⽣某种 I/O 异常时,抛出此异常。此类是失败或中断的 I/O 操作⽣成的异常的通⽤类。
ClassCastException:当试图将对象强制转换为不是实例的⼦类时,抛出该异常。
IllegalArgumentException:抛出的异常表明向⽅法传递了⼀个不合法或不正确的参数。
———————————————————————————————————————————————————— - 9、主线程可以捕获到⼦线程的异常吗?
- 答:
线程设计的理念:“线程的问题应该线程⾃⼰本身来解决,⽽不要委托到外部”。
正常情况下,如果不做特殊的处理,在主线程中是不能够捕获到⼦线程中的异常的。如果想要在主线程中捕获⼦线
程的异常,我们可以⽤如下的⽅式进⾏处理,使⽤ Thread 的静态⽅法
——————————————————————————————————————————
- 10、Java中怎么分异常?
- 答:
- 所谓异常是指程序在运行过程中发生的一些不正常事件。(如:除0溢出,数组下标越界,所读取的文件不存在)
异常又可以分为:编译时异常,运行时异常
———————————————————————————————————————————— - 11、异常的处理机制有哪几种?
- 答:
异常捕捉:try…catch…finally,异常抛出:throws。
————————————————————————————————————————————— - 12、try catch fifinally,try里有return,finally还执行么?
- 答:
执行,并且finally的执行早于try里面的return
结论:
1.不管有木有出现异常,finally块中代码都会执行;
2.当try和catch中有return时,finally仍然会执行;
3.finally是在return后面的表达式运算后执行的(此时并没有返回运算后的值,而是先把要返回的值保存起来,管finally中的代码怎么样,返回的值都不会改变,任然是之前保存的值),所以函数返回值是在finally执行前确定的;
4.finally中最好不要包含return,否则程序会提前退出,返回值不是try或catch中保存的返回值。
————————————————————————————————————————————————— - 13、 Excption与Error包结构请解释一下。
- 答:
Java可抛出(Throwable)的结构分为三种类型:被检查的异常(CheckedException),运行时异常
(RuntimeException),错误(Error)。
1.运行时异常
定义:RuntimeException及其子类都被称为运行时异常。
特点:Java编译器不会检查它。也就是说,当程序中可能出现这类异常时,倘若既"没有通过throws声明抛出它",也"没有用try-catch语句捕
获它",还是会编译通过。例如,除数为零时产生的ArithmeticException异常,数组越界时产生的IndexOutOfBoundsException异常,failfast机制产生的ConcurrentModi?cationException异常(java.util包下面的所有的集合类都是快速失败的,“快速失败”也就是fail-fast,它是
Java集合的一种错误检测机制。当多个线程对集合进行结构上的改变的操作时,有可能会产生fail-fast机制。记住是有可能,而不是一定。
例如:假设存在两个线程(线程1、线程2),线程1通过Iterator在遍历集合A中的元素,在某个时候线程2修改了集合A的结构(是结构上面的修改,而不是简单的修改集合元素的
内容),那么这个时候程序就会抛出ConcurrentModi?cationException 异常,从而产生fail-fast机制,这个错叫并发修改异常。Fail-safe,java.util.concurrent包下面的所有的类都是安全失败的,在遍历过程中,如果已经遍历的数组上的内容变化了,迭代器不会抛出
ConcurrentModi?cationException异常。如果未遍历的数组上的内容发生了变化,则有可能反映到迭代过程中。这就是
ConcurrentHashMap迭代器弱一致的表现。ConcurrentHashMap的弱一致性主要是为了提升效率,是一致性与效率之间的一种权衡。要成为强一致性,就得到处使用锁,甚至是全局锁,这就与Hashtable和同步的HashMap一样了。)等,都属于运行时异常。
常见的五种运行时异常:
ClassCastException(类转换异常)
IndexOutOfBoundsException(数组越界)
NullPointerException(空指针异常)
ArrayStoreException(数据存储异常,操作数组是类型不一致)
Bu?erOver?owException
2.被检查异常
定义:Exception类本身,以及Exception的子类中除了"运行时异常"之外的其它子类都属于被检查异常。特点 : Java编译器会检查它。此类异常,要么通过throws进行声明抛出,要么通过try-catch进行捕获处理,否则不能通过编译。例如,CloneNotSupportedException就属于被
检查异常。当通过clone()接口去克隆一个对象,而该对象对应的类没有实现Cloneable接口,就会抛出CloneNotSupportedException异常。被检查异常通常都是可以恢复的。
如:
IOException
FileNotFoundException
SQLException
被检查的异常适用于那些不是因程序引起的错误情况,比如:读取文件时文件不存在引发的FileNotFoundException 。然而,不被检查的异
常通常都是由于糟糕的编程引起的,比如:在对象引用时没有确保对象非空而引起的 NullPointerException 。
3.错误
定义 : Error类及其子类。
特点 : 和运行时异常一样,编译器也不会对错误进行检查。当资源不足、约束失败、或是其它程序无法继续运行的条件发生时,就产生错误。程序本身无法修复这些错误的。例如,VirtualMachineError就属于错误。出现这种错误会导致程序终止运行。OutOfMemoryError、ThreadDeath。
Java虚拟机规范规定JVM的内存分为了好几块,比如堆,栈,程序计数器,方法区等。
———————————————————————————————————————————— - 14、final, finally, finalize的区别。
- 答:
final用于声明属性,方法和类,分别表示属性不可交变,方法不可覆盖,类不可继承。
finally是异常处理语句结构的一部分,表示总是执行。
finalize是Object类的一个方法,在垃圾收集器执行的时候会调用被回收对象的此方法,供垃圾收集时的其他资源回收,例如关闭文件等。
————————————————————————————————————————————— - 15、Java中的异常处理机制的简单原理和应用。
- 答:
当JAVA程序违反了JAVA的语义规则时,JAVA虚拟机就会将发生的错误表示为一个异常。违反语义规则包括2种情况。一种是JAVA类库内置的语义检查。例如数组下标越界,会引发IndexOutOfBoundsException;访问null的对象时会引发NullPointerException。另一种情况就是JAVA允许程序员扩展这种语义检查,程序员可以创建自己的异常,并自由选择在何时用throw关键字引发异常。所有的异常都是java.lang.Thowable的子类。
—————————————————————————————————————————— - 16、编程题: