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

 

 

你可能感兴趣的:(#,javaSE)