Java异常面试题
文章树列

异常面试

一.1 Exception

异常:★★★

异常处理原则:功能抛出几个异常,功能调用如果进行try处理,需要与之对应的catch处理代码块,这样的处理有针对性,抛几个就处理几个。

特殊情况:try对应多个catch时,如果有父类的catch语句块,一定要放在下面。

一.1.1 throw和throws关键字的区别:

throw用于抛出异常对象,后面跟的是异常对象;throw用在函数内。

throws用于抛出异常类,后面跟的异常类名,可以跟多个,用逗号隔开。throws用在函数上。

一.1.2 final,finally,finalize的区别

final用于声明属性,方法和类,分别表示属性不可变,方法不可覆盖,类不可继承。

内部类要访问局部变量,局部变量必须定义成final类型,例如,一段代码……

finally是异常处理语句结构的一部分,表示总是执行。

finalize是Object类的一个方法,在垃圾收集器执行的时候会调用被回收对象的此方法,可以覆盖此方法提供垃圾收集的方法时的其他资源回收,例如关闭文件等。JVM不保证此方法总被调用。

1、对于一个final变量,如果是基本数据类型的变量,则其数值一旦在初始化之后便不能更改;如果是引用类型的变量,则在对其初始化之后便不能再让其指向另一个对象。

2、当用final修饰一个类时,表明这个类不能被继承。final类中的所有成员方法都会被隐式地指定为final方法。

3、使用final方法的原因有两个。第一个原因是把方法锁定,以防任何继承类修改它的含义;第二个原因是效率。

在早期的Java实现版本中,会将final方法转为内嵌调用。但是如果方法过于庞大,可能看不到内嵌调用带来的任何性能提升(现在的Java版本已经不需要使用final方法进行这些优化了)。类中所有的private方法都隐式地指定为fianl

一.1.3 最常见的runtimeexception运行时异常?

ClassCastException(类型转换异常)、NumberFormatException(格式化异常)、ArrayIndexOutOfBoundsException(数组越界异常)、ArithmeticException(算术异常)、NullPointerException(空指针异常)等等

这道题主要考查大家平时在项目开发过程中经常遇到的一些异常类型信息,通过这些异常来考查大家的项目经验与项目排错能力。

一.1.4 try{}里有一个return语句,那么紧跟在这个try后的finally{}里的code会不会被执行,什么时候被执行,在return前还是后?【杭州天眼科技】

答案是在return之前。

程序代码的运行结果:

publicclassTest{

publicstaticvoidmain(String[]args){

//TODOAuto-generatedmethodstub

System.out.println(newTest().test());;

}

staticinttest()

{

intx=1;

try

{

returnx;

}

finally

{

++x;

}

}

}

---------执行结果---------

1

运行结果是1,为什么呢?主函数调用子函数并得到结果的过程,好比主函数准备一个空罐子,当子函数要返回结果时,先把结果放在罐子里,然后再将程序逻辑返回到主函数。所谓返回,就是子函数说,我不运行了,你主函数继续运行吧,这没什么结果可言,结果是在说这话之前放进罐子里的。

下面的程序代码输出的结果是多少?

publicclasssmallT{

publicstaticvoidmain(Stringargs[]){

smallTt=newsmallT();

intb=t.get();

System.out.println(b);

}

publicintget(){

try

{

return1;

}

finally

{

return2;

}

}

}

返回的结果是2。

我可以通过下面一个例子程序来帮助我解释这个答案,从下面例子的运行结果中可以发现,try中的return语句调用的函数先于finally中调用的函数执行,也就是说return语句先执行,finally语句后执行,所以,返回的结果是2。Return并不是让函数马上返回,而是return语句执行后,将把返回结果放置进函数栈中,此时函数并不是马上返回,它要执行finally语句后才真正开始返回。

在讲解答案时可以用下面的程序来帮助分析:

publicclassTest{

/**

*@paramargsaddbyzxx,Dec9,2008

*/

publicstaticvoidmain(String[]args){

//TODOAuto-generatedmethodstub

System.out.println(newTest().test());;

}

inttest()

{

try

{

returnfunc1();

}

finally

{

returnfunc2();

}

}

intfunc1()

{

System.out.println("func1");

return1;

}

intfunc2()

{

System.out.println("func2");

return2;

}

}

-----------执行结果-----------------

func1

func2

2

结论:finally中的代码比return和break语句后执行。

一.1.5 Java的异常有哪几种,有什么区别?

两大类,一般异常和运行时异常。

一般异常,这些异常是在定义方法时声明抛出的,这些异常必需用trycatch抛出,或throws处理,如果不处理,程序将编译失败。比如:IOException、FileNotFoundException、SQLException等。

运行时异常是程序运行时可能报出的异常。可以用trycatch抓取,也可以不做任何处理。例如:NullPointerException异常就是一种比较常见的运行时异常。

 

 

在Java中,所有的异常都有一个共同的祖先java.lang包中的Throwable类。Throwable:有两个重要的子类:

Exception(异常)和Error(错误),二者都是Java异常处理的重要子类,各自都包含大量子类。

Error(错误):是程序无法处理的错误,表示运行应用程序中较严重问题。大多数错误与代码编写者执行的操作无关,而表示代码运行时JVM(Java虚拟机)出现的问题。例如,Java虚拟机运行错误(VirtualMachineError),当JVM不再有继续执行操作所需的内存资源时,将出现OutOfMemoryError。这些异常发生时,Java虚拟机(JVM)一般会选择线程终止。

