Java异常处理与JavaSound应用详解
立即解锁
发布时间: 2025-08-18 01:24:42 阅读量: 1 订阅数: 7 

### Java 异常处理与 JavaSound 应用详解
#### 1. 异常的多态性
异常在 Java 中是对象,除了可以被抛出之外,并没有什么特别之处。和其他对象一样,异常也可以进行多态引用。例如,`LingerieException` 对象可以赋值给 `ClothingException` 引用,`PantsException` 可以赋值给 `Exception` 引用。
异常多态性的好处在于,方法不必显式声明它可能抛出的每一个异常,而是可以声明这些异常的超类。同样,在 `catch` 块中,只要所使用的 `catch` 块能够处理抛出的任何异常,就不必为每个可能的异常都编写一个 `catch` 块。
以下是相关代码示例:
```java
public void doLaundry() throws ClothingException {
// 声明 ClothingException 后,可以抛出其任何子类异常
}
try {
laundry.doLaundry();
} catch(ClothingException cex) {
// 恢复代码
}
try {
laundry.doLaundry();
} catch(ShirtException sex) {
// 恢复代码
}
```
在上述代码中,`doLaundry()` 方法声明抛出 `ClothingException`,意味着它可以抛出 `PantsException`、`LingerieException`、`TeeShirtException` 和 `DressShirtException` 等异常,而无需单独声明。第一个 `catch` 块可以捕获任何 `ClothingException` 子类的异常,第二个 `catch` 块只能捕获 `TeeShirtException` 和 `DressShirtException`。
异常继承树的层次越高,`catch` “篮子” 就越大;层次越低,“篮子” 就越小。例如,`ShirtException` 可以捕获 `TeeShirtException` 或 `DressShirtException`,而 `ClothingException` 则可以捕获更多类型的异常,包括 `PantsException`、`UniformException`、`LingerieException` 和 `ShirtException` 等。`Exception` 是所有异常的超类,它可以捕获任何异常,包括运行时异常,但通常只在测试时使用。
多个 `catch` 块必须按照从小到大的顺序排列。例如:
```java
try {
laundry.doLaundry();
} catch(TeeShirtException tex) {
// 处理 TeeShirtException
} catch(ShirtException sex) {
// 处理其他 ShirtException 子类异常
} catch(ClothingException cex) {
// 处理其他 ClothingException 异常
}
```
如果将大的 `catch` 块放在前面,后面的小 `catch` 块将永远不会被执行,因为 JVM 会从第一个 `catch` 块开始,依次向下查找能够处理异常的 `catch` 块。
#### 2. 异常处理的两种方式
当调用一个可能抛出异常的方法时,有两种方式可以满足编译器的要求:处理或声明。
##### 2.1 处理异常
使用 `try/catch` 块来捕获并处理异常。例如:
```java
try {
laundry.doLaundry();
} catch(ClothingException cex) {
// 恢复代码
}
```
这里的 `catch` 块必须足够大,以处理 `doLaundry()` 方法可能抛出的所有异常,否则编译器会报错。
##### 2.2 声明异常
如果不想处理异常,可以通过声明异常来“躲避”它。例如:
```java
void foo() throws ClothingException {
laundry.doLaundry();
}
```
在这个例子中,`foo()` 方法声明抛出 `ClothingException`,意味着调用该方法的代码必须处理这个异常,否则也需要声明抛出该异常。
以下是一个完整的示例:
```java
public class Washer {
Laundry laundry = new Laundry();
public void foo() throws ClothingException {
laundry.doLaundry();
}
public static void main (String[] args) throws ClothingException {
Washer a = new Washer();
a.foo();
}
}
```
在这个示例中,`foo()` 方法和 `main()` 方法都声明抛出 `ClothingException`,如果没有合适的处理代码,最终异常会被抛给 JVM,导致 JVM 关闭。
#### 3. 异常处理规则
异常处理有一些规则需要遵守:
- 不能在没有 `try` 的情况下使用 `catch` 或 `finally`。例如:
```java
void go() {
Foo f = new Foo();
f.foof();
catch(FooException ex) { }
}
```
这段代码是非法的,因为缺少 `try` 块。
- 不能在 `try` 和 `catch` 之间插入代码。例如:
```java
try {
x.doStuff();
}
int y = 43;
} catch(Exception ex) { }
```
这段代码也是非法的。
- `try` 后面必须跟着 `catch` 或 `finally`。例如:
```java
try {
x.doStuff();
} finally {
// 清理代码
}
```
这段代码是合法的,即使没有 `catch` 块,但 `try` 不能单独存在。
- 只有 `finally` 块(没有 `catch` 块)的 `try` 仍然必须声明异常。例如:
```java
void go() throws FooException {
try {
```
0
0
复制全文
相关推荐










