首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >在java中遇到NoClassDefFoundError

在java中遇到NoClassDefFoundError
EN

Stack Overflow用户
提问于 2015-06-30 06:12:19
回答 3查看 503关注 0票数 1

我在Java中运行时遇到了一个错误:

代码语言:javascript
运行
复制
// Test.java
public class Test {
    public static void main(String [] args) throws IOException {
        String a = "123";
        a = a + "456";
        System.out.println(a);
    }
}

通过输入以下命令:

代码语言:javascript
运行
复制
javac Test.java
java Test

它还报告说:

代码语言:javascript
运行
复制
Exception in thread "main" java.lang.NoClassDefFoundError: while resolving class: Test
   at java.lang.VMClassLoader.resolveClass(java.lang.Class) (/usr/lib64/libgcj.so.5.0.0)
   at java.lang.Class.initializeClass() (/usr/lib64/libgcj.so.5.0.0)
   at java.lang.Class.forName(java.lang.String, boolean, java.lang.ClassLoader) (/usr/lib64/libgcj.so.5.0.0)
   at gnu.gcj.runtime.FirstThread.run() (/usr/lib64/libgcj.so.5.0.0)
   at _Jv_ThreadRun(java.lang.Thread) (/usr/lib64/libgcj.so.5.0.0)
   at _Jv_RunMain(java.lang.Class, byte const, int, byte const, boolean) (/usr/lib64/libgcj.so.5.0.0)
   at __gcj_personality_v0 (/home/users/haotianyi/tr/java.version=1.4.2)
   at __libc_start_main (/lib64/tls/libc-2.3.4.so)
   at _Jv_RegisterClasses (/home/users/haotianyi/tr/java.version=1.4.2)
Caused by: java.lang.ClassNotFoundException: java.lang.StringBuilder not found in [file:/usr/share/java/libgcj-3.4.5.jar, file:./, core:/]
   at java.net.URLClassLoader.findClass(java.lang.String) (/usr/lib64/libgcj.so.5.0.0)
   at gnu.gcj.runtime.VMClassLoader.findClass(java.lang.String) (/usr/lib64/libgcj.so.5.0.0)
   at java.lang.ClassLoader.loadClass(java.lang.String, boolean) (/usr/lib64/libgcj.so.5.0.0)
   at _Jv_FindClass(_Jv_Utf8Const, java.lang.ClassLoader) (/usr/lib64/libgcj.so.5.0.0)
   at java.lang.Class.forName(java.lang.String, boolean, java.lang.ClassLoader) (/usr/lib64/libgcj.so.5.0.0)
   at _Jv_BytecodeVerifier.verify_instructions_0() (/usr/lib64/libgcj.so.5.0.0)
   at _Jv_VerifyMethod(_Jv_InterpMethod) (/usr/lib64/libgcj.so.5.0.0)
   at _Jv_PrepareClass(java.lang.Class) (/usr/lib64/libgcj.so.5.0.0)
   at _Jv_WaitForState(java.lang.Class, int) (/usr/lib64/libgcj.so.5.0.0)
   at java.lang.VMClassLoader.linkClass0(java.lang.Class) (/usr/lib64/libgcj.so.5.0.0)
   at java.lang.VMClassLoader.resolveClass(java.lang.Class) (/usr/lib64/libgcj.so.5.0.0)
   ...8 more

但当我删除行a = a + "456";时,程序运行良好,即,

代码语言:javascript
运行
复制
// Test.java
public class Test {
    public static void main(String [] args) throws IOException {
        String a = "123";
        // a = a + "456";
        System.out.println(a);
    }
}

我想知道问题在哪里,如何解决?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2015-06-30 06:18:30

问题是您使用的编译器来自Java5或更高版本,所以它使用的是StringBuilder而不是StringBuffer --但是您使用的执行环境似乎是Java1.4.2,其中不包括StringBuilder

请注意,Java1.4.2也很古老。我建议您将JDK和JRE升级到最近的版本(理想情况下直接升级到Java 8) --这将解决您的问题,并意味着您不会在不受支持的版本上运行,因为它太老了,很可能没有修补安全漏洞。(按照这些思路,你真的需要使用GCJ吗?如果可以的话,我会坚持使用更广泛使用的Java环境之一。

票数 5
EN

Stack Overflow用户

发布于 2015-06-30 06:19:55

错误的根本原因是JVM找不到java.lang.StringBuilder类。但这最终是因为您使用了过时的libgcj JDK,而不是使用标准的符合太阳的JDK。

来自文档

只需在libgcj的“libjava”目录中查看哪些类。大多数GUI内容还没有出现,这是事实,但是如果其他类还不存在,那么很多类都很容易添加。

显然,StringBuilder不在里面,这就是为什么你有问题的原因。让您的生活变得简单,只需从Oracle网站下载Java 7或Java 8即可。正如@JonSkeet所提到的(并且和往常一样是正确的),您使用的是Java 4,这已经严重过时了。

票数 2
EN

Stack Overflow用户

发布于 2015-06-30 06:40:21

NoClassDefFoundError大部分时间都是伴随或由ClassNotFoundException引起的,所以您应该真正地寻找它。

因此,在堆栈跟踪中有:

代码语言:javascript
运行
复制
Caused by: java.lang.ClassNotFoundException: java.lang.StringBuilder not found in [file:/usr/share/java/libgcj-3.4.5.jar, file:./, core:/]

这是您异常的根本原因。

实际上,如果要使用Oracle /JVM而不是GNUforJava(在很多Linux中这似乎是默认的),您就不应该面对这个问题。下载Oracle JDK/JVM,安装它命令 (JAVA_HOMEPATH环境变量),这个错误就会消失。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/31130857

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档