(java字符串连接)为什么会出现这个异常?

gkn4icbw  于 2023-03-16  发布在  Java
关注(0)|答案(2)|浏览(204)

这是我的简单代码。

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";
ruoxqz4g

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来运行编译的类。

plicqrtu

plicqrtu2#

我在为Java 11编译的代码库中偶然发现了这个问题,反复试验后我发现一个方法在抛出异常之前无限递归(异常被捕获并连接了一个漂亮的文本来报告它),显然StringConcatFactory在这种情况下无法工作;快速检查一下,显式使用StringBuilder确实有效,大致如下:

...} catch (Exception e) {
    StringBuilder sb = new StringBuilder()
                .append("Got some problem: ")
                .append(e.getMessage());
    System.err.println(sb.toString());
    //System.err.println("Got some problem: " + e.getMessage()); // fails
}

尽管在这种情况下,正确的解决方案当然是打破无限循环。
我猜想工厂无法工作是因为循环吃掉了堆上的所有资源,或者类似的原因。

相关问题