1. Throwable的子类包含哪两类?简述Java Error类与Exception类的区别。
Error和Exception。
Error(错误):是程序无法处理的错误,表示运行应用程序中较严重问题。
Exception(异常):是程序本身可以处理的异常。
2. Exception又分为checked异常和unchecked异常,请分别举例说明。
将派生于Error或者RuntimeException的异常称为unchecked异常,所有其他的异常成为checked异常。
3. 请查阅资料,简述StackOverflowError和OutOfMemoryError两类错误的发生情形和原因。
StackOverflow
原因:
线程调用生成的栈桢深度超过了虚拟机允许的深度
情形:
1、递归可能造成StackOverflowError
2、不断创建线程可能造成StackOverflowError
OutOfMemoryError
原因:内存不够,发生了内存溢出
情形:
1、栈的深度(大小类似于弹夹深度)可以自动扩展,扩展时无法申请到足够的内存
2、如果在堆中没有内存完成实例分配,并且堆也无法再扩展时
3、当方法区无法满足内存分配需求时
4、当常量池(方法区的一部分)无法再申请到内存
5、各个内存区域的总和大于物理内存限制(包括物理上的和操作系统级的限制),从而导致动态扩展
4. 简述异常处理的两种方式,并举例说明区别。
● 声明抛出处理:
声明抛出处理——隐式抛出:异常类型是RuntimeException或是其子类,程序方法可以对异常不作任何声明抛出或处理,直接交给调用该方法的地方处理,程序能编译通过,不会对可能产生异常的代码给出提示。
package homework.second;
import java.util.*;
public class TestEmptyStack {
public static void main(String[] args) {
Stack st=new Stack();
Object ob=st.pop();
}
}
显示声明抛出:异常类型不是RuntimeException类或其子类时可以用显示声明抛出。
● 程序捕获处理:
将显示声明抛出改写成try-catch的形式就是捕获处理。
6. 根据某业务场景自定义一个异常类,并在某场景下抛出该异常对象。
自定义异常类的一般步骤:
1)自定义异常类要继承于Exception类或其子类,或其它异常类。
2)为自定义异常类声明字段(属性)成员、方法成员或重写父类的字段和方法。
3)自定义异常类至少要定义两个构造方法:一个是无参的;另外一个是带 String参数的,目的是将 此字符串传递给父构造方法,同时这个String的 信息作为该异常对象的描述信息。
4)起一个能标识异常情况的有意义的名字。
7. 异常中的throws声明与throw语句的区别是什么?请举例说明。
throw:
表示方法内抛出某种异常对象
如果异常对象是非 RuntimeException 则需要在方法申明时加上该异常的抛出 即需要加上 throws 语句 或者 在方法体内 try catch 处理该异常,否则编译报错
执行到 throw 语句则后面的语句块不再执行
throws:
方法的定义上使用 throws 表示这个方法可能抛出某种异常
需要由方法的调用者进行异常处理
package constxiong.interview;
import java.io.IOException;
public class TestThrowsThrow {
public static void main(String[] args) {
testThrows();
Integer i = null;
testThrow(i);
String filePath = null;
try {
testThrow(filePath);
} catch (IOException e) {
e.printStackTrace();
}
}
/**
* 测试 throws 关键字
* @throws NullPointerException
*/
public static void testThrows() throws NullPointerException {
Integer i = null;
System.out.println(i + 1);
}
/**
* 测试 throw 关键字抛出 运行时异常
* @param i
*/
public static void testThrow(Integer i) {
if (i == null) {
throw new NullPointerException();//运行时异常不需要在方法上申明
}
}
/**
* 测试 throw 关键字抛出 非运行时异常,需要方法体需要加 throws 异常抛出申明
* @param i
*/
public static void testThrow(String filePath) throws IOException {
if (filePath == null) {
throw new IOException();//运行时异常不需要在方法上申明
}
}
}
8. finally子句的作用是什么?
try{}
catch(Exception e){
}finally{}
finally里一般拿来做一些善后清理工作
try块里出现错误的话,会立即跳出try块,找到匹配的错误,执行catch块里的语句
此时,可能在try块里打开的文件没关闭,连接的网络没断开,对这些浪费的内存就不能及时释放回收。
如果有finally块的话,不管有没有出错,都会执行finally块里的内容。