异常类处理

一、异常处理类的体系接口

1.程序出现异常是正常现象【就像人会生病一样】
2.java中异常类Throwable【类】*异常类
3.Throwable[类]有两个子类:1.Error(错误)  2.Exception(异常)
    Error是java程序运行中不可预料的异常情况,这种异常发生以后,会直接导致JVM不可处理或者不可恢复的情况。所以这种异常不可能抓取到,比如OutOfMemoryError、NoClassDefFoundError等。【癌症】
4.Exception被分为运行时异常与非运行时异常
    运行时异常--非检查性异常 在代码编写使,可以忽略捕获操作(比如:ArrayIndexOutOfBoundsException),这种异常是在代码编写或者使用过程中通过规范可以避免发生的。
    非运行时异常--检查性异常 必须在编写代码时,使用try catch捕获(比如:IOException异常)。

 二、java异常处理的原理

1.异常可以自己处理掉
        通过try-catch代码块处理异常。
     将可能出现异常的java代码使用”try{异常可能发生的代码}catch(要抓捕的异常){异常处理方式}”块包裹,如果出现异常try{}就会捕获异常,终止代码的运行,将捕获的异常交给catch(){}去处理异常。
    try-catch代码块
    格式:
    try{
        异常可能发生的代码
       }catch(要抓捕的异常类型){
        异常处理方式
     }
            1.try{}--捕获可能发生的异常
            2.catch(//要抓捕的异常){//异常处理方式}---抓获处理异常
              catch后面的“()”中一般要定义为具体异常类型的。
              具体异常类型不明确的时候可以使用Exception/Throwable
              catch的{}--- 具体异常的处理过程。往往都是打印堆栈到控制台,查看具体情况,修改程序去避免
            3.一个try{}后面可以跟随多个catch(要抓捕的异常){异常处理方式},多个catch时要抓捕的异常类型需要按照有小到大的顺序排列。
            4.【finally{}】--出现在catch的“{}”后面,可以写也可以不写。
                                     有无异常都要执行的动作。
                 当有一定需要执行的代码时写到finally中。
例如:

package com.wangxing.test1;
public class testClass {
	public void method(int size){
		int arr[]=new int[size];
		System.out.println(arr.length);
	}
}
package com.wangxing.test1;
import java.util.Scanner;

public class mainTest {
	public static void main(String[] args) {
			Scanner scn=new Scanner(System.in);
			System.out.println("请输入您要创建数组的大小");
			String sg=scn.next();
			int size=Integer.parseInt(sg);
			testClass tc=new testClass();
			tc.method(size);
	}
}

当数组的大小输入为负值时就会报错
异常类处理

解决方案:

package com.wangxing.test1;
import java.util.Scanner;

public class mainTest {
	public static void main(String[] args) {
		try{
			Scanner scn=new Scanner(System.in);
			System.out.println("请输入您要创建数组的大小");
			String sg=scn.next();
			int size=Integer.parseInt(sg);
			testClass tc=new testClass();
			tc.method(size);
		}catch(Exception e){
			Scanner scn=new Scanner(System.in);
			System.out.println("请输入您要创建数组的大小");
			String sg=scn.next();
			int size=Integer.parseInt(sg);
			if(size>0){
				size=size;
			}else{
				size=0-size;
			}
			testClass tc=new testClass();
			tc.method(size);
		}finally{
			System.out.println("无论有没有异常都要执行"); 
		}
	}
}

异常类处理

面试题:try catch中return在finally之前 还是之后执行?
      
  finally语句在return语句执行之后return返回之前执行的。
public  static String  getString(){
        String  he="你好";
        try{
            he="hello";
        }catch(Exception e){
            e.printStackTrace();
        }finally{
            System.out.println("无论有没有异常都要执行"); 
            he="hello,lisi";
        }
        return he;  
    } 

2. 异常不自己处理掉
        
如果出现异常,java会根据问题所描述的异常类,创建一个对象(实例)具体异常对象,然后将该对象抛给上一级【谁调用谁就是上一级】,
    具体步骤:
    method具体出异常处 --》main主方法--》jvm虚拟机--》将异常出现的位置和原因打印在控制台
    throws--声明方法抛出异常给上一级【谁调用谁就是上一级】
例如:

package com.wangxing.test2;

public class testClass {
	public int getint()throws Exception{
		int a=10;
		int b=0;
		int c=a/b;
		return c;
	}
}
package com.wangxing.test2;

public class testMain {
	public static void main(String[] args)throws Exception{
		testClass tc =new testClass();
		int res= tc.getint();
		System.out.print("res=="+res);
	}
}

1.将testClass中的错误上抛给主方法,主方法交给java虚拟机再给控制台
异常类处理

 3.throw关键字与自定义异常
         简单的自定义异常--编写一个新类,继承Throwable/Exception/RumtimeException,在构造中访问父类的构造方法
创建一个自定义异常

package com.wangxing.test3;

public class myException extends Exception{
	public myException(String info){
		super();
		System.out.println(info);
	}
}
package com.wangxing.test3;

public class testClass {
	public testClass(int size) throws myException{
		if(size>0){
			size=size;
			int arr[]=new int[size];
			System.out.println(arr.length);
		}else{
			throw new myException("数组大小不能为负数");
		}
		
	}
}
package com.wangxing.test3;

public class main {
	 public static void main(String[] args){
		try{
			testClass tc=new testClass(-5);
		}catch(myException e){
			e.printStackTrace();
		}
	}	
}

异常类处理

 总结一下:1.如果有异常就try{}catch(){},如果不想try{}catch(){}那么就声明方法throws异常。
     2.没有特殊要求的时候我们都是打印堆栈异常,查看程序的具体异常和位置,方便修改。
     3.我们轻易不会自己定义异常,因为java提供的异常类型已经足够使用。

4.java中的常见运行时异常
    1.NullPointerException - 空指针引用异常
    2.ClassCastException - 类型强制转换异常。
    3.IllegalArgumentException - 传递非法参数异常。
    4.ArithmeticException - 算术运算异常
    5.ArrayStoreException - 向数组中存放与声明类型不兼容对象异常
    6.IndexOutOfBoundsException - 下标越界异常
    7.NegativeArraySizeException - 创建一个大小为负数的数组错误异常
    8.NumberFormatException - 数字格式异常
    9.SecurityException - 安全异常
    10.UnsupportedOperationException - 不支持的操作异常

上一篇:10.Java异常机制


下一篇:Day11异常