Java的异常处理

 Java把所有不正常情况分为两种,它们都继承Throwable父类#

--错误:一般之虚拟机相关问题,如系统崩溃,虚拟机错误,动态连接失败等,这类情况不能恢复或不可能被捕获。

--异常:与错误相反,

主要依赖5个关键字:try、catch、finally、throw、throws’

1. 抛出Checked异常和Runtime异常的区别#

  •     不是RuntimeException类及其子类的实例被称为Checked异常
  •   Checked异常:要么使用throws显示的抛出,要么用try..catch显示的捕获它,并处理.
  •   Runtime异常: 无需显示的抛出,如果需要可以使用try..catch显示的捕获它
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
public class ExceptionDemo {
 
    public static void main(String[] args) {
        try {
            //调用Checked异常方法,要么在main方法中再次抛出,要么显示的处理它
            throwChecked(4);
        } catch (Exception e) {
            System.out.println(e.getMessage());
        }
        //调用抛出Runtime异常的方法,既可以显示的捕获它,也可以不理会该异常
        throwRunTime(4);
    }
     
    /*
     * 自行抛出Exception异常
     * 该代码必须在try块中,或者在带有throws声明的方法中
     */
    public static void throwChecked(int a )throws Exception{
        if (a>0){
            throw new Exception("a的值大于0");
        }
    }
     
    /*
     * 自行抛出Runtime异常
     * 可以完全不理会该异常,也可以交给该方法的调用者处理
     */
    public static void throwRunTime(int a){
        if (a>0) {
            throw new RuntimeException("a的值大于0");
        }
    }
 
}

  运行的结果:

 2. 自定义异常类#

1
2
3
4
5
6
7
8
9
10
11
12
13
/*
 * 自定义异常类,提供两个构造器
 * 如果希望是Runtime异常,则继承RuntimeException基类
 */
 class AuctionException extends Exception {
 
    public AuctionException() {
    }
 
    public AuctionException(String message) {
        super(message);
    }
}

  

3. catch和throw同时使用#

  企业级应用中通常对异常处理通常分为两个部分,一个是后台通过日志记录异常发生的详细情况,

另一个是根据异常向使用者(非开发者)传达某种提示。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
public class ExceptionDemo2 {
    private static double initPrice = 30.0;
    public static void bid(String bidPrice) {
        double d = 0.0;
        try {
            d = Double.parseDouble(bidPrice);
        } catch (Exception e) {
            //此处仅仅在控制台打印出异常
            e.printStackTrace();
            //再次抛出自定义异常
            throw new RuntimeException("竞拍的价格必须是数值");
        }
        if (initPrice > d){
            throw new RuntimeException("竞拍价不许比起拍价低");
        }
    }
 
    public static void main(String[] args) {
        try {
            bid("abc");
        } catch (Exception e) {
            //再次捕获异常,并处理
            System.err.print(e.getMessage());
        }
 
    }
 
}

  结果:

 

posted @   头痛不头痛  阅读(214)  评论(0编辑  收藏  举报
编辑推荐:
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
阅读排行:
· Manus爆火,是硬核还是营销?
· 终于写完轮子一部分:tcp代理 了,记录一下
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 单元测试从入门到精通
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
点击右上角即可分享
微信分享提示
主题色彩