Java编程:异常处理与常见错误避免
立即解锁
发布时间: 2025-08-18 02:13:21 阅读量: 3 订阅数: 19 

### Java编程:异常处理与常见错误避免
#### 1. 字节复制与异常的初步认识
在进行字节从 `dataIn` 复制到 `dataOut` 的操作时,我们通常会使用 `while` 循环。由于条件为真,这个 `while` 循环看似是无限的。但最终,当到达 `dataIn` 文件的末尾时,`readByte` 方法会抛出一个 `EOFException`(文件结束异常)。这个异常的抛出会使程序跳出 `try` 子句和 `while` 循环,接着会执行 `catch` 子句中的内容,之后程序再继续正常处理。
#### 2. 异常处理与责任传递
在 Java 编程中,调用 `Thread.sleep` 方法来使程序暂停执行是常见的操作。例如,下面的代码试图让程序暂停 5 秒:
```java
/*
* This code does not compile.
*/
import static java.lang.System.out;
class NoSleepForTheWeary {
public static void main(String args[]) {
out.print("Excuse me while I nap ");
out.println("for just five seconds...");
takeANap();
out.println("Ah, that was refreshing.");
}
static void takeANap() {
Thread.sleep(5000);
}
}
```
然而,这段代码无法编译,因为 `Thread.sleep` 方法内部的代码可能会抛出一个 `InterruptedException` 异常。Java 编译器会给出如下错误信息:
```plaintext
unreported exception java.lang.InterruptedException; must be
caught or declared to be thrown
```
Java 中的异常分为两种类型:受检查异常(checked exceptions)和不受检查异常(unchecked exceptions)。
- **受检查异常**:其潜在抛出情况必须在代码中得到确认。
- **不受检查异常**:其潜在抛出情况不需要在代码中确认。
`InterruptedException` 属于受检查异常,当调用可能抛出该异常的方法时,必须在代码中确认该异常。确认异常有两种方式:
- **使用 `try-catch` 语句**:可能抛出异常的语句(包括方法调用)放在 `try` 子句中,并且该 `try` 子句有一个 `catch` 子句,其参数列表中的异常类型与抛出的异常类型匹配。示例代码如下:
```java
import static java.lang.System.out;
class GoodNightsSleepA {
public static void main(String args[]) {
out.print("Excuse me while I nap ");
out.println("for just five seconds...");
takeANap();
out.println("Ah, that was refreshing.");
}
static void takeANap() {
try {
Thread.sleep(5000);
} catch (InterruptedException e) {
out.println("Hey, who woke me up?");
}
}
}
```
- **使用 `throws` 子句**:可能抛出异常的语句(包括方法调用)放在一个方法中,该方法的头部有一个 `throws` 子句,其中包含与抛出异常类型匹配的异常类型。示例代码如下:
```java
import static java.lang.System.out;
class GoodNightsSleepB {
public static void main(String args[]) {
out.print("Excuse me while I nap ");
out.println("for just five seconds...");
try {
takeANap();
} catch (InterruptedException e) {
out.println("Hey, who woke me up?");
}
out.println("Ah, that was refreshing.");
}
static void takeANap() throws InterruptedException {
Thread.sleep(5000);
}
}
```
可以用一个排球游戏来形象地理解 `throws` 子句:在排球游戏中,排球就是异常。当对方球员发球时,相当于抛出异常。球越过球网到你这边,如果你将球击回对方场地,就相当于捕获了异常;但如果你把球传给其他球员,就相当于使用了 `throws` 子句,意思是“你来处理这个异常”。
#### 3. 不同类型异常的特点
Java API 中有数百种异常类型,其中一些是 `RuntimeException` 类的子类。任何 `RuntimeException` 的子类(包括子 - 子类、子 - 子 - 子类等)都是不受检查异常,而其他非 `RuntimeException` 后代的异常则是受检查异常。
|异常类型|特点|示例|
| ---- | ---- | ---- |
|不受检查异常|计算机难以预测,代码中处理可选|`NumberFormatException`、`ArithmeticException`、`IndexOutOfBo
0
0
复制全文
相关推荐










