我在Java中运行时遇到了一个错误:
// Test.java
public class Test {
public static void main(String [] args) throws IOException {
String a = "123";
a = a + "456";
System.out.println(a);
}
}通过输入以下命令:
javac Test.java
java Test它还报告说:
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";时,程序运行良好,即,
// Test.java
public class Test {
public static void main(String [] args) throws IOException {
String a = "123";
// a = a + "456";
System.out.println(a);
}
}我想知道问题在哪里,如何解决?
发布于 2015-06-30 06:18:30
问题是您使用的编译器来自Java5或更高版本,所以它使用的是StringBuilder而不是StringBuffer --但是您使用的执行环境似乎是Java1.4.2,其中不包括StringBuilder。
请注意,Java1.4.2也很古老。我建议您将JDK和JRE升级到最近的版本(理想情况下直接升级到Java 8) --这将解决您的问题,并意味着您不会在不受支持的版本上运行,因为它太老了,很可能没有修补安全漏洞。(按照这些思路,你真的需要使用GCJ吗?如果可以的话,我会坚持使用更广泛使用的Java环境之一。
发布于 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,这已经严重过时了。
发布于 2015-06-30 06:40:21
NoClassDefFoundError大部分时间都是伴随或由ClassNotFoundException引起的,所以您应该真正地寻找它。
因此,在堆栈跟踪中有:
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_HOME和PATH环境变量),这个错误就会消失。
https://stackoverflow.com/questions/31130857
复制相似问题