Java面试(二)
1 java中Exception 和 Error 区别
都是Throwable的子类。RuntimeException继承自Exception。
Error和RuntimeException及其子类是未检查异常;其他异常是受检查异常。
Exception:需要捕获或者需要处理的异常。用于用户程序可以捕获的异常。
Error:定义了不期望被用户程序捕获的异常(系统崩溃,虚拟机错,内存不足,方法调用栈溢出,比如StackOverFlowError, OutOfMemoryError)。系统级的错误和 程序不必处理的异常,是java运行环境中的内部错误或者硬件问题,比如:内存资源不足,对于这种错误,程序基本无能为力。
运行时异常:除数为0;错误类型转换;数组越界,空指针。(如果出现这种错,一定是程序猿的错误)
受检查异常:要有try catch或 throws声明。
2 finally代码块和 finalize() 方法区别?
注意:当try和catch中有return,finally仍然会执行。
Finally是在return后面的表达式运算后执行的,所以函数返回值是在finally执行前确定的。无论finally中代码如何,return的值都确定,是之前保存的值。
Finally中最好不要包含return,否则程序会提前退出,返回值不是try或catch中保存的返回值,而是finally中return的值。
Finalize是object类的一个方法,在对象被垃圾回收之前由java 虚拟机来调用。
3 throw 和 thrwos
throw : 代码中抛出异常。 Throws: 表明方法不能处理,而抛出的异常,多个异常用逗号分。
4 finally
无论是否抛出异常,finally中的都要执行。主要是做一些释放资源之类的事情。比如:I/O缓冲区,数据库链接。
5 异常处理完后,Exception对象会发生什么变化?
下一个垃圾回收过程中被回收掉。
6 Java中两种异常类型是什么?他们有什么区别?
受检查异常(checked): 用try-catch捕获处理;或者用throws在方法上声明。
不受检查异常(unchecked):不需要在方法或构造函数上声明,异常可以传播到方法外面。
7 static块:在类加载的时候执行一次,一般用来出回话静态变量和调用静态方法。
A继承B,A a = new A();
B静态代码块-》A的静态代码块-》B非静态代码块-》B构造函数-》A的非静态代码块-》A构造函数。
总结:静态代码块总是最先执行。
非静态代码块跟非静态方法一样,跟对象有关,但是非静态代码块在构造函数之前执行。
父类非静态代码块,构造函数执行完后(父类构造完),才开始执行子类的非静态代码块和构造函数。