-
- 一、final、finally、finalize 的区别?
-
二、Java中异常分为哪些种类?
-
三、error和exception的区别?
-
四、调用下面的方法,得到的返回值是什么?
-
五、Java 异常处理机制的理解?
-
六、说出最常见的5个RuntimeException?
-
七、throw 和 throws 的区别?
● final:用于声明属性,方法和类,分别表示属性不可变,方法不可覆盖,被其修饰的类不可继承。
final修饰属性不可变
final修饰方法不可覆盖,也就是重写
final修饰的类不可继承。
● finally:异常处理语句结构的一部分,表示总是执行。
有异常时
public class Test {
public static void main(String[] args) {
try {
int a = 1/0;
}catch (Exception e)
{
System.out.println(“捕捉到异常”+e.getMessage());
}finally {
System.out.println(“执行最终语句”);
}
}
}
运行结果
没有异常的时候
public class Test {
public static void main(String[] args) {
try {
int a = 0/1;
}catch (Exception e)
{
System.out.println(“捕捉到异常”+e.getMessage());
}finally {
System.out.println(“执行最终语句”);
}
}
}
● finally和catch可以两个都存在也可以只存在一个,但是try不能单独存在
● finalize:
垃圾回收机器(Garbage Collection),也叫GC,垃圾回收器主要有一下特点:
Object 类的一个方法,所有Java对象都有这个方法
当对象不再被程序所使用的时候,垃圾回收器将会将其回收
垃圾回收是在后台运行的,我们无法命令垃圾回收器马上回收资源,但是我们可以告诉他可以尽快回收资源(System.gc()和Runtime.getRuntime().gc())
垃圾回收器在回收某个对象的时候,首先会调用该对象的finalize()方法
GC主要针对堆内存
class Person {
protected void finalize() throws Throwable {
System.out.println(“我被回收了!!!”);
}
}
public class Test {
public static void main(String[] args) {
Person p = new Person();
//一次不会触发垃圾回收,就多赋值null,告诉垃圾回收器这个资源我不要了
for (int i = 0; i < 1000; i++) {
p = null;
}
System.gc();//增加垃圾回收器启动的概率
}
}
运行结果
按照异常需要处理的时机分为编译时异常(也叫受控异常)也叫 CheckedException 和运行时异常(也叫非受控异常)也叫 UnCheckedException。
Java认为Checked异常都是可以被处理的异常,所以Java程序必须显式处理Checked异常。
如果程序没有处理Checked 异常,该程序在编译时就会发生错误无法编译。这体现了Java 的设计哲学:没有完善错误处理的代码根本没有机会被执行。对Checked异常处理方法有两种:
● 第一种:当前方法知道如何处理该异常,则用try…catch块来处理该异常。
public class Test {
public static void main(String[] args) {
try {
Class.forName(“com.mysql.jdbc.Driver”);
}catch (Exception e){
e.printStackTrace();
}
}
}
● 第二种:当前方法不知道如何处理,则在定义该方法时声明抛出该异常。
运行时异常只有当代码在运行时才发行的异常,编译的时候不需要try…catch。
Runtime如除数是0和数组下标越界等,其产生频繁,处理麻烦,若显示申明或者捕获将会对程序的可读性和运行效率影响很大。
所以由系统自动检测并将它们交给缺省的异常处理程序。当然如果你有处理要求也可以显示捕获它们。
public class Test {
public static void main(String[] args) {
try {
array();
}catch (Exception e){
e.printStackTrace();
}
}
public static void array() throws Exception{
int a[]= {2,3,5,6,7};
System.out.println(a[10]);
}
}
运行结果
Error类和Exception类的父类都是Throwable类,他们的区别如下:
● Error类一般是指与虚拟机相关的问题,如系统崩溃,虚拟机错误,内存空间不足,方法调用栈溢出等。对于这类错误的导致的应用程序中断,仅靠程序本身无法恢复和预防,遇到这样的错误,建议让程序终止。
● Exception类表示程序可以处理的异常,可以捕获且可能恢复。遇到这类异常,应该尽可能处理异常,使程序恢复运行,而不应该随意终止异常。
●Exception类又分为未检查异常(UnCheckedException)和受检查的异常(CheckedException)。运行时异常ArithmeticException,IllegalArgumentException编译能通过,但是一运行就终止了,程序不会处理运行时异常,出现这类异常,程序会终止。而受检查的异常,要么用 try…catch 捕获,要么用throws字句声明抛出,交给它的父类处理,否则编译不会通过。
public int getNum() {
try {
int a = 1 / 0;
return 1;
} catch (Exception e) {
return 2;
} finally {
return 3;
}
}
代码走到第3行的时候遇到了一个MathException,