当前位置: 首页 > news >正文

Java 异常与调试

Java 异常与调试

错误、异常
Error(错误):系统级严重问题,比如内存溢出、JVM 崩溃,代码无法处理。
Exception(异常):程序运行时可预料、可处理的问题,比如输入格式不对、数组越界、空指针。
编译期异常:必须手动处理(IO、文件、自定义异常等)
运行期异常:代码不报错,运行才崩溃(空指针、数组下标越界、类型转换异常)
核心:try-catch-finally 异常捕获
基础语法
try {
// 可能出现异常的代码
} catch (异常类型 e) {
// 异常发生时,执行这里的补救逻辑
} finally {
// 无论是否异常,最后一定会执行
}
执行规则
try 里代码正常跑完 → 跳过 catch,直接走 finally
try 里抛出异常 → 立刻跳到对应 catch,不会继续执行 try 后续代码,再走 finally
finally 几乎必执行,常用于关闭 Scanner、流、数据库连接
简单示例
import java.util.Scanner;

public class Test {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
try {
System.out.print("请输入数字:");
int num = sc.nextInt(); // 输入字母会触发 输入不匹配异常
System.out.println("你输入:" + num);
} catch (Exception e) {
System.out.println("输入格式错误!");
} finally {
sc.close(); // 无论对错,都关闭扫描器
System.out.println("程序结束");
}
}
}
throws /throw 抛出异常
throws(写在方法声明上)
作用:把异常抛给调用者处理,当前方法不捕获。

// 声明该方法可能抛出异常,交给调用方处理
public static void test() throws Exception {
int a = 1 / 0;
}

public static void main(String[] args) {
try {
test();
} catch (Exception e) {
System.out.println("捕获到异常");
}
}
throw(方法内部手动抛出异常对象)
作用:主动制造 / 抛出异常,多用于自定义规则校验。

public static void checkAge(int age) throws Exception {
if (age < 0) {
// 手动抛出异常
throw new Exception("年龄不能为负数");
}
}
IDEA 调试(图形化断点调试,排BUG)
基本操作
断点:点击代码行号左侧,出现红色小圆点,程序运行到这里会暂停。
启动调试:右键代码 → Debug(不是普通 Run)。
常用调试按钮
Step Over(F8):逐行往下走,跳过方法内部
Step Into(F7):进入调用的方法内部
Step Out(Shift+F8):跳出当前方法
Resume(F9):直接运行到下一个断点
下方面板:实时查看变量值,快速定位逻辑错误。
常见运行异常
NullPointerException 空指针:使用了 null 对象的属性 / 方法
ArrayIndexOutOfBoundsException 数组下标越界
InputMismatchException 输入类型不匹配(如用 nextInt() 读字母)
ArithmeticException 算术异常(除 0)
总结(记忆要点)
try-catch:当场捕获并处理异常,保证程序不崩溃。
finally:必执行,用于释放资源。
throws:方法声明异常,甩给调用者。
throw:代码里手动抛出异常。
IDEA 断点调试:逐行看变量,排查逻辑错误首选。