Почему ClassFormatError появляется, когда я вызываю Math.random () более одного раза за процесс разрешения аргумента? - PullRequest
0 голосов
/ 03 декабря 2018

Мне нужен файл .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.lang.ClassLoader.defineClass1 (собственный метод) в java.lang.ClassLoader.defineClass (ClassLoader.java:763) в java.security.SecureClassLoader.defineClass (SecureClassLoader.java:142) в java.net.URLlassLoader (ClassLoaderLoader)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 (собственный метод) в 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) в sun.launcher.LauncherHelper.checkAndLoadMain (LauncherHelper.java:495)

A 1012 * Ошибка: 1012 * A 1012JNI ошибкаили произошла, пожалуйста, проверьте вашу установку и попробуйте еще раз Исключение в теме "main"

Впервые я сталкиваюсь с такой проблемой.Я попытался немного поиграть с кодом и понял, что проблема воспроизводится , если имеется более одного вызова на Math.random() за append вложенность .

Я также пробовал с этимдругие методы, такие как обычный старый:

int foo() {
    return 42;
}

вместо Math.random() вызовов.Он скомпилирован и успешно выполнен.

Что такое Math.random(), что он терпит неудачу здесь?Существуют ли другие методы, которые небезопасно использовать подобным образом?Какой официальный термин описывает это поведение?Является ли это общим различием между методами - могут ли они быть вызваны таким образом?Что именно происходит здесь и как описание исключения связано с этим?

РЕДАКТИРОВАТЬ: Возможно, это просто ошибка IDE / JDK / Configuration, но я не уверен в этом.Я работаю с этим кодом в IDE IntelliJ IDEA Ultimate Edition версии 2018.1.4.0 в паре с jdk1.8.0_161.

...