Java异常处理(面试题、练习题、抛抓模型)
前几次分享了一些面向对象的一些知识和习题,但还没分享完,之后还会有补充的,这次就先往后分享,这次分享的是Java中的异常处理,有哪里大家觉得不对的地方可以在下方留言。
Error与Exception体系以及常见的Exception
java.lang.Throwable
|---java.lang.Error:错误,不编写针对性的代码进行处理
|---java.lang.Exception:异常,使用针对性的代码进行处理
|---编译时异常(非RuntimeException、Checked异常):在执行javac.exe命令时可能出现的异常
|----IOException
|---FileNotFoundException
|---运行时异常(RuntimeException、属于UnChecked异常):在执行java.exe命令时可能出现的异常
|-----InputMismatchException
|-----ArithmeticException
|-----NumberFormatException
|-----ClassCastException
|-----NullPointerException
|-----ArrayIndexOutOfBoundsExceptionpublic class ExceptionTest { //*********************以下是编译时异常******************************* @Test public void test7(){ File file = new File("hello.txt"); FileInputStream fis = new FileInputStream(file);//FileNotFoundException byte[] buffer = new byte[1024]; int len; while((len = fis.read(buffer)) != -1){//IOException String str = new String(buffer,0,len); System.out.print(str); } fis.close();//IOException } //*********************以下是运行时异常******************************* //InputMismatchException @Test public void test6(){ Scanner scanner = new Scanner(System.in); int num = scanner.nextInt(); System.out.println(num); scanner.close(); } //ArithmeticException @Test public void test5(){ int i = 10; int j = 0; System.out.println(i / j); } //NumberFormatException @Test public void test4(){ String str = "123a"; int num = Integer.parseInt(str); System.out.println(num); } //ClassCastException @Test public void test3(){ // Object obj = new Date(); // String str = (String) obj; } //NullPointerException @Test public void test2(){ //1. // int[] arr = new int[10]; // arr = null; // System.out.println(arr[0]); //2. // int[][] arr1 = new int[4][]; // System.out.println(arr1[0][0]); //3. Date date = null; System.out.println(date.toString()); } //ArrayIndexOutOfBoundsException @Test public void test1(){ int[] arr = new int[10]; System.out.println(arr[10]); } }
异常的处理:java提供了两种方式,用于异常的处理。
一、Java提供的是异常处理的方式:抓抛模型
过程一:"抛"
程序在正常的执行过程中,一旦出现异常,就会在异常代码处生成对应异常类的对象,并将此对象抛出。
对象一旦抛出,在没有处理异常的情况下, 程序就不再向下执行。
>关于异常类的对象的生成?分为两种情况:
① 系统自动生成异常类的对象,并扔出
② 我们可以根据程序的需要手动的创建一个异常类的对象,并扔出(throw)。
写法:在方法内使用“throw + 异常类的对象”
过程二:"抓"
理解为异常处理的方式:
方式一:try-catch-finally
方式二:throws
二、try-catch-finally的使用
try{
//可能存在异常的代码
}catch(异常类型1 变量名1){
//异常的处理方式1
}catch(异常类型2 变量名2){
//异常的处理方式2
}finally{
//一定会被执行的代码
}
说明:
1. finally是可选的。
2. try中包含的是可能存在异常的代码。一旦执行,出现了异常,就会声明相应的异常类的对象,此对象在catch结构
中进行匹配,一旦匹配。就进入catch中进行异常的处理。处理完以后,就不会再匹配后续的catch结构。而是退出try-catch
结构,继续执行其后的代码。
3.多个catch中的异常类型如果满足子父类关系,则必须将子类声明在父类catch结构的上面,否则报错。
如果不满足子父类关系,则孰上孰下都可以。
4.常见的异常处理的方式:
方法1: getMessage() ;
方法2:printStackTrace();
5.try结构中声明的变量,在出了try结构以后就不可以被调用。
6.try-catch-finally结构可以嵌套
理解:
1.使用异常处理的方式来处理编译时异常,处理完以后相当于把编译时异常延迟到运行时才可能出现。
2.程序中,如果可能报编译时异常,则一定需要进行异常的处理。如果是运行时异常,则可以不进行处理。
面试题:
1.区分final\finally\finalize
final是表示最终的,是一个修饰符,修饰类时表示不能被继承,修饰方法时表示不能被子类重写,修饰属性和局部变量时表示值不能被修改,是个常量。
finally是表示最终块,是异常处理的一部分,和try..catch一起使用,不管是否发生异常都要执行的代码放在finally块中。
finalize是表示最终方法,是java.lang.Object类的一个方法,在对象被垃圾回收时调用。2.区分throws、throw
throws出现在方法函数头;而throw出现在函数体。throws表示出现异常的一种可能性,并不一定会发生这些异常;
throw则是抛出了异常,执行throw则一定抛出了某种异常对象。两者都是消极处理异常的方式,只是抛出或者可能抛出异常,但是不会由函数去处理异常,真正的处理异常由函数的上层调用处理。
练习题
第1题
public static void main(String[] args) { int test = test(3,5); System.out.println(test); } public static int test(int x, int y){ int result = x; try{ if(x<0 || y<0){ return 0; } result = x + y; return result; }finally{ result = x - y; } }
(1)finally块中的代码是无论try中是否发生异常,也无论catch是否可以捕获异常,也不管try和catch中是否有return语句,都会执行的部分。
(2)如果finally中有return语句,那么try...catch...finally结构一定从finally中的return回去。
(3)如果finally中没有return语句,那么try...catch...finally结构才会从try或catch中的return回去,但是finally值中代码不会影响最终的返回值。
第2题
public class Test02 { { System.out.println("a"); } static{ System.out.println("b"); } Test03(){ System.out.println("c"); } public static String getOut(){ try{ return "1"; }catch(Exception e){ return "2"; }finally{ return "3"; } } public static void main(String[] args) { System.out.println(getOut()); } }
(1)main()执行之前,需要先完成所在类的初始化。
(2)类初始化由两部分代码组成:①静态变量的显式赋值代码②静态代码块。
(3)没有创建对象,不会执行实例初始化相关的代码。
(4)finally块中的代码是无论try中是否发生异常,也无论catch是否可以捕获异常, 也不管try和catch中是否有return语 句,都会执行的部分。
(5)如果finally中有return语句,那么try...ca.tch...finally结构一定从finally中的return回去。