写程序时,谁还没遇到过几个报错?比如读文件发现文件不存在,或者网络请求突然断了。这些意外情况就是“ref="/tag/153/" style="color:#643D3D;font-weight:bold;">异常”,不处理好,程序直接崩溃。这时候就得靠 try catch 来兜底。
什么是异常类
在编程里,异常也是一个对象,属于某个异常类。比如 Java 里的 IOException、NullPointerException,Python 中的 FileNotFoundError、ValueError。每种异常对应不同的出错场景,系统抛出异常时,会生成一个该类的实例。
你可以把异常类看成是“错误说明书”,不仅告诉你哪里错了,还可能附带错误信息,比如文件路径找不到的具体位置。
try catch 怎么用
try catch 就是用来捕获并处理异常的结构。把可能出问题的代码放进 try 块里,一旦出错,就跳到对应的 catch 块处理,而不是直接退出程序。
以 Java 为例:
try {
int result = 10 / 0;
} catch (ArithmeticException e) {
System.out.println("不能除以零:" + e.getMessage());
}
上面这段代码,除以零会触发 ArithmeticException,catch 捕获后打印提示,程序继续运行,不会崩。
多个异常怎么处理
一段代码可能引发多种异常,可以写多个 catch 分别处理。
try {
int[] arr = new int[5];
arr[10] = 100; // 数组越界
Object obj = null;
obj.toString(); // 空指针
} catch (ArrayIndexOutOfBoundsException e) {
System.out.println("数组下标越界:" + e.getMessage());
} catch (NullPointerException e) {
System.out.println("空指针异常:" + e.getMessage());
}
注意顺序:子类异常在前,父类在后。否则编译器会报错,因为父类会“挡住”子类的捕获机会。
finally 干啥用
有时候不管出不出错,都想执行一段代码,比如关闭文件、释放资源。这时可以用 finally。
FileInputStream fis = null;
try {
fis = new FileInputStream("data.txt");
// 读取操作
} catch (FileNotFoundException e) {
System.out.println("文件没找到:" + e.getMessage());
} finally {
if (fis != null) {
try {
fis.close();
} catch (IOException e) {
System.out.println("关闭文件失败:" + e.getMessage());
}
}
}
finally 里的代码总会执行,适合做清理工作。当然现在更多推荐用 try-with-resources,自动管理资源。
别滥用 try catch
不是所有地方都得包一层 try catch。比如明知道某个参数不该为空,就应该提前校验,而不是等它抛出 NullPointerException 再去抓。过度使用会让代码变得臃肿,掩盖真正的逻辑问题。
还有些人把整个 main 方法都包进 try,只为了不让程序退出。这就像给破车贴创可贴——表面没事,里头早就烂了。
自定义异常类
系统提供的异常不够用怎么办?可以自己写异常类。比如开发银行转账功能,可以定义一个 InsufficientBalanceException。
class InsufficientBalanceException extends Exception {
public InsufficientBalanceException(String message) {
super(message);
}
}
// 使用
try {
if (balance < amount) {
throw new InsufficientBalanceException("余额不足");
}
} catch (InsufficientBalanceException e) {
System.out.println(e.getMessage());
}
这样业务逻辑更清晰,别人一看就知道发生了什么。
异常处理不是为了消灭报错,而是让程序更有韧性。写代码时多想想“万一”,比出事后再补救强得多。