论述题
1.Throwable的子类包含哪两类?简述Java Error类与Exception类的区别
Error:
致命 异常,标识系统发生了不可控的错误。程序无法处理,只能人工介入。例如,虚拟机产生了StackOverflowError,OutOfMemoryError。
Exception:
非致命 异常。程序可处理。分为受编辑器检测的checked异常(受检异常)和不受编辑器检测的unchecked异常(非受检异常)。
2.Exception又分为checked异常和unchecked异常,请分别举例说明。
派生于Error或者RuntimeException的异常称为unchecked异常
所有其他的异常称为checked异常
3.请查阅资料,简述StackOverflowError和OutOfMemoryError两类错误的发生情形和原因。
StackOverflowError:抛出这个错误是因为线程请求的栈深度大于虚拟机所允许的深度,因为Java线程操作是基于栈的,当调用方法内部方法也就是进行一次递归的时候,就会把当前方法压入栈直到方法内部的方法执行完全之后,就会返回上一个方法,也就是出栈操作执行上一个方法。
OutOfMemoryError:如果虚拟机栈可以动态扩展(当前大部分的Java虚拟机都可动态扩展,只不过Java虚拟机规范中也允许固定长度的虚拟机栈),如果扩展时无法申请到足够的内存,并且GC也不能够回收足够的空间,当你创建对象的速度快于JVM回收空间的时候就会发生空间不足这个问题。
4.简述异常处理的两种方式,并举例说明区别。
5.选取RuntimeException类的五个子类,编写抛出并捕获上述子类异常的程序。(例如算术异常,空指针异常,类转换异常,数组越界异常等)
EmptyStackException类 (空堆栈异常):
class A{
public static void main(String[]args){
Stack<Integer>stack = new Stack<Integer>();
try{
stack.pop();
}catch (Exception e){
e.printStackTrace();
}
}
}
ArithmeticException类 (算术异常):
class A{
public static void main(String[]args){
try{
int a=1/0;
}catch (Exception e){
e.printStackTrace();
}
}
}
NullPointerException类 (空指针异常):
class A{
public static void main(String[]args){
Scanner sc=null;
try{
sc.nextBoolean();
}catch (Exception e){
e.printStackTrace();
}
}
}
ArrayIndexOutOfBoundsException类 (数组越界异常):
class A{
public static void main(String[]args){
int []a=new int[5];
try{
System.out.println(a[-1]);
}catch (Exception e){
e.printStackTrace();
}
}
}
NegativeArraySizeException类 (数组大小为负异常):
class A{
public static void main(String[]args){
try{
int []a=new int[-1];
}catch (Exception e){
e.printStackTrace();
}
}
}
6. 根据某业务场景自定义一个异常类,并在某场景下抛出该异常对象。
public class InsufficientFundsException extends Exception
{
private double amount;
public InsufficientFundsException(double amount)
{
this.amount = amount;
}
public double getAmount()
{
return amount;
}
}
package bookcode.ex7.part7_5;
public class CheckingAccount {
//balance为余额,number为卡号
private double balance;
private int number;
public CheckingAccount(int number) {
this.number = number;
}
public void deposit(double amount) {
balance += amount;
}
public void withdraw(double amount) throws InsufficientFundsException {
if (amount <= balance) {
balance -= amount;
} else {
double needs = amount - balance;
throw new InsufficientFundsException(needs);
}
}
public double getBalance() {
return balance;
}
public int getNumber() {
return number;
}
}
7.异常中的throws声明与throw语句的区别是什么?请举例说明。
throw:
表示方法内抛出某种异常对象
throws:
方法的定义上使用 throws 表示这个方法可能抛出某种异常
8.finally子句的作用是什么?
finally不论是否抛出异常都会执行,即使在有返回值并且已执行return语句后,也会执行finally语句块,但return返回的结果不会改变。