- Throwable的子类包含哪两类?简述Java Error类与Exception类的区别。
答:Error和Exception。Error: 致命异常。标识系统发生了不可控的错误。程序无法处理,只能人工介入。例如, 虚拟机产生的错误StackOverflowError、OutOfMemoryError。
Exception: 非致命异常。程序可处理。分为受编译器检测的checked异常(受检异常)和不受编译器检测的unchecked异常(非受检异常)。
2. Exception又分为checked异常和unchecked异常,请分别举例说明。
class CheckedExceptionA extends Exception {
}
class UnCheckedExceptionB extends RuntimeException {
}
创建一个Run类使用他们时,CheckedExceptionA必须处理,UnCheckedExceptionB则不需要
public class Run {
public void handleChecked(){
try {
throw new CheckedExceptionA();
} catch (CheckedExceptionA checkedExceptionA) {
checkedExceptionA.printStackTrace();
}
}
public void handleUnChecked(){
throw new UnCheckedExceptionB();
}
}
- 请查阅资料,简述StackOverflowError和OutOfMemoryError两类错误的发生情形和原因。
答:StackOverflowError:抛出这个错误是因为递归太深.
OutOfMemoryError:因为内存溢出,JVM不能分配给对象的创建空间.并且GC也不能够回收足够的空间. - 简述异常处理的两种方式,并举例说明区别。
答:继续上抛:相当于推卸责任,把异常传递给调用者。
自己捕捉:捕捉相当于自己拦下异常,把异常给解决了,调用者是不知道的。
6. 选取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();
}
}
}
- 根据某业务场景自定义一个异常类,并在某场景下抛出该异常对象。
答
public class SelfGenerateException extends Exception
{
SelfGenerateException(String b){
super(b); //调用Exception的构造方法
}
static void throwOne() throws SelfGenerateException
{
int a = 0;
if (a==0) //如果a为1就认为在特定应用下存在异常,改变执行路径,抛出异常
{throw new SelfGenerateException("a为0");}
}
public static void main(String args[])
{
try
{throwOne();}
catch(SelfGenerateException e)
{e.printStackTrace();}
}
}
- 异常中的throws声明与throw语句的区别是什么?请举例说明。
区别一:throw 是语句抛出一个异常;throws 是方法抛出一个异常;
throw语法:throw <异常对象>
在方法声明中,添加throws子句表示该方法将抛出异常。
throws语法:[<修饰符>]<返回值类型><方法名>([<参数列表>])[throws<异常类>]
其中:异常类可以声明多个,用逗号分割。
区别二:throws可以单独使用,但throw不能;
区别三:throw要么和try-catch-finally语句配套使用,要么与throws配套使用。但throws可以单独使用,然后再由处理异常的方法捕获。
12. finally子句的作用是什么?
答: finally用途:
一般用来进行一些善后清理操作,
例如清理资源、释放连接、关闭文件、I/O流等操作。
String readFileWithFinallyBlock(String path) throws IOException {
BufferedReader br = new BufferedReader(new FileReader(path));
try {
return br.readLine();
}
finally {
if (br != null) br.close(); //关闭文件流
}
}