1. Error: Could not find or load main class
常见原因:环境变量(JAVA_HOME、CLASSPATH)设置错误,导致JVM无法定位主类;CLASSPATH未包含所有必要的JAR文件或类路径;文件路径拼写错误(如大小写不匹配);Java版本与编译时版本不兼容。
解决方法:通过echo $JAVA_HOME检查JAVA_HOME是否指向正确的JDK路径(如/usr/lib/jvm/java-11-openjdk-amd64),并在~/.bashrc中添加export JAVA_HOME=/usr/lib/jvm/java-11-openjdk-amd64、export PATH=$JAVA_HOME/bin:$PATH后执行source ~/.bashrc;确认CLASSPATH包含主类所在目录及所有依赖JAR(如export CLASSPATH=.:./lib/*);检查java -version与javac -version是否一致,避免版本冲突。
2. UnsupportedClassVersionError
常见原因:编译Java程序的JDK版本高于运行时的JRE版本(如用JDK 17编译,用JRE 8运行),JVM无法识别字节码版本。
解决方法:统一编译与运行版本,如用sudo update-alternatives --config java切换至JDK 17;或重新编译代码时指定目标版本(如javac -target 1.8 MyClass.java)。
3. OutOfMemoryError
常见原因:JVM堆内存不足(如处理大数据量时未分配足够内存);内存泄漏(如未关闭的数据库连接、集合缓存未清理)。
解决方法:调整JVM内存参数,如java -Xms512m -Xmx2048m MyApp(初始堆512MB,最大堆2GB);使用-XX:+UseG1GC启用G1垃圾收集器优化内存管理;通过VisualVM、Eclipse MAT等工具分析堆转储文件,定位内存泄漏点(如未释放的大对象)。
4. NullPointerException
常见原因:尝试调用空对象的方法或访问其属性(如String str = null; str.length())。
解决方法:使用前检查对象是否为null(如if (str != null) str.length());使用Java 8的Optional类包装可能为null的对象(如Optional.ofNullable(str).ifPresent(s -> s.length()));通过代码审查避免空指针风险。
5. ArrayIndexOutOfBoundsException
常见原因:访问数组或集合时索引超出有效范围(如int[] arr = new int[5]; arr[5] = 10,有效索引为0-4)。
解决方法:访问前检查索引合法性(如if (index >= 0 && index < arr.length) arr[index] = 10);使用增强型for循环替代索引遍历(如for (int num : arr) System.out.println(num));避免手动计算索引,优先使用集合类(如ArrayList)的get()方法。
6. ClassNotFoundException
常见原因:类路径(CLASSPATH)中缺少所需类或JAR文件;类名拼写错误(如包名大小写不一致);依赖库未正确引入(如Maven项目中未添加<dependency>)。
解决方法:检查CLASSPATH是否包含所有依赖JAR(如./lib/mylib.jar);确认类名与包名拼写完全一致(如com.example.MyClass);Maven项目中运行mvn clean install确保依赖下载至本地仓库。
7. StackOverflowError
常见原因:递归方法缺少终止条件,导致无限递归(如factorial(n) { return n * factorial(n - 1); }未处理n == 0的情况);递归深度超过JVM栈限制(如深层嵌套调用)。
解决方法:为递归方法添加终止条件(如if (n == 0) return 1;);将递归算法改为迭代(如用循环计算阶乘);调整JVM栈大小(如java -Xss2m MyApp,增加栈空间至2MB,但治标不治本)。
8. NumberFormatException
常见原因:尝试将格式不正确的字符串转换为数字(如Integer.parseInt("abc")、Double.parseDouble("12.34.56"))。
解决方法:使用正则表达式验证字符串格式(如if (str.matches("-?\\d+(\\.\\d+)?")));捕获异常并进行友好提示(如try { num = Integer.parseInt(input); } catch (NumberFormatException e) { System.out.println("请输入有效的数字!"); });使用NumberFormat类处理本地化数字格式(如NumberFormat.getInstance().parse(str))。