首页 > 解决方案 > 当我在每个参数解析过程中多次调用 Math.random() 时,为什么会出现 ClassFormatError?

问题描述

我需要一个.txt包含大量随机整数和双精度数的文件——每行一个。我想出了以下代码:

StringBuilder info = new StringBuilder();
for(int i = 0; i < 10000; i++) {

    int id = (int)(Math.random() * 1000);
    double weight = Math.random() * 100;

    info.append(id)
            .append(" ")
            .append(weight)
            .append("\n");

}
Files.write(Paths.get("something.txt"), info.toString().getBytes());

它按预期工作。但是,当我尝试将代码“修剪”为:

StringBuilder info = new StringBuilder();
for(int i = 0; i < 10000; i++) {

    info.append((int)(Math.random() * 1000))
            .append(" ")
            .append(Math.random() * 100)
            .append("\n");

}
Files.write(Paths.get("something.txt"), info.toString().getBytes());

我收到了一个例外:

java.lang.ClassFormatError:在 java.security.SecureClassLoader.defineClass(SecureClassLoader.java:142) 的 java.lang.ClassLoader.defineClass(ClassLoader.java:763) 的 java.lang.ClassLoader.defineClass1(Native Method) 的截断类文件) 在 java.net.URLClassLoader.defineClass(URLClassLoader.java:467) 在 java.net.URLClassLoader.access$100(URLClassLoader.java:73) 在 java.net.URLClassLoader$1.run(URLClassLoader.java:368) 在 java .net.URLClassLoader$1.run(URLClassLoader.java:362) 在 java.security.AccessController.doPrivileged(Native Method) 在 java.net.URLClassLoader.findClass(URLClassLoader.java:361) 在 java.lang.ClassLoader.loadClass( ClassLoader.java:424) 在 sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:338) 在 java.lang.ClassLoader.loadClass(ClassLoader.java:第357章)

错误:发生 JNI 错误,请检查您的安装并重试线程“main”中的异常

这是我第一次遇到这样的问题。我尝试对代码进行一些操作,并意识到如果每个嵌套调用Math.random()append不止一次,问题就会重现。

我还尝试了其他方法,例如普通的旧方法:

int foo() {
    return 42;
}

代替Math.random()通话。它编译并成功执行。

Math.random()它在这里失败是什么原因?还有其他不安全的方法吗?描述这种行为的官方术语是什么?这是方法之间的常见区别 - 是否可以以这种方式调用它们?这里到底发生了什么,异常描述与它有什么关系?

编辑:这可能只是一个 IDE/JDK/配置错误,但我不确定。我正在与 jdk1.8.0_161 配对的 IDE IntelliJ IDEA Ultimate Edition 版本 2018.1.4.0 中使用此代码。

标签: javaexceptionrandommethod-callclassformaterror

解决方案


推荐阅读