【Java】异常的平行处理

Java对异常的处理,是平行的处理,进行了特定异常的处理后,便不会进入通用异常的处理,出现了未曾显式捕获的异常时,才会进入最宽泛的Excption处理。

具体请看下面代码:

package com.hy.csvdld.util;

import java.sql.SQLException;

public class Main {
    public static void main(String[] args) {
        try {
            throw new SQLException("ABC");
        }
        catch(NullPointerException e) {
            System.out.println("Catch NullPointerException");
        }
        catch(SQLException e) {
            System.out.println("Catch SQLException");
        }
        catch(Exception e) {
            System.out.println("Catch Exception");
        }finally {
            System.out.println("finally block");
        }
    }
}

输出内容:

Catch SQLException
finally block

由上可见,进入SQLException的处理后,程序直接进入finally的处理,而不是进入更宽泛的Exception处理处。

再验证一次:

package com.hy.csvdld.util;

import java.sql.SQLException;
import java.util.List;

public class Main {
    public static void main(String[] args) {
        try {
            List<String> ls=null;
            
            if(ls.size()==1) {
                throw new SQLException();
            }
        }
        catch(NullPointerException e) {
            System.out.println("Catch NullPointerException");
        }
        catch(SQLException e) {
            System.out.println("Catch SQLException");
        }
        catch(Exception e) {
            System.out.println("Catch Exception");
        }finally {
            System.out.println("finally block");
        }
    }
}

输出:

Catch NullPointerException
finally block

这段程序也昭示了进入一种异常处理就不会进入更宽泛的异常处理段。

再看一段:

package com.hy.csvdld.util;

import java.sql.SQLException;

public class Main {
    public static void main(String[] args) {
        try {
            int i=5,j=0;
            int k=i/j;
            
            if(k>0) {
                throw new SQLException();
            }
        }
        catch(NullPointerException e) {
            System.out.println("Catch NullPointerException");
        }
        catch(SQLException e) {
            System.out.println("Catch SQLException");
        }
        catch(Exception e) {
            System.out.println("Catch Exception");
            System.out.println(e.getMessage());
        }finally {
            System.out.println("finally block");
        }
    }
}

输出:

Catch Exception
/ by zero
finally block

这段代码明确展示,出现了没有显式捕获的异常,才会进入宽泛的Exception处理。

package com.hy.expired;

import java.sql.SQLException;

public class Main {
    public static void main(String[] args) throws SQLException {
        try {
            int k=5;
            
            if(k>0) {
                throw new NullPointerException("NPE");
            }else {
                throw new SQLException("T1");
            }
        }
        catch(NullPointerException e) {
            System.out.println("Catch NullPointerException");
            
            throw new SQLException("T1");
        }
        catch(SQLException e) {
            System.out.println("Catch SQLException");
        }
        catch(Exception e) {
            System.out.println("Catch Exception");
            System.out.println(e.getMessage());
        }finally {
            System.out.println("finally block");
        }
    }
}

输出:

Catch NullPointerException
finally block
Exception in thread "main" java.sql.SQLException: T1
    at com.hy.expired.Main.main(Main.java:19)

这段代码说明,在异常分支中只要进入了一个分支,即使在其中抛出适合下面分支接纳的异常,那个分支也不会进入。

--END-- 2019年11月1日21:24:36

原文地址:https://www.cnblogs.com/heyang78/p/11779660.html