Java中的异常:理解与处理编程中的“预期之外”


今天咱们聊聊Java世界里不可或缺的一部分——异常(Exception)。就像人生中的起起落落,编程世界也充满了不可预知的风险和状况,这就是我们今天的主角“异常”登场的时刻。

什么是Java 异常?

首先来聊聊什么是Java 异常,想象你在世界杯决赛中射门,突然,足球爆了!这就是异常——不期而至的问题。在Java中,异常是在程序执行期间发生的事件,它打断了正常的指令流程。就好比足球比赛需要一个完好无损的足球,我们的程序也需要一个“异常”处理机制来确保比赛能够继续。

Java中异常有哪些类型?

Java的异常像是一棵繁茂的家谱树。顶端是Throwable,下边分为两大支:ErrorException
在这里插入图片描述

  • Error: 这是你们永远不希望遇到的重量级角色,比如OutOfMemoryError。它们通常是JVM故障的表现,反正遇到它们,一般你的程序就玩完了,就像足球场塌了一样。

  • Exception: 这是我们常说的异常,它又分为两个分支:RuntimeException和其他。

    • RuntimeException,运行时异常,也称为非受检异常——这些家伙玩起“偷袭”,不需要你显式处理,常见的比如NullPointerException(空指针异常)。就像场上的球员突然地滑了一跤,你很难事先预知和避免。

    • 其他异常,它们是受检异常(Checked Exceptions),必须得到妥善处理,否则编译器就不高兴了,程序就不能顺利运行。就好比规则确定比赛中必须穿鞋,你不按规则来,裁判员(编译器)会毫不留情地吹响哨声。

怎么处理编译时异常?

面对这些爱搞事的编译时异常,你得有准备,以下是几种方法。

  1. 声明异常
    在 Java 中,当前执行的语句必属于某个方法。Java 解释器调用 main 方法开始执行一个程序。每个方法都必须声明它可能抛出的必检异常的类型。这称为声明异常( declaring exception)。只对编译时异常进行声明,、告知方法的调用者有异常。

    为了在方法中声明一个异常,就要在方法头中使用关键字 throws

    如果方法没有在父类中声明异常,那么就不能在子类中对其进行继承来声明异常。

    再举个栗子:
    如果你认为这次犯规超出了你的处理范围,你可以选择将这个问题上报给裁判(向上抛出异常),让比赛的下一个环节来处理这个问题。这就是我们的throws关键字的作用。

    public void readFile() throws FileNotFoundException {
        // 若文件不存在,异常会被抛给readFile()方法的调用者
        FileReader file = new FileReader("还是我不存在.txt");
    }
    
  2. 捕捉异常: 使用try-catch块。想象场上发生犯规,裁判员(编译器)吹响了哨声,try就是你的防御策略,它告诉裁判“看我怎么巧妙解围”。catch就是具体怎么解围的方案,无论是回传给守门员还是直接开大脚。

    举个栗子:

    try {
        // 这里尝试执行某些动作
        file = new FileReader("我不存在.txt");
    } catch (FileNotFoundException e) {
        // 哦豁,文件找不到,怎么办?
        System.out.println("别慌,换个文件试试!");
    }
    
  3. 抛出异常

    检测到错误的程序可以创建一个合适的异常类型的实例并抛出它,这就称为抛出一个异常(throwing an exception)。

    举个例子:

    假设你正在写一个简单的银行账户管理程序,其中有一个方法是用于提取现金(withdraw),该方法接收一个参数表示要提取的金额。我们知道,账户里的金额是有限的,如果尝试提取超过账户余额的金额时,就会引发一个异常。

    现在,让我们来看一下这个方法的实现:

    public void withdraw(double amount) throws InsufficientFundsException {
       if (amount > balance) {
          throw new InsufficientFundsException("提取金额超过账户余额");
       }
       balance -= amount;
       System.out.println("成功提取现金:" + amount);
    }
    

    在上面的代码中,我们首先进行判断,如果提取的金额大于账户余额(balance),那么我们就会抛出一个自定义的异常(InsufficientFundsException),并在异常的构造方法中传入一条错误信息。

注意:声明异常的关楗字是 throws, 抛出异常的关键字是 throw。

总结

本文通过比赛的有趣比喻,概述了Java中异常的概念和分类。我们探讨了Error和Exception之间的区别,并着重介绍了如何处理编译时异常。现在,每当程序中出现非预期事件时,你将拥有处理它们的策略和技巧。正如足球比赛中,每当发生意料之外的情况时,如果裁判员、教练和球员都做好了准备,比赛仍然可以顺利进行。同理,编写代码时,我们也应该做好异常处理的准备,让程序的比赛继续下去。别忘了,优秀的程序员是那些知道如何备足“安全网”的人!

如果文章有任何问题,欢迎指出!
欢迎大家访问我的个人博客 无限进步的博客

  • 4
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

小崔同学24

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值