问题一:throw和throws的区别?
- throws是声明一个方法可能抛出的所有异常信息,并将异常向上传递,谁调用该方法异常就交给谁处理。
- throw是在方法内抛出某种异常,抛出一个具体的异常类型。
问题二:final、finally、finalize有什么区别?
- final修饰类、变量、方法,修饰类该类不能被继承,修饰方法该方法不能被重写,修饰变量该变量不能被重写赋值;
- finally一般在try-catch代码块中,一般在处理异常时,一定要执行的代码会放在finally中,可以放一些关闭资源;
- finalize是方法,属于Object类,一般由垃圾回收器GC调用。我们调用System的gc()方法时,垃圾回收器会调用finalize()回收垃圾。
问题三:try-catch-finally中哪个部分能省略?
catch或finally
try只适合处理运行时异常,try+catch适合处理运行时异常和普通异常。如果只try不catch,编译不通过。编译器规定普通异常捕获必须用catch处理。但是运行时的异常,编译器没有规定,所以可以省略catch,加上也行。
对一段代码加上try,如果是普通异常,就要有catch进行捕获;如果是运行时异常,可以捕获然后丢弃,用finally进行扫尾。
也就是说,要么try-catch,要么try-finally
问题四:try-catch-finally中,如果catch中return了,finally还会执行吗?
我们看一段代码,再给结论
代码一:
public class test4 {
public static void main(String[] args) {
System.out.println(getString());
}
public static String getString() {
String str="初始";
try {
System.out.println(1/0);
str="try里";
}catch (Exception e) {
str="catch里";
return str;
} finally {
str="finally里";
//return str;
}
return str;
}
}
结果:catch里
分析:在执行到catch的return的时候,str等于catch里,此时就相当于return了catch里,而又发现finally语句中的石头人,但是已经return了,虽然finally一定执行,但是在return后,所以返回值不会改
代码二:
public class test4 {
public static void main(String[] args) {
System.out.println(getString());
}
public static String getString() {
String str="初始";
try {
System.out.println(1/0);
str="try里";
}catch (Exception e) {
str="catch里";
return str;
} finally {
str="finally里";
return str;
}
//return str;
}
}
结果:finally里
分析:当执行到catch里return时,就会return了catch里,但是finally会先执行,所以会在finally执行完之后再回到catch,但是只能有一个return,所以结果就是finally里
问题五:常见的异常类型?
- NullPointerException:空指针
- SQLException:数据库访问错误
- IndexOutOfBoundsException:下标越界
- NumberFormatException:数字转换异常,将字符串转换成数值类型失败
- FileNotFoundException:找不到指定文件
- IOException:io流异常
- ClassCastException:类型转换异常
- ArrayStoreException:数组存储异常,存储错误的对象类型
- IllegalArgumentException:不合法的参数
- ArithmeticException:算数异常,比如除以0
- NegativeArraySizeException:负的数组大小
- NoSuchMethodException:没有找到某一方法
- SecurityException:由安全管理器抛出的异常,指示存在安全侵犯。
- UnsupportedOperationException:不支持操作的异常
- RuntimeException:运行时异常