Почему ClassFormatError появляется, когда я вызываю Math.random() более одного раза за процесс разрешения аргумента?
Мне нужен был .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.defineCo. (Secure)) в 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(собственный метод) в java.net.URLClassLoader.findClass(URLClassLoader.java:361) в java.lang.ClassLoader. ClassLoader.java:424) в sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:338) в java.lang.ClassLoader.loadClass(ClassLoader.java:357) в sun.launcher.LauncherHelper.checkAndLoadHainuncher:495)
Ошибка: произошла ошибка JNI, пожалуйста, проверьте вашу установку и попробуйте снова Исключение в потоке "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.