欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

Java异常处理(面试题、练习题、抛抓模型)

程序员文章站 2022-07-13 23:36:04
...

        前几次分享了一些面向对象的一些知识和习题,但还没分享完,之后还会有补充的,这次就先往后分享,这次分享的是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
                |-----ArrayIndexOutOfBoundsException

public 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回去。