Исключение InaccessibleObjectException в Java Weka при настройке экземпляра CSVSaver для преобразования файла arfff в csv

#java #machine-learning #type-conversion #artificial-intelligence #weka

Вопрос:

Я изучаю weka с Java и пытаюсь преобразовать .csv файл в .arff , но при попытке установить экземпляр для CSVSaver я получаю InaccessibleObjectException .

         ArffLoader loader = new ArffLoader();
        loader.setSource(new File("Friedman-datasets/friedman_datasets/fri_c0_100_5.arff"));
        Instances data = loader.getDataSet();

        CSVSaver saver = new CSVSaver();
        saver.setInstances(data); //error happens here

        saver.setFile(new File("/Users/jacec/OneDrive/Desktop/DMA/Learning weka/convertingfiletypes/converted.csv"));
        saver.writeBatch();
 

Текст Ошибки

 java.lang.reflect.InaccessibleObjectException: Unable to make protected final java.lang.Class java.lang.ClassLoader.defineClass(java.lang.String,byte[],int,int,java.security.ProtectionDomain) throws java.lang.ClassFormatError accessible: module java.base does not "opens java.lang" to unnamed module @4d76f3f8
    at java.base/java.lang.reflect.AccessibleObject.checkCanSetAccessible(AccessibleObject.java:354)
    at java.base/java.lang.reflect.AccessibleObject.checkCanSetAccessible(AccessibleObject.java:297)
    at java.base/java.lang.reflect.Method.checkCanSetAccessible(Method.java:199)
    at java.base/java.lang.reflect.Method.setAccessible(Method.java:193)
    at weka.core.WekaPackageClassLoaderManager.injectClasses(WekaPackageClassLoaderManager.java:792)
    at weka.core.WekaPackageClassLoaderManager.injectAllClassesInFromStream(WekaPackageClassLoaderManager.java:690)
    at weka.core.WekaPackageClassLoaderManager.injectMTJCoreClasses(WekaPackageClassLoaderManager.java:118)
    at weka.core.WekaPackageManager.<clinit>(WekaPackageManager.java:255)
    at weka.core.ResourceUtils.readProperties(ResourceUtils.java:241)
    at weka.core.ResourceUtils.readProperties(ResourceUtils.java:184)
    at weka.core.Utils.readProperties(Utils.java:183)
    at weka.core.Capabilities.<clinit>(Capabilities.java:104)
    at weka.core.converters.AbstractSaver.getCapabilities(AbstractSaver.java:219)
    at weka.core.converters.CSVSaver.getCapabilities(CSVSaver.java:403)
    at weka.core.converters.AbstractSaver.setInstances(AbstractSaver.java:162)
    at weka.api.csv2arff.main(csv2arff.java:19)
 

Если кто-нибудь знает, почему это происходит, поскольку я следую учебнику с их точным кодом, поэтому я не знаю, что я делаю по-другому

Комментарии:

1. Убедитесь, что вы используете Java 11. Вы можете получить OpenJDK для различных операционных систем здесь: adoptopenjdk.net

2. ах, спасибо, что это работает. Работает ли weka только с ~java11?

3. Менеджер пакетов Weka (по крайней мере, до 3.8.5 и 3.9.5) выполняет некоторые низкоуровневые операции для загрузки в пакеты, которые больше не разрешены в более поздних версиях Java (из того, что я видел). Не могу быть абсолютно уверен, но по памяти Java 16, казалось, больше не работает.