这是我的简单代码。
class atmPin{
public static void main(String[] args) {
int x = 0;
System.out.println("hi there"+x);
}
}
当我运行它,我得到这个异常错误。
java atmPin
Exception in thread "main" java.lang.BootstrapMethodError: java.lang.NoClassDefFoundError: java/lang/invoke/StringConcatFactory
at atmPin.main(atmPin.java:6)
Caused by: java.lang.NoClassDefFoundError: java/lang/invoke/StringConcatFactory
... 1 more
Caused by: java.lang.ClassNotFoundException: java.lang.invoke.StringConcatFactory
at java.net.URLClassLoader.findClass(URLClassLoader.java:381)
at java.lang.ClassLoader.loadClass(ClassLoader.java:424)
at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:349)
at java.lang.ClassLoader.loadClass(ClassLoader.java:357)
... 1 more
这和java版本有关吗?我不知道为什么会发生。这是一件很简单的事情。:(即使是字符串也会得到同样的异常。
String x = "";
x += "a";
2条答案
按热度按时间ruoxqz4g1#
java.lang.invoke.StringConcatFactory
是Java 9中出现的一个类,用于实现JEP 280 (Indify String Concatenation),JEP 280 (Indify String Concatenation)更改了javac
编译器的行为,以便它将invokedynamic
指令与给定类一起用于字符串连接。因此,此错误的原因很可能是在Java 8或更低版本下运行此代码时使用JDK 9或更高版本中的javac
进行编译(或者,机会少得多,使用定制Java运行时)。为了解决这个问题,可以使用另一个版本的编译器,或者可以为编译器指定另一个版本,或者应该使用另一个JRE来运行编译的类。
plicqrtu2#
我在为Java 11编译的代码库中偶然发现了这个问题,反复试验后我发现一个方法在抛出异常之前无限递归(异常被捕获并连接了一个漂亮的文本来报告它),显然
StringConcatFactory
在这种情况下无法工作;快速检查一下,显式使用StringBuilder
确实有效,大致如下:尽管在这种情况下,正确的解决方案当然是打破无限循环。
我猜想工厂无法工作是因为循环吃掉了堆上的所有资源,或者类似的原因。