这些错误表示故障发生于虚拟机自身、或者发生在虚拟机试图执行应用时,如Java虚拟机运行错误(VirtualMachineError)、类定义错误(NoClassDefFoundError)等。这些错误是不可查的,因为它们在应用程序的控制和处理能力之外,而且绝大多数是程序运行时不允许出现的状况。对于设计合理的应用程序来说,即使确实发生了错误,本质上也不应该试图去处理它所引起的异常状况。在Java中,错误通过Error的子类描述。

Exception(异常):是程序本身可以处理的异常。Exception类有一个重要的子类RuntimeException。

RuntimeException异常由Java虚拟机抛出。NullPointerException(要访问的变量没有引用任何对象时,抛出该异常)、ArithmeticException(算术运算异常,一个整数除以0时,抛出该异常)和ArrayIndexOutOfBoundsException(下标越界异常)。

注意:异常和错误的区别:异常能被程序本身可以处理,错误是无法处理。

Throwable类常用方法

publicstringgetMessage():返回异常发生时的详细信息

publicstringtoString():返回异常发生时的简要描述

publicstringgetLocalizedMessage():返回异常对象的本地化信息。使用Throwable的子类覆盖这个方法,可以声称本地化信息。如果子类没有覆盖该方法,则该方法返回的信息与getMessage()返回的结果相同

publicvoidprintStackTrace():在控制台上打印Throwable对象封装的异常信息

一.1.1 异常处理总结

try块:用于捕获异常。其后可接零个或多个catch块,如果没有catch块,则必须跟一个finally块。

catch块:用于处理try捕获到的异常。

inally块:无论是否捕获或处理异常,finally块里的语句都会被执行。当在try块或catch块中遇到return语句时,finally语句块将在方法返回之前被执行。

在以下4种特殊情况下,finally块不会被执行:

1.在finally语句块中发生了异常。

2.在前面的代码中用了System.exit()退出程序。

3.程序所在的线程死亡。

4.关闭CPU。

一.1.2 JAVA语言如何进行异常处理,关键字:throws,throw,try,catch,finally分别代表什么意义?在try块中可以抛出异常吗?

Java使用面向对象的方式来处理异常,它把程序中发生的每个异常也都分别封装到一个对象来表示的,该对象中包含有异常的信息。而throws\throw\try、catch、finally就是Java中用来对异常进行处理的几个关键字,在Java编程中规容Java编译器强制普通异常必须try..catch处理或用throws声明继续抛给上层调用方法处理,一般异常必须要求被捕获和处理,而系统异常可以处理也可以不处理,所以编译器不强制用try..catch处理或用throws、throw声明异常。而finally一般与try或try\catch一起使用做为异常的最后处理出口。

一.1.3 Java中的异常处理机制的简单原理和应用。

异常是指java程序运行时(非编译)所发生的非正常情况或错误,与现实生活中的事件很相似,现实生活中的事件可以包含事件发生的时间、地点、人物、情节等信息,可以用一个对象来表示,Java使用面向对象的方式来处理异常,它把程序中发生的每个异常也都分别封装到一个对象来表示的,该对象中包含有异常的信息。

Java对异常进行了分类,不同类型的异常分别用不同的Java类表示,所有异常的根类为java.lang.Throwable,Throwable下面又派生了两个子类:Error和Exception,Error表示应用程序本身无法克服和恢复的一种严重问题,程序只有死的份了,例如,说内存溢出和线程死锁等系统问题。Exception表示程序还能够克服和恢复的问题,其中又分为系统异常和普通异常,系统异常是软件本身缺陷所导致的问题,也就是软件开发人员考虑不周所导致的问题,软件使用者无法克服和恢复这种问题,但在这种问题下还可以让软件系统继续运行或者让软件死掉,例如,数组脚本越界(ArrayIndexOutOfBoundsException),空指针异常(NullPointerException)、类转换异常(ClassCastException);普通异常是运行环境的变化或异常所导致的问题,是用户能够克服的问题,例如,网络断线,硬盘空间不够,发生这样的异常后,程序不应该死掉。

java为系统异常和普通异常提供了不同的解决方案,编译器强制普通异常必须try..catch处理或用throws声明继续抛给上层调用方法处理,所以普通异常也称为checked异常,而系统异常可以处理也可以不处理,所以,编译器不强制用try..catch处理或用throws声明,所以系统异常也称为unchecked异常。

一.1.4 Error和exception的区别与联系?

error表示恢复不是不可能,但很困难的情况下的一种严重问题。比如说内存溢,网络故障等,不可能指望程序能处理的一类错误。

Exception表示一种由程序设计或实现问题,表示程序运行时异常,如空指针异常数组下标越界。像我们常说的异常处理,就是属于这类,一般程序可以捕获和处理这些异常。

 

新版下载
本文原创,商业转载请联系作者获得授权,非商业转载请注明出处。

评论

发送评论 编辑评论


                        

后端技术分类热门文章

标签热门文章排行

☛免责声明 ☛本站使用教程
Theme Argon With Ry-Plus By 清欢
我的第21918位朋友,历经127608次回眸才与你相遇
内容失效/资源代找/交流学习
内容失效/资源代找/交流学习