1.throw 和 throws 的区别?
throw:定义在函数内部,后面只能跟一个异常对象,抛出具体问题,让调用者去处理。
throws:定义在函数上,后面可以跟多个异常类,用于声明函数,告诉调用者该功能可能具备的问题,并让调用者给出预定义的处理方式。
2.final、finally、finalize 有什么区别?
final:定义在类,方法,变量上,修饰类不能被继承,修饰方法,方法不能被覆盖,修饰变量,变量不能被改变。
finally:一般使用在try-catch-finally中,通常在finally中写资源释放的代码
finalize:垃圾回收器调用的方法,当我们执行System.gc(),垃圾回收器就会调用finalize()回收垃圾。
3.try-catch-finally 中哪个部分可以省略?
catch:可以省略,表示没异常需要处理 try-finally
finally:表示没有资源需要释放 try-catch
4.try-catch-finally 中,如果 catch 中 return 了,finally 还会执行吗?
会执行,会在return前执行
在try-catch-finally中, 当return遇到finally,return对finally无效,即:
1.在try catch块里return的时候,finally也会被执行。
2.finally里的return语句会把try catch块里的return语句效果给覆盖掉。
/*
* catch中存在return,而finally中不存在
*/
public class FinallyDemo2 {
public static void main(String[] args) {
System.out.println(getInt());
}
public static int getInt() {
int a = 10;
try {
System.out.println(a / 0);
a = 20;
} catch (ArithmeticException e) {
a = 30;
return a;
/*
* return a 在程序执行到这一步的时候,这里不是return a 而是 return 30;这个返回路径就形成了
* 但是呢,它发现后面还有finally,所以继续执行finally的内容,a=40
* 再次回到以前的路径,继续走return 30,形成返回路径之后,这里的a就不是a变量了,而是常量30
*/
} finally {
a = 40;
}
}
}
//分析:catch中会return 30,但是发现后面还有finally,所以转去执行finally,finally中执行完毕后,再次回到catch的return 30,返回结果30常量。
结果:30
package com.java_02;
/*
* java面试题--如果catch里面有return语句,finally里面的代码还会执行吗?
*/
public class FinallyDemo2 {
public static void main(String[] args) {
System.out.println(getInt());
}
public static int getInt() {
int a = 10;
try {
System.out.println(a / 0);
a = 20;
} catch (ArithmeticException e) {
a = 30;
return a;
/*
* return a 在程序执行到这一步的时候,这里不是return a 而是 return 30;这个返回路径就形成了
* 但是呢,它发现后面还有finally,所以继续执行finally的内容,a=40
* 再次回到以前的路径,继续走return 30,形成返回路径之后,这里的a就不是a变量了,而是常量30
*/
} finally {
a = 40;
return a; //如果这样,就又重新形成了一条返回路径,由于只能通过1个return返回,所以这里直接返回40
}
}
}
//分析:catch中会return 30,但是发现后面还有finally,所以转去执行finally,finally在执行的过程中,发现有return 40;又因为函数只能有一个返回值,所以直接返回40.
结果:40
5.常见的异常类有哪些?
RuntimeException
序号 | 异常名称 | 异常描述 |
---|---|---|
1 | java.lang.ArrayIndexOutOfBoundsException | 数组索引越界异常。 |
2 | java.lang.ArithmeticException | 算术条件异常。譬如:整数除零等。 |
3 | java.lang.SecurityException | 安全性异常 |
4 | java.lang.IllegalArgumentException | 非法参数异常 |
5 | java.lang.ArrayStoreException | 数组中包含不兼容的值抛出的异常 |
6 | java.lang.NegativeArraySizeException | 数组长度为负异常 |
7 | java.lang.NullPointerException | 空指针异常。 |
CheckedException子类
序号 | 异常名称 | 异常描述 |
---|---|---|
1 | IOException | 操作输入流和输出流时可能出现的异常 |
2 | EOFException | 文件已结束异常 |
3 | FileNotFoundException | 文件未找到异常 |
6什么情况下,finally中的语句不会执行
try执行之前,程序已经返回
try执行之前,程序发生异常
finally之前,程序执行了System.exit(0);
在后台执行的线程中,当前台线程终止时,后台线程中的fianlly不会被执行。(可以使用Sleep()函数来进行时间的等待)
1.在执行异常处理代码之前程序已经返回
public static boolean getTrue(boolean flag) {
if (flag) {
return flag;
}
try {
flag = true;
return flag;
} finally {
System.out.println("我是一定会执行的代码?");
}
}
2.在执行异常处理代码之前程序抛出异常
public static boolean getTrue(boolean flag) {
int i = 1/0;
try {
flag = true;
return flag;
} finally {
System.out.println("我是一定会执行的代码?");
}
}
3.finally之前执行了System.exit()
public static boolean getTrue(boolean flag) {
try {
flag = true;
System.exit(1);
return flag;
} finally {
System.out.println("我是一定会执行的代码?");
}
}
4.所有前台线程终止时,后台线程会突然终止
public static void main(String[] args) {
Thread t1 = new Thread(new Runnable() {
@Override
public void run() {
try {
Thread.sleep(5);
} catch (Exception e) {
}finally{
System.out.println("我是一定会执行的代码?");
}
}
});
t1.setDaemon(true);//设置t1为后台线程
t1.start();
System.out.println("我是主线程中的代码,主线程是非后台线程。");
}