Java异常处理与断言机制详解
发布时间: 2025-08-17 02:24:56 阅读量: 1 订阅数: 6 

### Java 异常处理与断言机制详解
#### 1. 引言
在软件开发中,程序的可靠性是至关重要的。当我们说一个程序可靠时,通常期望它能对所有有效输入产生正确的结果。然而,编写一个完全正确的程序并非易事,稍有不慎就可能引入错误,而且这些错误往往难以根除。
程序的可靠性主要体现在两个方面:正确性和健壮性。正确性保证程序对所有有效输入都能产生正确的结果;而健壮性则衡量程序在各种条件下的运行能力,例如当输入无效时,程序能否正常处理而不崩溃。
为了提高程序的可靠性,我们可以使用两种机制:断言(assertion)和异常处理(exception handling)。断言有助于在开发过程中捕获逻辑错误,而异常处理则可以增强程序的健壮性,使程序在遇到错误时能够优雅地处理,而不是直接崩溃。
#### 2. 捕获异常
异常处理机制可以看作是一种控制结构。当程序执行过程中出现错误时,会抛出一个异常,此时正常的执行流程会被终止,转而执行异常处理程序。当匹配的异常处理代码被执行时,我们称抛出的异常被捕获。
##### 2.1 异常示例
考虑以下代码:
```java
Scanner scanner = new Scanner(System.in);
System.out.print("Enter integer: ");
int number = scanner.nextInt();
```
如果输入的不是一个整数,例如 "abc123",系统会抛出 `InputMismatchException` 异常,并显示错误信息:
```
Exception in thread "main" java.util.InputMismatchException
at java.util.Scanner.throwFor(Scanner.java:819)
at java.util.Scanner.next(Scanner.java:1431)
at java.util.Scanner.nextInt(Scanner.java:2040)
at java.util.Scanner.nextInt(Scanner.java:2000)
at Ch8Sample1.main(Ch8Sample1.java:35)
```
在之前的开发中,我们通常让系统处理这些异常,但这可能导致程序产生错误结果或直接终止。为了提高程序的可靠性和健壮性,我们可以自己捕获并处理这些异常。
##### 2.2 异常处理示例
我们通过一个简单的程序来演示异常处理机制。定义一个服务类 `AgeInputVer1`,用于输入一个人的年龄:
```java
/*
Chapter 8 Sample Class: Class to input age
File: AgeInputVer1.java
*/
import java.util.*;
class AgeInputVer1 {
private static final String DEFAULT_MESSAGE = "Your age: ";
private Scanner scanner;
public AgeInputVer1() {
scanner = new Scanner(System.in);
}
public int getAge() {
return getAge(DEFAULT_MESSAGE);
}
public int getAge(String prompt) {
System.out.print(prompt);
int age = scanner.nextInt();
return age;
}
}
```
使用这个服务类,我们可以编写一个程序来获取一个人的年龄,并计算出他出生的年份:
```java
/*
Chapter 8 Sample Program: Input a person's age
File: Ch8AgeInputMain.java
*/
import java.util.*;
class Ch8AgeInputMain {
public static void main(String[] args) {
GregorianCalendar today;
int age, thisYear, bornYr;
String answer;
Scanner scanner = new Scanner(System.in);
AgeInputVer1 input = new AgeInputVer1();
age = input.getAge("How old are you? ");
today = new GregorianCalendar();
thisYear = today.get(Calendar.YEAR);
bornYr = thisYear - age;
System.out.print("Already had your birthday this year? (Y or N)");
answer = scanner.next();
if (answer.equals("N") || answer.equals("n")) {
bornYr--;
}
System.out.println("\nYou are born in " + bornYr);
}
}
```
如果用户输入的不是一个有效的整数,例如 "nine",程序会抛出 `InputMismatchException` 异常并终止。为了改进这个程序,我们可以使用 `try-catch` 语句来捕获并处理这个异常:
```java
public int getAge(String prompt) {
int age;
boolean keepGoing = true;
while (keepGoing) {
System.out.print(prompt);
try {
age = scanner.nextInt();
keepGoing = false;
} catch (InputMismatchException e) {
scanner.next(); // 移除输入缓冲区中的无效数据
System.out.println("Invalid Entry. Please enter digits only.");
}
}
return age;
}
```
在这个改进后的代码中,我们将可能抛出异常的语句 `age = scanner.nextInt();` 放在 `try` 块中,将处理异常的代码放在 `catch` 块中。如果输入无效,程序会显示错误信息,并继续提示用户输入,直到输入一个有效的整数为止。
我们还可以简化代码,去掉 `boolean` 变量:
```java
while (true) {
System.out.print(prompt);
try {
age = scanner.nextInt();
return age;
} catch (InputMismatchException e) {
scanner.next(); // 移除输入缓冲区中的无效数据
System.out.println("Invalid Entry. Please enter digits only.");
}
}
```
改进后的类命名为 `AgeInputVer2`。
##### 2.3 异常类型
在 Java 中,异常是 `Throwable` 类或其子类的实例。`Throwable` 类有两个子类:`Error` 和 `Exception`。`Error` 类及其子类表示严重的问题,普通应用程序通常不应该捕获这些异常;而 `Exception` 类及其子类表示应该被捕获的错误条件。在实际编程中,我们主要关注 `Exception` 类及其子类。
`Throwable` 类定义了两个方法:`getMessage` 和 `printStackTrace`,我们可以在 `catch` 块中调用这些方法来获取有关抛出异常的信息:
```java
try {
age = scanner.nextInt();
return age;
} catch (InputMismatchException e) {
scanner.next(); // 移除输入缓冲区中的无效数据
System.out.println(e.getMessage());
e.printSta
```
0
0
相关推荐









