java面试题07_异常
程序员文章站
2022-04-12 13:15:48
...
Q1:说一下Java中的异常体系?
Q2:Error和Exception的区别?
Error (错误):
系统中的错误,是在程序编译时出现的错误,只能通过修改程序才能修正。一般指的与虚拟机相关的问题,如系统崩溃,虚拟机错误,内存空间不足,方法调用栈溢出等。
Exception (异常):
表示程序可以处理的异常,可以捕获且可能恢复。遇到该类异常,应尽可能处理异常,使程序恢复运行,而不应该随意终止异常。
Q3:写出你最常见的5个RuntimeException?
- java.lang.NullPointerException(空指针异常):调用了未经初始化的对象或者是不存在的对象。
- java.lang.ClassNotFoundException(指定的类找不到):类的名称和路径加载错误;通常都是程序试图通过字符串来加载某个类时可能引发的异常。
- java.lang.NumberFormatException(字符串转化为数字异常):字符型数据中包含非数字型字符。
- java.lang.IndexOutOfBoundsException(数组下标越界异常):常见于操作数组对象时发生。
- java.lang.IllegalArgumentException:方法传递参数错误。
- java.lang.ClassCastException:数据类型转换异常。
Q4:如何处理异常?
1、异常处理的两种方式
- 自己处理
- 向上抛,交给调用者处理。
2、具体的处理方式的选择原则
- 自己明确的知道如何处理,就要处理掉。
- 不知道如何处理,就交给调用者处理。
注:异常, 不能捕获了之后什么也不做。或者只是使⽤e.printStacktrac
Q5:try()里面有⼀个return语句, 那么后面的finally{}里面的代码会不会被执行?什么时候执行,return前还是return后?
- 如果try中有return语句,那么finally中的代码还是会执行的。
- 因为return表示的是要整个方法体返回,所以,finally中的语句会在try中return之前执行。
- 但是return前执行的finally快内,对数据的修改效果对于引用类型和值类型会有所不同。
// 测试 修改值类型
static int f(){
int ret = 0;
try {
return ret; // 返回 0,finally内的修改效果不起作用
}finally {
++ret;
System.out.println("finally");
}
}
// 测试 修改引用类型
static int[] f2(){
int [] ret = new int[]{0};
try {
return ret; // 返回 [1],finally内的修改效果起了作用
}finally {
ret[0]++;
System.out.println("finally执行了···");
}
}
Q6:调用下面方法会返回什么值?
异常机制:
有这么一个原则,如果在catch中遇到return或者异常等能使函数终止的事件,那么有finally就必须先执行完finally代码块里边的代码然后再返回catch/try中的返回值
分析:
代码走到第3行的时候会遇到一个MathException,这时第四行的代码就不会执行了,代码直接跳转到catch语句中,走到第6行的时候(异常机制),因此代码又跳到第8行,可惜第8行是一个return语句,那么这个时候方法就结束了,因此第6行的返回结果就无法被真正返回。(如果finally仅仅是处理了一个释放资源的操作,那么该道题最终返回的结果就是2。)因此上面返回值是3
1 public int getNum(){
2 try {
3 int i=1/0;
4 return 1;
5 }catch (Exception e){
6 return 2;
7 }finally {
8 return 3;
9 }
10 }
Q7:throw和throws的区别?
throw:
- throw语句用在方法体内,表示抛出异常,由方法体内的语句处理
- throw是具体向外抛出异常的动作,所以抛出的是一个异常实例,执行throw一定是抛出了某种异常。
throws:
- throws语句是用在方法声明后边,表示如果抛出异常,由该方法的调用者来进行异常的处理。
- throws主要是声明这个方法抛出某种类型的异常,让它的使用者知道需要知道需要捕获的异常的类型。
- throws表示出现异常的一种可能性,并不一定会发生这种异常。
Q8:java 中 finally 块一定会执行吗?
答:不一定,分情况。
- 因为首先想要执行 finally 块的前提是必须执行到了 try 块,当在 try 块或者 catch 块中有 System.exit(0); 这样的语句存在时 finally 块就不会被执行到了,因为程序被结束了。
- 此外当在 try 块或者 catch 块里 return 时 finally 会被执行;而且 finally 块里 return 语句会把 try 块或者 catch 块里的 return 语句效果给覆盖掉且吞掉了异常。
static void f3(){
try {
int i=10/0;
System.out.println("try");
}
catch (Exception e){
System.out.println("catch");
System.exit(1);
}
finally {
System.out.println("finally");
}
}
Q9:谈谈final、finally、finalize区别?
- final用于声明属性、方法和类,分别表示属性不可变、方法不可覆盖、类不可继承。
- finally是异常处理语句结构的一部分,表示总是执行。
- finalize是 Object类的一个方法,在垃圾收集器执行的时候,会调用被回收对象的此方法,可以覆盖此方法,提供垃圾收集时的其他资源回收,例如关闭文件等。
上一篇: java面试题-异常结束
下一篇: Java面试笔记