正在加载...

Java 中的异常

保留一个小的 int 数组 slots,里面是 2 和 4。打印 slots[0],让屏幕显示 2。然后看若改成要 slots[5] 会发生什么:Java 抛出 ArrayIndexOutOfBoundsException,程序停止。先编译 Alarm.java,再对安全文件运行 java Alarm。看到因规则被打破而导致的运行时停止——不是缺分号——就是本页要教的。把 try 和 catch 留给下一页。

一次能正常结束的安全读取

异常是 Java 用来说明程序运行时某条规则被打破了。到目前为止,多数演示打印一行清晰输出后安静结束。本页先保留安静演示,再保留一个以异常名停止的演示。
打开 Alarm.java。保留公共类名 Alarm,使它与文件名一致。删掉残留的 ArrayList<Integer>、nums.add(9)、Crate 演示,以及对 oak 和 pine 的任何 for-each。也删掉任何 Scanner 或 nextLine。程序不得等待输入。本页不需要 import 行。
在 main 里存两个整数:
int[] slots = {2, 4};
然后打印第一个槽位:
System.out.println(slots[0]);
槽位编号从零开始。零号槽位是 2。编译前先保存。

Alarm safe slots zero

java
public class Alarm {
    public static void main(String[] args) {
        int[] slots = {2, 4};
        System.out.println(slots[0]);
    }
}

在放有 Alarm.java 的文件夹里运行 javac Alarm.java。当圆括号、花括号和分号都匹配时,javac 自己不写任何一行。再运行 java Alarm——不要 java Alarm.java。运行命令里去掉 .java 后缀。
程序应打印一行后停止:2。它不应要求你打字。若终端在等键盘输入,说明旧练习里的 nextLine 调用还留在某个文件里。删掉该调用,保留数组和 System.out.println(slots[0]);。
把这次运行走一遍。Java 从 Alarm.main 开始。数组有两个值。打印读取零号槽位。屏幕显示 2。不应再打印别的。若看到 9,说明 Crate 的 wrappers 演示还在跑——改跑 java Alarm。若看到 4,你打印了 slots[1];安全教学文件保留 slots[0]。

会抛出异常的坏索引

只改打印行,让它要一个从未写入的槽位:slots[5]。数组仍然只有两个槽位。运行时 Java 不打印数字,而是抛出异常。

Alarm bad index throws

java
public class Alarm {
    public static void main(String[] args) {
        int[] slots = {2, 4};
        System.out.println(slots[5]);
    }
}

用 javac Alarm.java 编译,再运行 java Alarm。这次程序不打印 2。终端显示一份错误报告,其中点名 ArrayIndexOutOfBoundsException。运行停止。你可能以为会在那次打印之后执行的行不会跑,因为异常已经停了程序。注意 javac 仍可能成功——坏索引是运行时问题,不是缺分号。
这次停止就是本课。你不是在本页用 try 修索引。你要学会认出:运行时被打破的规则会变成异常并结束正常路径。在报告里读异常名。坏索引文件只用来看这次停止。想要安静屏幕显示 2 时,优先用安全文件。若把坏索引改回 slots[0],安静屏幕会回来;这证明停止来自索引,不是类名 Alarm。
不要把堆栈报告当成普通的 println 结果。Java 在告诉你哪里出了错。谈到异常类型时,拼写很重要:ArrayIndexOutOfBoundsException。对本课只说「错误」太含糊——描述停止时保留完整类型名。

wrappers 残留不是这次崩溃

第三个文件提醒你上一页的 Integer 列表。那个演示打印 9 后结束。它不是异常故事。

Alarm wrappers leftover contrast

java
import java.util.ArrayList;

public class Alarm {
    public static void main(String[] args) {
        ArrayList<Integer> nums = new ArrayList<Integer>();
        nums.add(9);
        System.out.println(nums.get(0));
    }
}

这个对照打印 9 且不抛出就结束。只用它把已完成的 wrappers 路径和坏索引 Alarm 路径分开。对本页异常课,教学一对是安全的 slots[0] 打印和会抛出的 slots[5] 打印。本页根本不要在任何数组演示外层编造 try 或 catch。

与数组页和 wrappers 页对照

在数组页你留在已写入的槽位内。本页故意越界,好让你看见异常。在 wrappers 页,Integer 列表打印 9 且不崩溃。那仍可作为历史。本页保留 Alarm 和数组索引故事。
还有别的异常——例如除以零可能抛出 ArithmeticException。本页只保留一个清楚的名字:坏索引带来的 ArrayIndexOutOfBoundsException。今天不需要每一种异常类型的目录。在下一页教处理之前,一个扎实例子就够了。
若附近还有旧的 Crate.java,先留着,只有在搞不清你运行哪个类时再删。编译你要看的那个演示文件后运行 java Alarm。有意切换文件,学习时不要把安全打印和抛出打印混在同一个 main 里。

留给 try 和 catch 的内容

本页说明异常可以在运行时停止程序。下一页介绍 try 和 catch,好让你处理一些问题而不必结束整次运行。此处先停留在认出停止和异常名。本页先不要把 catch 块当成硬性要求。

在 try 和 catch 之前

你可以从 {2, 4} 打印 slots[0] 并看到 2。你可以打印 slots[5] 并看到运行因 ArrayIndexOutOfBoundsException 停止。对每个保留的演示轮流编译 Alarm.java 并运行 java Alarm。异常清楚点名了被打破的规则。下一页是 try 和 catch,在那里处理后的路径可以在某些错误之后继续。
保留安全演示以得到安静屏幕。保留坏索引以看见停止。本页不要写 try。这三条习惯是继续前进前的检查点。当你在 java Alarm 的坏索引运行后能说出 ArrayIndexOutOfBoundsException,异常就完成了本课任务,你已准备好学习下一主题——处理。

🧠 测试您的知识

准备开始

测试您的知识

通过这个互动测验挑战自己,看看你对这个主题的理解程度如何

❓
6
问题
🎯
70%
及格要求
♾️
∞
时间
🔄
∞
尝试次数

📝 说明

  • 仔细阅读每个问题
  • 为每个问题选择最佳答案
  • 您可以随时重新参加测验
  • 您的进度将显示在顶部