-
1. Throwable的子类包含哪两类?简述Java Error类与Exception类的区别。
-
Error:程序无法处理的系统错误,编译器不做检查;(程序无法处理的错误)属于JVM需要负担的责任。
Exception:程序可以处理的异常,捕获后可能恢复;(后者是可以处理的异常)RuntimeException(非受检异常)是程序应该负担的责任;Checked Exception (受检异常)可检查异常时Java编译器应该负担的责任。
-
2. Exception又分为checked异常和unchecked异常,请分别举例说明。
-
受检异常(checked exception):
在编译时需要检查的异常,需要用try-catch或throws处理。非受检异常(unchecked exception):
不需要在编译时处理的异常。在java中派生于Error和RuntimeException的异常都是unchecked exception。 -
3. 请查阅资料,简述StackOverflowError和OutOfMemoryError两类错误的发生情形和原因。
-
StackOverflowError:抛出这个错误是因为线程请求的栈深度大于虚拟机所允许的深度,因为Java线程操作是基于栈的,当调用方法内部方法也就是进行一次递归的时候,就会把当前方法压入栈直到方法内部的方法执行完全之后,就会返回上一个方法,也就是出栈操作执行上一个方法。
OutOfMemoryError:如果虚拟机栈可以动态扩展(当前大部分的Java虚拟机都可动态扩展,只不过Java虚拟机规范中也允许固定长度的虚拟机栈),如果扩展时无法申请到足够的内存,并且GC也不能够回收足够的空间,当你创建对象的速度快于JVM回收空间的时候就会发生空间不足这个问题。
-
4. 简述异常处理的两种方式,并举例说明区别。
-
1).隐式声明抛出
-
2).显式声明抛出
3).捕获处理
-
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. 根据某业务场景自定义一个异常类,并在某场景下抛出该异常对象。
-
class CustomException extends Exception { public CustomException(String msg){ super(msg); } } public class Main{ public static void main(String[] args){ ...... if(PassWord.IsTrue()){ } else { throw CustomException("密码错误"); } } }
-
7. 异常中的throws声明与throw语句的区别是什么?请举例说明。
- throws出现在方法的声明中,表示该方法可能会抛出的异常,然后交给上层调用它的方法程序处理,允许throws后面跟着多个异常类型。
throw一般会用于程序出现某种逻辑时程序员主动抛出某种特定类型的异常。throw只会出现在方法体中,当方法在执行过程中遇到异常情况时,将异常信息封装为异常对象,然后throw出去。throw关键字的一个非常重要的作用就是异常类型的转换。 -
8. finally子句的作用是什么?
- 当代码抛出一个异常时,就会终止方法中剩余代码的处理,并退出这个方法的执行。如果方法获得了一些本地资源,并且只有这个方法自己知道,又如果这些资源在退出方法之前必须回收,那么就会产生资源回收问题。
可以将资源回收的代码放入finally子句中。因为不管是否有异常捕获,finally子句中的代码都会执行。
Java博客六目
最新推荐文章于 2025-05-10 17:17:50 发布