Java异常处理全解析
立即解锁
发布时间: 2025-08-18 01:52:48 阅读量: 2 订阅数: 9 

### Java 异常处理全解析
#### 1. 异常处理基础问题
在 Java 编程中,异常处理是保障程序健壮性的重要环节。例如,在一个尝试将用户输入转换为整数的方法中,可能会遇到一些编译时错误。以下是一个示例代码:
```java
public static int getIntFromUser()
{
Scanner stdIn = new Scanner(System.in);
String xStr; // user entry
boolean valid; // is user entry a valid integer?
int x; // integer form of user entry
System.out.print("Enter an integer: ");
xStr = stdIn.next();
do
{
try
{
valid = false;
x = Integer.parseInt(xStr);
valid = true;
}
catch (NumberFormatException nfe)
{
System.out.print("Invalid entry. Enter an integer: ");
xStr = stdIn.next();
}
} while (!valid);
return x;
}
```
这段代码看似合理,但编译器会报错,提示 `valid` 和 `x` 可能未初始化。这是因为编译器是“悲观主义者”,它假设 `try` 块内的所有语句都可能被跳过,即使 `valid = false;` 语句实际上不会被跳过。
解决方案是将 `valid` 的赋值移到声明行,同时将 `x` 初始化为 0:
```java
public static int getIntFromUser()
{
Scanner stdIn = new Scanner(System.in);
String xStr; // user entry
boolean valid = false; // is user entry a valid integer?
int x = 0; // integer form of user entry
System.out.print("Enter an integer: ");
xStr = stdIn.next();
do
{
try
{
x = Integer.parseInt(xStr);
valid = true;
}
catch (NumberFormatException nfe)
{
System.out.print("Invalid entry. Enter an integer: ");
xStr = stdIn.next();
}
} while (!valid);
return x;
}
```
#### 2. 异常的分类
Java 中的异常分为两类:受检查异常(Checked Exceptions)和不受检查异常(Unchecked Exceptions)。
- **受检查异常**:必须使用 `try-catch` 机制进行处理。例如 `IOException` 就是一个受检查异常。
- **不受检查异常**:可以选择使用 `try-catch` 机制处理,但不是必需的。不过,如果在运行时 JVM 抛出不受检查异常且没有 `catch` 块捕获它,程序将会崩溃。
判断一个异常是受检查还是不受检查,可以通过查看其关联类的继承层次结构。如果该异常类是 `RuntimeException` 的子类,则为不受检查异常;否则为受检查异常。例如,`NumberFormatException` 是 `RuntimeException` 的子类,所以它是不受检查异常。
以下是异常类的继承层次结构:
```mermaid
graph TD;
Throwable --> CheckedExceptions(Checked Exceptions, e.g., IOException);
Throwable --> UncheckedExceptions(Unchecked Exceptions);
UncheckedExceptions --> InputMismatchException(InputMismatchException);
UncheckedExceptions --> NumberFormatException(NumberFormatException);
UncheckedExceptions --> SystemErrorExceptions(System Error Exceptions, e.g., VirtualMachineError);
Throwable --> Error;
Throwable --> Exception;
Exception --> RuntimeException;
```
#### 3. 不受检查异常的处理策略
如果程序中可能抛出不受检查异常,有两种处理策略:
- **使用 `try-catch` 结构**:在 `getIntFromUser` 方法中,我们使用 `try-catch` 结构处理了 `parseInt` 方法调用可能抛出的 `NumberFormatException`。通常,对于解析方法调用(如 `parseInt`、`parseLong`、`parseDouble` 等),使用 `try-catch` 结构可以得到更清晰的解决方案。
- **不捕获异常,但小心编写代码以避免异常抛出**:通过仔细编写代码,避免可能导致异常抛出的情况。
下面以 `StudentList` 类为例,该类管理学生姓名列表:
```java
import java.util.ArrayList;
public class StudentList
{
ArrayList<String> students = new ArrayList<String>();
public StudentList(String[] names)
{
for (int i=0; i<names.length; i++)
{
students.add(names[i]);
}
}
public void display()
{
for (int i=0; i<students.size(); i++)
{
System.out.print(students.get(i) + " ");
}
System.out
```
0
0
复制全文
相关推荐









