AboutException
import javax.swing.*;
class AboutException {
public static void main(String[] a)
{
int i=1, j=0, k;
k=i/j;
try
{
k = i/j; // Causes division-by-zero exception
//throw new Exception("Hello.Exception!");
}
catch ( ArithmeticException e)
{
System.out.println("��0��. "+ e.getMessage());
}
catch (Exception e)
{
if (e instanceof ArithmeticException)
System.out.println("��0��");
else
{
System.out.println(e.getMessage());
}
}
finally
{
JOptionPane.showConfirmDialog(null,"OK");
}
}
}

要解释这两个现象,可从Java 对整数和浮点数除以零的不同处理逻辑来分析:
- 整数除法(int i/j)引发异常
在 Java 中,整数类型(int、long等)的除法运算里,除以 0 是数学上的无意义操作,因此 Java 会明确抛出 java.lang.ArithmeticException: / by zero 异常,强制开发者处理这种非法运算。 - 浮点数除法(double d1/d2)不引发异常
对于浮点数类型(float、double),Java 遵循IEEE 754 浮点数规范:当浮点数除以 0 时,结果被定义为无穷大(Infinity),属于合法的浮点特殊值,因此不会抛出异常,而是返回Infinity来表示这个结果。
简言之,差异源于整数和浮点数在 “除以 0” 场景下的语义定义不同:整数除法严格拒绝除以 0 的操作,浮点数则通过 “无穷大” 的特殊值来兼容这种运算。![image]()
finally的作用

(最后执行)






当存在多层嵌套的finally语句块时,异常在不同层次、不同位置抛出,可能会导致finally语句块的执行顺序不同。

不执行的典型场景及示例
程序被强制终止:通过System.exit(0)直接终止虚拟机,后续代码(包括 finally)均不执行。
示例:
java
运行
try {
System.out.println("try块执行");
System.exit(0); // 强制终止程序
} catch (Exception e) {
e.printStackTrace();
} finally {
System.out.println("finally块执行"); // 不会输出
}
线程被中断或死亡:执行 try 块的线程被其他线程中断(Thread.interrupt())或直接销毁,且未触发异常处理流程。
示例:
java
运行
Thread t = new Thread(() -> {
try {
System.out.println("线程执行try块");
Thread.currentThread().stop(); // 强制停止线程(已过时,但能演示效果)
} finally {
System.out.println("finally块执行"); // 不会输出
}
});
t.start();
运行环境崩溃:如虚拟机崩溃、电脑断电、进程被强制杀死等硬件或系统级异常,程序直接终止。


这段代码无法通过编译的核心原因是未正确处理受检异常(Checked Exception)。
具体分析如下:FileInputStream的构造方法(如new FileInputStream("a.txt"))在 Java 中被声明为会抛出IOException(这是一种受检异常)。根据 Java 语法规则:
对于受检异常,必须显式处理 —— 要么用try-catch块捕获并处理,要么在方法声明中通过throws关键字声明该异常由调用者处理。
而示例中的main方法:
既没有用try-catch块捕获IOException;
也没有在main方法的声明中添加throws IOException来声明抛出该异常。
因此违反了 Java 对受检异常的强制处理规则,编译器会直接报错,导致无法通过编译。

浙公网安备 33010602011771号