文章目录
- 什么是Java 异常?
- Java中异常有哪些类型?
- 怎么处理编译时异常?
- 总结
今天咱们聊聊Java世界里不可或缺的一部分——异常(Exception)。就像人生中的起起落落,编程世界也充满了不可预知的风险和状况,这就是我们今天的主角“异常”登场的时刻。
什么是Java 异常?
首先来聊聊什么是Java 异常,想象你在世界杯决赛中射门,突然,足球爆了!这就是异常——不期而至的问题。在Java中,异常是在程序执行期间发生的事件,它打断了正常的指令流程。就好比足球比赛需要一个完好无损的足球,我们的程序也需要一个“异常”处理机制来确保比赛能够继续。
Java中异常有哪些类型?
Java的异常像是一棵繁茂的家谱树。顶端是Throwable
,下边分为两大支:Error
和Exception
。
-
Error: 这是你们永远不希望遇到的重量级角色,比如
OutOfMemoryError
。它们通常是JVM故障的表现,反正遇到它们,一般你的程序就玩完了,就像足球场塌了一样。 -
Exception: 这是我们常说的异常,它又分为两个分支:
RuntimeException
和其他。-
RuntimeException
,运行时异常,也称为非受检异常——这些家伙玩起“偷袭”,不需要你显式处理,常见的比如NullPointerException
(空指针异常)。就像场上的球员突然地滑了一跤,你很难事先预知和避免。 -
其他异常,它们是受检异常(Checked Exceptions),必须得到妥善处理,否则编译器就不高兴了,程序就不能顺利运行。就好比规则确定比赛中必须穿鞋,你不按规则来,裁判员(编译器)会毫不留情地吹响哨声。
-
怎么处理编译时异常?
面对这些爱搞事的编译时异常,你得有准备,以下是几种方法。
-
声明异常
在 Java 中,当前执行的语句必属于某个方法。Java 解释器调用 main 方法开始执行一个程序。每个方法都必须声明它可能抛出的必检异常的类型。这称为声明异常( declaring exception)。只对编译时异常进行声明,、告知方法的调用者有异常。为了在方法中声明一个异常,就要在方法头中使用关键字 throws
如果方法没有在父类中声明异常,那么就不能在子类中对其进行继承来声明异常。
再举个栗子:
如果你认为这次犯规超出了你的处理范围,你可以选择将这个问题上报给裁判(向上抛出异常),让比赛的下一个环节来处理这个问题。这就是我们的throws
关键字的作用。public void readFile() throws FileNotFoundException { // 若文件不存在,异常会被抛给readFile()方法的调用者 FileReader file = new FileReader("还是我不存在.txt"); }
-
捕捉异常: 使用
try-catch
块。想象场上发生犯规,裁判员(编译器)吹响了哨声,try
就是你的防御策略,它告诉裁判“看我怎么巧妙解围”。catch
就是具体怎么解围的方案,无论是回传给守门员还是直接开大脚。举个栗子:
try { // 这里尝试执行某些动作 file = new FileReader("我不存在.txt"); } catch (FileNotFoundException e) { // 哦豁,文件找不到,怎么办? System.out.println("别慌,换个文件试试!"); }
-
抛出异常
检测到错误的程序可以创建一个合适的异常类型的实例并抛出它,这就称为抛出一个异常(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之间的区别,并着重介绍了如何处理编译时异常。现在,每当程序中出现非预期事件时,你将拥有处理它们的策略和技巧。正如足球比赛中,每当发生意料之外的情况时,如果裁判员、教练和球员都做好了准备,比赛仍然可以顺利进行。同理,编写代码时,我们也应该做好异常处理的准备,让程序的比赛继续下去。别忘了,优秀的程序员是那些知道如何备足“安全网”的人!
如果文章有任何问题,欢迎指出!
欢迎大家访问我的个人博客 无限进步的博客