Java程序中十种常见报错及解决方案(附示例代码)
<div id="navCategory"><h5 class="catalogue">目录</h5><ul class="first_class_ul"><li>一、空指针异常(NullPointerException)</li><ul class="second_class_ul"><li>报错内容</li><li>原因分析</li><li>解决方案</li></ul><li>二、类型转换异常(ClassCastException)</li><ul class="second_class_ul"><li>报错内容</li><li>原因分析</li><li>解决方案</li></ul><li>三、数组越界异常(ArrayIndexOutOfBoundsException)</li><ul class="second_class_ul"><li>报错内容</li><li>原因分析</li><li>解决方案</li></ul><li>四、字符串索引越界异常(StringIndexOutOfBoundsException)</li><ul class="second_class_ul"><li>报错内容</li><li>原因分析</li><li>解决方案</li></ul><li>五、数字格式异常(NumberFormatException)</li><ul class="second_class_ul"><li>报错内容</li><li>原因分析</li><li>解决方案</li></ul><li>六、类未找到异常(ClassNotFoundException)</li><ul class="second_class_ul"><li>报错内容</li><li>原因分析</li><li>解决方案</li></ul><li>七、方法未找到异常(NoSuchMethodException)</li><ul class="second_class_ul"><li>报错内容</li><li>原因分析</li><li>解决方案</li></ul><li>八、IO异常(IOException)</li><ul class="second_class_ul"><li>报错内容</li><li>原因分析</li><li>解决方案</li></ul><li>九、算术异常(ArithmeticException)</li><ul class="second_class_ul"><li>报错内容</li><li>原因分析</li><li>解决方案</li></ul><li>十、并发修改异常(ConcurrentModificationException)</li><ul class="second_class_ul"><li>报错内容</li><li>原因分析</li><li>解决方案</li></ul><li>总结</li><ul class="second_class_ul"></ul></ul></div><p class="maodian"></p><h2>一、空指针异常(NullPointerException)</h2><p class="maodian"></p><p class="maodian"></p><p class="maodian"></p><p class="maodian"></p><p class="maodian"></p><p class="maodian"></p><p class="maodian"></p><p class="maodian"></p><p class="maodian"></p><p class="maodian"></p><h3>报错内容</h3>
<div class="jb51code"><pre class="brush:java;">Exception in thread "main" java.lang.NullPointerException
at com.example.Demo.main(Demo.java:10)
</pre></div>
<p class="maodian"></p><p class="maodian"></p><p class="maodian"></p><p class="maodian"></p><p class="maodian"></p><p class="maodian"></p><p class="maodian"></p><p class="maodian"></p><p class="maodian"></p><p class="maodian"></p><h3>原因分析</h3>
<p>当程序试图调用一个<code>null</code>对象的方法或访问其属性时触发。例如:</p>
<div class="jb51code"><pre class="brush:java;">String str = null;
System.out.println(str.length()); // str为null,调用length()时抛出异常
</pre></div>
<p class="maodian"></p><p class="maodian"></p><p class="maodian"></p><p class="maodian"></p><p class="maodian"></p><p class="maodian"></p><p class="maodian"></p><p class="maodian"></p><p class="maodian"></p><p class="maodian"></p><h3>解决方案</h3>
<ol><li><strong>调用前判断对象是否为null</strong>:
<div class="jb51code"><pre class="brush:java;">String str = null;
if (str != null) {
System.out.println(str.length());
} else {
System.out.println("字符串为空");
}
</pre></div></li><li><strong>使用Optional类(Java 8+)</strong>:<div class="jb51code"><pre class="brush:java;">Optional<String> optionalStr = Optional.ofNullable(str);
optionalStr.ifPresent(s -> System.out.println(s.length()));
</pre></div></li><li><strong>避免返回null</strong>:方法返回集合/对象时,尽量返回空集合(如<code>new ArrayList<>()</code>)而非null。</li></ol>
<p class="maodian"></p><h2>二、类型转换异常(ClassCastException)</h2>
<h3>报错内容</h3>
<div class="jb51code"><pre class="brush:java;">Exception in thread "main" java.lang.ClassCastException:
class java.lang.String cannot be cast to class java.lang.Integer
</pre></div>
<h3>原因分析</h3>
<p>试图将一个对象强制转换为不兼容的类型时触发。例如:</p>
<div class="jb51code"><pre class="brush:java;">Object obj = "hello";
Integer num = (Integer) obj; // String无法转换为Integer
</pre></div>
<h3>解决方案</h3>
<ol><li><strong>转换前用instanceof判断类型兼容性</strong>:
<div class="jb51code"><pre class="brush:java;">Object obj = "hello";
if (obj instanceof Integer) {
Integer num = (Integer) obj;
} else {
System.out.println("类型不兼容,无法转换");
}
</pre></div></li><li><strong>使用泛型避免强制转换</strong>:<div class="jb51code"><pre class="brush:java;">// 定义泛型集合,避免后续转换
List<String> list = new ArrayList<>();
</pre></div></li></ol>
<p class="maodian"></p><h2>三、数组越界异常(ArrayIndexOutOfBoundsException)</h2>
<h3>报错内容</h3>
<div class="jb51code"><pre class="brush:java;">Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: Index 5 out of bounds for length 3
</pre></div>
<h3>原因分析</h3>
<p>访问数组时,索引值超出数组长度范围(索引从0开始,最大索引为<code>数组长度-1</code>)。例如:</p>
<div class="jb51code"><pre class="brush:java;">int[] arr = new int; // 索引范围0~2
System.out.println(arr); // 索引5超出范围
</pre></div>
<h3>解决方案</h3>
<ol><li><strong>访问数组前检查索引范围</strong>:
<div class="jb51code"><pre class="brush:java;">int[] arr = new int;
int index = 5;
if (index >= 0 && index < arr.length) {
System.out.println(arr);
} else {
System.out.println("索引超出数组范围");
}
</pre></div></li><li><strong>使用循环时以数组长度为边界</strong>:<div class="jb51code"><pre class="brush:java;">for (int i = 0; i < arr.length; i++) { // 用arr.length控制循环范围
System.out.println(arr);
}
</pre></div></li></ol>
<p class="maodian"></p><h2>四、字符串索引越界异常(StringIndexOutOfBoundsException)</h2>
<h3>报错内容</h3>
<div class="jb51code"><pre class="brush:java;">Exception in thread "main" java.lang.StringIndexOutOfBoundsException:
String index out of range: 5
</pre></div>
<h3>原因分析</h3>
<p>访问字符串的字符时,索引超出字符串长度范围(同数组,索引范围0~<code>长度-1</code>)。例如:</p>
<div class="jb51code"><pre class="brush:java;">String str = "hello"; // 长度为5,索引0~4
char c = str.charAt(5); // 索引5超出范围
</pre></div>
<h3>解决方案</h3>
<ol><li><strong>操作字符串前检查索引</strong>:
<div class="jb51code"><pre class="brush:java;">String str = "hello";
int index = 5;
if (index >= 0 && index < str.length()) {
char c = str.charAt(index);
} else {
System.out.println("索引超出字符串范围");
}
</pre></div></li><li><strong>截取字符串时使用合理范围</strong>:<div class="jb51code"><pre class="brush:java;">// substring(start, end)中end不能超过字符串长度
String sub = str.substring(0, Math.min(3, str.length()));
</pre></div></li></ol>
<p class="maodian"></p><h2>五、数字格式异常(NumberFormatException)</h2>
<h3>报错内容</h3>
<div class="jb51code"><pre class="brush:java;">Exception in thread "main" java.lang.NumberFormatException:
For input string: "abc"
</pre></div>
<h3>原因分析</h3>
<p>将字符串转换为数字类型(如<code>int</code>、<code>double</code>)时,字符串格式不符合数字规则。例如:</p>
<div class="jb51code"><pre class="brush:java;">String str = "abc";
int num = Integer.parseInt(str); // "abc"无法转换为整数
</pre></div>
<h3>解决方案</h3>
<ol><li><strong>转换前验证字符串格式</strong>:
<div class="jb51code"><pre class="brush:java;">String str = "abc";
if (str.matches("-?\\d+")) { // 正则匹配整数
int num = Integer.parseInt(str);
} else {
System.out.println("字符串格式不是合法整数");
}
</pre></div></li><li><strong>使用try-catch捕获异常</strong>:<div class="jb51code"><pre class="brush:java;">try {
int num = Integer.parseInt(str);
} catch (NumberFormatException e) {
System.out.println("转换失败:" + e.getMessage());
}
</pre></div></li></ol>
<p class="maodian"></p><h2>六、类未找到异常(ClassNotFoundException)</h2>
<h3>报错内容</h3>
<div class="jb51code"><pre class="brush:java;">Exception in thread "main" java.lang.ClassNotFoundException:
com.example.User
</pre></div>
<h3>原因分析</h3>
<p>程序试图加载某个类(如通过<code>Class.forName()</code>),但该类不在类路径(classpath)中。常见原因:</p>
<ul><li>类未被编译或编译后未放入指定目录;</li><li>依赖的JAR包未正确引入项目;</li><li>类名或包名拼写错误。</li></ul>
<h3>解决方案</h3>
<ol><li><strong>检查类路径配置</strong>:
<ul><li>确保编译后的<code>.class</code>文件在项目的<code>classpath</code>目录下(如<code>target/classes</code>);</li><li>若为Maven/Gradle项目,执行<code>mvn clean compile</code>重新编译。</li></ul></li><li><strong>验证依赖是否正确引入</strong>:<ul><li>检查<code>pom.xml</code>(Maven)或<code>build.gradle</code>(Gradle)中是否包含所需依赖;</li><li>确认依赖版本正确,且未因冲突被排除。</li></ul></li><li><strong>核对类名和包名</strong>:确保代码中引用的类名、包名与实际一致(大小写敏感)。</li></ol>
<p class="maodian"></p><h2>七、方法未找到异常(NoSuchMethodException)</h2>
<h3>报错内容</h3>
<div class="jb51code"><pre class="brush:java;">Exception in thread "main" java.lang.NoSuchMethodException:
com.example.Demo.test()
</pre></div>
<h3>原因分析</h3>
<p>试图通过反射调用某个方法,但该方法不存在或参数不匹配。例如:</p>
<div class="jb51code"><pre class="brush:java;">Class<?> clazz = Demo.class;
Method method = clazz.getMethod("test", String.class); // 若test()无String参数则报错
</pre></div>
<h3>解决方案</h3>
<ol><li><strong>检查方法名和参数列表</strong>:
<ul><li>确保方法名拼写正确(大小写敏感);</li><li>核对参数类型、顺序是否与方法定义一致(基本类型与包装类需区分,如<code>int</code>和<code>Integer</code>)。</li></ul></li><li><strong>使用getDeclaredMethod获取非公共方法</strong>:<div class="jb51code"><pre class="brush:java;">// 若方法为private,需用getDeclaredMethod并设置可访问
Method method = clazz.getDeclaredMethod("test");
method.setAccessible(true); // 允许访问私有方法
</pre></div></li><li><strong>反射前验证方法存在性</strong>:通过<code>getMethods()</code>遍历类中所有方法,确认目标方法存在。</li></ol>
<p class="maodian"></p><h2>八、IO异常(IOException)</h2>
<h3>报错内容</h3>
<div class="jb51code"><pre class="brush:java;">Exception in thread "main" java.io.IOException:
No such file or directory
at java.base/java.io.FileInputStream.open0(Native Method)
</pre></div>
<h3>原因分析</h3>
<p>输入输出操作(如读写文件、网络通信)失败,常见原因:</p>
<ul><li>文件不存在或路径错误;</li><li>没有文件读写权限;</li><li>网络连接中断。</li></ul>
<h3>解决方案</h3>
<ol><li><strong>处理文件IO异常</strong>:
<div class="jb51code"><pre class="brush:java;">File file = new File("test.txt");
try (FileInputStream fis = new FileInputStream(file)) {
// 读取文件操作
} catch (FileNotFoundException e) {
System.out.println("文件不存在:" + e.getMessage());
} catch (IOException e) {
System.out.println("IO操作失败:" + e.getMessage());
}
</pre></div></li><li><strong>检查文件路径和权限</strong>:<ul><li>用<code>file.exists()</code>判断文件是否存在;</li><li>用<code>file.canRead()</code>/<code>file.canWrite()</code>检查读写权限;</li><li>使用绝对路径(如<code>/home/user/test.txt</code>)避免相对路径歧义。</li></ul></li><li><strong>网络IO异常处理</strong>:设置合理的超时时间,捕获<code>SocketException</code>等子类异常。</li></ol>
<p class="maodian"></p><h2>九、算术异常(ArithmeticException)</h2>
<h3>报错内容</h3>
<div class="jb51code"><pre class="brush:java;">Exception in thread "main" java.lang.ArithmeticException: / by zero
</pre></div>
<h3>原因分析</h3>
<p>数学运算中出现非法操作,最常见的是“除以零”。例如:</p>
<div class="jb51code"><pre class="brush:java;">int a = 10;
int b = 0;
int result = a / b; // 除数为0
</pre></div>
<h3>解决方案</h3>
<ol><li><strong>运算前检查除数</strong>:
<div class="jb51code"><pre class="brush:java;">int a = 10;
int b = 0;
if (b != 0) {
int result = a / b;
} else {
System.out.println("除数不能为0");
}
</pre></div></li><li><strong>浮点数除法特殊处理</strong>:若允许近似结果,可将除数设为极小值避免异常:<div class="jb51code"><pre class="brush:java;">double b = 0.0;
double result = a / (b == 0 ? 1e-10 : b); // 除数为0时用极小值替代
</pre></div></li></ol>
<p class="maodian"></p><h2>十、并发修改异常(ConcurrentModificationException)</h2>
<h3>报错内容</h3>
<div class="jb51code"><pre class="brush:java;">Exception in thread "main" java.util.ConcurrentModificationException
at java.base/java.util.ArrayList$Itr.checkForComodification(ArrayList.java:1013)
</pre></div>
<h3>原因分析</h3>
<p>在迭代集合(如<code>ArrayList</code>)时,同时修改集合结构(如添加、删除元素)导致迭代器状态不一致。例如:</p>
<div class="jb51code"><pre class="brush:java;">List<String> list = new ArrayList<>();
list.add("a");
list.add("b");
for (String s : list) { // 增强for循环底层使用迭代器
if (s.equals("a")) {
list.remove(s); // 迭代时修改集合,触发异常
}
}
</pre></div>
<h3>解决方案</h3>
<ol><li><strong>使用迭代器的remove()方法</strong>:
<div class="jb51code"><pre class="brush:java;">Iterator<String> iterator = list.iterator();
while (iterator.hasNext()) {
String s = iterator.next();
if (s.equals("a")) {
iterator.remove(); // 迭代器自身的remove()方法安全
}
}
</pre></div></li><li><strong>使用并发集合(多线程场景)</strong>:<div class="jb51code"><pre class="brush:java;">// 多线程环境下用CopyOnWriteArrayList替代ArrayList
List<String> list = new CopyOnWriteArrayList<>();
</pre></div></li><li><strong>迭代前创建集合副本</strong>:<div class="jb51code"><pre class="brush:java;">// 遍历副本,修改原集合(适合小集合)
List<String> copy = new ArrayList<>(list);
for (String s : copy) {
if (s.equals("a")) {
list.remove(s);
}
}
</pre></div></li></ol>
<p class="maodian"></p><h2>总结</h2>
<p>Java报错本质上是程序逻辑或环境配置的“提醒”。解决报错的核心是:<strong>先通过异常信息定位问题代码,再分析原因,最后针对性修复</strong>。</p>
<p>到此这篇关于Java程序中十种常见报错及解决方案的文章就介绍到这了,更多相关Java常见报错及解决内容请搜索琼殿技术社区以前的文章或继续浏览下面的相关文章希望大家以后多多支持琼殿技术社区!</p>
<div class="art_xg">
<b>您可能感兴趣的文章:</b><ul><li>java常见报错:Array Out of Bounds两种解决办法</li><li>Javaweb项目启动Tomcat常见的报错解决方案</li><li>Java常见报错类型及解决方案详细解析(从异常处理到错误排查)</li><li>java集合中的迭代器Iterator和数组内置方法及常见的报错解决方案</li><li>java常见报错及解决方案总结</li></ul>
</div>
</div>
<!--endmain-->
頁:
[1]