【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

posted @   逆火狂飙  阅读(163)  评论(0编辑  收藏  举报
编辑推荐:
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
阅读排行:
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· C#/.NET/.NET Core优秀项目和框架2025年2月简报
· Manus爆火,是硬核还是营销?
· 终于写完轮子一部分:tcp代理 了,记录一下
· 【杭电多校比赛记录】2025“钉耙编程”中国大学生算法设计春季联赛(1)
生当作人杰 死亦为鬼雄 至今思项羽 不肯过江东
点击右上角即可分享
微信分享提示