先普及下什么是异常:

        异常就是程序非正常结束,不按我们的处理逻辑执行下去了 导致程序中断的情况。

        一般来说,一开始写程序犯错基本上就是 空指针NullPointerException 数组越界 参数异常

    其实Java添加异常处理机制 是为了把异常和正常代码隔离开来,保证程序的健壮性和完整性


    首先看段代码

public static void main(String[] args){

try {
    ArrayList<Integer> nin = new ArrayList<Integer>();
    nin.add(312);
    nin.add(3122);
    nin.add(3112);
    System.out.println(nin.get(8));
    
    } catch (Exception e) {
        System.out.println("Exception");
        e.printStackTrace();
    } catch (ArrayIndexOutOfBoundsException e) {
        System.out.println("ArrayIndexOutOfBoundsException");
        e.printStackTrace();
    }
}

     哎....我去    代码会编译不过去。

    

public static void main(String[] args) throws NullPointerException {
		show();
	}

        public static int[] nu = null;
	
	public static void show() {
		System.out.println(doSomething());
		try {
			System.out.println(nu[3]);
		} catch (NullPointerException e) {
			System.out.println("NullPointerException -");
			e.printStackTrace();
			
		}catch (Exception e) {
			System.out.println("Exception -");
			e.printStackTrace();
		}
	}

    输出结果:

        NullPointerException -

        java.lang.NullPointerException

        at com.tz.TestException.show(TestException.java:26)

         at com.tz.TestException.main(TestException.java:16)




    原来Java中catch是按顺序往下匹配的,而一旦catch到异常符合要求,就会直接跳出去,有finally就会执行它,没有则直接跳出去,不再执行任何东西,所以catch异常时应该有个顺序的。

    

    catch代码块应该是 从小范围的到大范围的异常  顺序往下写的。


public static int[] nu = null;
public static void show() throws NullPointerException {
		
    try {
        System.out.println(nu[3]);
    }catch (Exception e) {
    	System.out.println("");
	e.printStackTrace();
    }
}

下面这段代码 

    Exception -

    java.lang.NullPointerException

         at com.tz.TestException.show(TestException.java:26)

             at com.tz.TestException.main(TestException.java:16)



public static int[] nu = null;
public static void show()  {
    
    System.out.println(nu[3]);
    
    try {
        
    }catch (Exception e) {
    	System.out.println("Exception -");
	e.printStackTrace();
    }
}

下面这段代码 

    Exception in thread "main" java.lang.NullPointerException

         at com.tz.TestException.show(TestException.java:23)

        at com.tz.TestException.main(TestException.java:16)


所以try......catch的是它自己囊括的代码出现的异常,方法上throws异常时方法里面的异常;

 try catch里面的异常 由它抛出,不在catcha里面代码出现的异常 由方法上的throws Exception抛出;多个catch异常之间,如果存在父子关系,是先写子异常在上面,父级异常在下面,这种编译才不会出错;


    Java异常结构图如下:

Java exception 处理_异常

由上面可以看出 Throwable分两种 一种是异常 一种是错误(这种情况程序基本就跪了 恢复不了)

Java异常又分为两种   checked异常(编译时异常)和Runtime异常 (运行时异常)


异常处理规则:

        try 捕获异常  --> catch 处理异常 或者自定义异常逻辑处理代码 --> finally 结束时操作的事

        

怎么抛出异常?

        1. try....catch 

        2. 方法上 throws 异常 

        3. 代码块里面  throw new XXXException

        4. 代码块里面  throw new XXXException 框架统一处理捕获到的异常信息

处理抛出方式:

        (1) 如果你很明确的知道怎么处理异常或者可能会出现什么异常 , 应该用try....catch 的方式抛出异常并写下处理异常代码

        (2) 如果不知道有什么异常, 那就在方法上抛出异常,多个异常逗号隔离开就好了 


注意: Java 在对(RunTimeException)运行时异常 就算你自己不捕获抛出处理  它也会帮你抛出来   其实.....现在Java7开始项目大多数是把异常抛出来最顶部 也就是控制层C再处理的