Java 中的抛出
你亲自用 throw 写出停止。打开 Signal.java,在任何 water 打印之前抛出带消息 empty 的 IllegalArgumentException。用 javac Signal.java 编译并运行 java Signal。程序在 throw 行停止;不打印 water。第二个演示把 cups 设为 0,让 if 进入并抛出。第三个把 cups 设为 3,跳过 if,屏幕打印 water。把读文件留给下一页。
你写出停止
前面的页面展示过因一行打破规则而出现的停止——坏数组下标抛出 ArrayIndexOutOfBoundsException。本页是相反方向。你选择异常类型并写 throw,让停止发生在你想要的时候。打开名为 Signal.java 的教学文件。保持公共类名 Signal 与文件名一致。删除残留的 Guard catch 演示、Alarm 数组停止,以及任何 Scanner 或 nextLine。程序不能等待键盘。本页不需要 import 行。
在 main 里,在任何安静的成功打印之前抛出:
throw new IllegalArgumentException("empty");
然后保留一行在 throw 触发时不该运行的打印:
System.out.println("water");
引号中的词是消息。类型名是 IllegalArgumentException。你不是在除以零,也不是在读 slots[5]。停止存在是因为你写了 throw。
public class Signal {
public static void main(String[] args) {
throw new IllegalArgumentException("empty");
// water would not run after throw
}
}
在存放 Signal.java 的文件夹中运行 javac Signal.java。括号、花括号和分号匹配时,javac 不会输出自己的一行。然后运行 java Signal——不是 java Signal.java。运行命令不要带 .java 后缀。
运行在 throw 行停止。终端会写出 IllegalArgumentException 并显示消息 empty。该 throw 之后的 water 打印不会执行,因为程序已经停止。如果在同一 main 里 throw 之后保留不可达的 System.out.println("water");,有些编译器会警告不可达代码;教学要点不变:throw 之后该路径上的普通行不会运行。若 javac 抱怨,优先用没有死打印的裸 throw 文件——停止本身就是课。
如果终端等待键盘输入,说明文件里还有旧练习的 nextLine 调用。删掉它。若看到 blocked 然后 after,说明还在运行 Guard catch 文件——改用 java Signal。若从 slots[5] 看到 ArrayIndexOutOfBoundsException,说明 Alarm 残留仍活跃;请换成这一课的 throw 行。
零 cups 进入 if 并抛出
第二个程序重新开始。把 cups 存为 0。若 cups 小于 1,抛出同样的 IllegalArgumentException 和消息 empty。在 if 之后保留 water 打印。
public class Signal {
public static void main(String[] args) {
int cups = 0;
if (cups < 1) {
throw new IllegalArgumentException("empty");
}
System.out.println("water");
}
}
用 javac Signal.java 编译,然后运行 java Signal。零小于一,于是进入 if 并执行 throw。屏幕显示同样的停止:IllegalArgumentException 和 empty。不会打印 water。本页没有 catch,程序在那里结束。这是刻意的——上一页练了 catch;本页练写 throw。
走一遍花括号。throw 行在 if 块内。water 打印在 if 外。throw 一旦运行,程序已经停止,water 永远到不了。缩进和花括号把 throw 放在检查里面。
三 cups 跳过 throw 并打印 water
第三个程序也重新开始。把 cups 设为 3。保持同样的 if、同样的 throw 和同样的 water 打印。
public class Signal {
public static void main(String[] args) {
int cups = 3;
if (cups < 1) {
throw new IllegalArgumentException("empty");
}
System.out.println("water");
}
}
再次用 javac Signal.java 和 java Signal 编译运行。三不小于一,于是不进入 if。throw 从不运行。屏幕打印 water。没有停止。这个对比是检查点:只有条件说值不可用时 throw 才会触发。
本页不要给这些教学文件包上 catch。你已在 Guard 上练过 catch。这里要看到你写出的停止,以及跳过 throw 的路径。也不要把空 cups 的 IllegalArgumentException 换成 ArrayIndexOutOfBoundsException——那个名字属于坏数组下标,不属于你用 throw 写的值检查。
你写下的名称
你抛出的类型是 IllegalArgumentException,不是 ArrayIndexOutOfBoundsException,也不是把裸词 empty 当类型。消息 empty 是你选择在名称旁显示的内容。若以后捕获这次停止,catch 子句必须写 IllegalArgumentException。捕获 NullPointerException 不会处理它。今天这些 Signal 文件不要求 catch 练习。
IllegalArgumentException 在初学者常见用法中是运行时异常,因此这些小 main 演示不需要在 main 上写 throws 子句。坚持这一种清晰的类型和消息。下一页打开文件之前不需要 Throwable 类大全。
与 Guard 上的 catch 对比
在 try-catch 页,java Guard 处理了坏下标并继续到 after。本页 java Signal 故意造成停止且不捕获。数组故事已是历史。若 Guard 文件还在附近,仅作旧演示保留;throw 演示请运行 java Signal,让屏幕与本课一致。
本页为 files 留下什么
本页只展示你用 throw 造成停止。下一页开始读文件。请专注写出停止,并在 cups 可用时跳过它。这些 Signal 演示上还不要要求打开文件。
进入 files 之前
你可以抛出 IllegalArgumentException("empty") 并看到运行在 water 之前停止。cups 为 0 时进入 if 并发生同样停止。cups 为 3 时 throw 不运行,屏幕打印 water。编译 Signal.java 并依次对每个保留演示运行 java Signal。这次停止的名称是 IllegalArgumentException。下一页是读文件。
为清晰保留裸 throw 停止。保留 cups 一对用于可跳过 throw 的条件。把读文件留在本页之外。这三条习惯是继续前的检查点。当 water 只在 cups 为三的 java Signal 运行中出现时,throwing 完成了本课任务,你已准备好文件主题。
🧠 测试您的知识
测试您的知识
通过这个互动测验挑战自己,看看你对这个主题的理解程度如何
📝 说明
- 仔细阅读每个问题
- 为每个问题选择最佳答案
- 您可以随时重新参加测验
- 您的进度将显示在顶部