首页 > 技术文章 > thows,thow和try catch的区别

BonnieWss 2018-06-25 19:34 原文

1、throw是当前方法不处理这个异常,由它的上一级进行处理。并且抛出异常后将停止执行代码。

package myProject;

public class ExceptionTest {
    //测试throw
    public void testThrow() {
        try {            
            int a=1/0;
            
        }catch(Exception e){
            System.out.println("1");
            throw new RuntimeException();
        }finally {
            System.out.println("2");
        }
        System.out.println("3");
    }
    public static void main(String[] args) {
        ExceptionTest t=new ExceptionTest();
        t.testThrow();
    }
}

输出结果为:

1
Exception in thread "main" 2
java.lang.RuntimeException
    at myProject.ExceptionTest.testThrow(ExceptionTest.java:11)
    at myProject.ExceptionTest.main(ExceptionTest.java:20)

可见,没有打印3,即throw抛出异常后,会执行finally块的代码,但不会再执行后边的代码。调用这种方法时,可以用try catch捕获并处理这个异常,并用finally块达到输出3的目的,见如下代码:

package myProject;

public class ExceptionTest {
    //测试throw
    public void testThrow() {
        try {            
            int a=1/0;
            
        }catch(Exception e){
            System.out.println("1");
            throw new RuntimeException();
        }finally {
            System.out.println("2");
        }
        System.out.println("3");
    }
    public void test1() {
        try {
            testThrow();
        }catch(Exception e) {
            e.printStackTrace();
        }finally{
       System.out.println("3");
     } }
public static void main(String[] args) { ExceptionTest t=new ExceptionTest(); t.test1(); } }

输出结果为:

1
2
java.lang.RuntimeException
3
 at myProject.ExceptionTest.testThrow(ExceptionTest.java:11)
 at myProject.ExceptionTest.test1(ExceptionTest.java:19)
 at myProject.ExceptionTest.main(ExceptionTest.java:28)

 

2、try catch 是直接处理异常,执行完finally块后,接着执行代码。

package myProject;

public class ExceptionTest {
    //测试try catch
    public void testCatch() {
        try {            
            int a=1/0;
            
        }catch(Exception e){
            System.out.println("1");
        }finally {
            System.out.println("2");
        }
        System.out.println("3");
    }
    public void test1() {
        try {
            testCatch();
        }catch(Exception e) {
            System.out.println("4");
            e.printStackTrace();
        }finally {
            System.out.println("5");
        }
    }
    public static void main(String[] args) {
        ExceptionTest t=new ExceptionTest();
        t.test1();
        
    }
}

输出结果如下:

1
2
3
5

可见,由于testCatch()已经用try catch处理了异常,那么在test1()方法中的catch块将不会执行,也就不会输出4

3、throws写在方法参数的后边,声明了该方法有可能抛出异常。如果这个方法的确有可能会抛出一个异常,那么编辑器会强制你加上这个throws,见如下代码

package myProject;

public class ExceptionTest {
    //测试try catch
    public void testCatch() throws Exception{        
        int a=1/0;    
    }
    public void test() {
        try {
            testCatch();
        }catch(Exception e) {
            System.out.println("1");
        }finally {
            System.out.println("2");
        }
    }
    public static void main(String[] args) {
        ExceptionTest t=new ExceptionTest();
        t.test();
    }
}

输出结果如下:

1
2

可见,try catch可以捕获有带throws的方法的异常。

4、try catch 可以捕获try catch捕获的异常

见如下代码:ExceptionTest2类

package myProject;

public class ExceptionTest2 {
    public void trycatch() {
        try {
            int i=1/0;
        }catch(Exception e){
            System.out.println("ExceptionTest2-----catch");
            e.printStackTrace();
        }
    }
}

ExceptionTest类:

package myProject;

import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;

public class ExceptionTest {
    private static final Logger logger=LogManager.getLogger(); 
    private ExceptionTest2 t;
    public void  test() {
        try {
            t.trycatch();
            
        }catch(Exception e){    
            System.out.println("ExceptionTest----catch"); 
            e.printStackTrace();
        }
    }
    public static void main(String[] args) {
        ExceptionTest test= new ExceptionTest();
        test.test();
        
    }
    
}

ExceptionTest类中的test()方法调用ExceptionTest2类trycatch()方法,所以test()会捕获trycatch()捕获的异常

输出结果为:

ExceptionTest----catch
java.lang.NullPointerException
    at myProject.ExceptionTest.test(ExceptionTest.java:11)
    at myProject.ExceptionTest.main(ExceptionTest.java:21)

 

推荐阅读