java错误分编译错误和运行时异常两类:前者由javac在编译期发现,如语法错误、未初始化变量等,不生成.class文件;后者继承runtimeexception,在jvm运行时抛出,如nullpointerexception、arrayindexoutofboundsexception等。

Java 编程中,错误分两类:一类卡在编译前,根本跑不起来;另一类程序能启动,但一执行就崩。搞清它们的区别和典型表现,排查效率直接翻倍。
编译错误:代码没过“安检”,压根进不了 JVM
这类错误由 javac 编译器发现,不会生成 .class 文件。常见原因不是语法写错,就是语义违规。
-
关键字或标识符拼写错误:比如把
public写成pubic,或变量名以数字开头(1count),编译器会报error: class, interface, or enum expected或illegal start of expression -
缺少分号、括号或大括号:方法体末尾漏掉
;,if 块少了},或者类定义缺了右大括号,错误提示通常带expected字样 -
修饰符使用不当:比如用
private修饰顶层类,或在静态方法里直接访问实例变量,编译器会明确指出“非法的修饰符”或“无法从静态上下文中引用” -
局部变量未初始化就使用:声明了
String s;却直接调s.length(),编译报variable s might not have been initialized
运行时异常:程序跑起来了,但中间突然“断电”
这些异常继承自 RuntimeException,JVM 在执行字节码时才抛出,编译阶段完全不管——所以容易被忽略,直到上线才暴露。
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
-
NullPointerException:最常见。对
null对象调方法、访问字段、或自动拆箱(如Integer i = null; int x = i;)都会触发 -
ArrayIndexOutOfBoundsException:数组索引小于 0 或大于等于长度,比如
int[] a = {1}; a[1] -
ArithmeticException:主要是除零(
10 / 0),整数溢出不会抛这个,但浮点除零会得Infinity -
ClassCastException:强制类型转换失败,例如
(String) new Integer(1);建议先用instanceof判断 -
NumberFormatException:字符串转数字格式不对,如
Integer.parseInt("abc")
快速定位技巧:看堆栈,盯第一行
运行时报错时,别从最后一行开始读。重点看异常类型 + 第一行“at”信息,它指向真正出问题的代码行。
- 如果堆栈里出现
java.lang.NullPointerException,立刻检查那一行谁是null,往上追溯赋值来源 - 看到
Caused by:,说明是嵌套异常,根因往往在它下面那几行 - IDE 中点击堆栈路径可直接跳转到源码,配合调试器设断点,比纯看日志快得多
- 日志里如果只有类名没有行号(如
at com.example.Xxx.method(Unknown Source)),说明编译时没加-g参数,下次打包记得带上调试信息
预防比修复更省力
很多编译错误和运行时异常,其实有成熟手段提前拦截。
- 启用 IDE 的实时检查:IntelliJ 和 Eclipse 都能标出未初始化变量、空指针风险、无效转型等,别关掉
- 用
@NonNull/@Nullable注解配合 Lombok 或 Checker Framework,让编译器帮你抓空值问题 - 关键参数校验别偷懒:方法入口加
Objects.requireNonNull(arg, "arg must not be null") - 集合操作优先用增强 for 或 Stream,少用手动索引,避免越界;改集合时用迭代器
remove(),别直接调list.remove()
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










