【问题标题】:Why occur Runtime Exception when call buildClassifier with Weka for java?为什么使用 Weka for java 调用 buildClassifier 时会出现运行时异常?
【发布时间】:2022-01-03 05:02:28
【问题描述】:

我用java的weka api做了一些分类程序和 我使用weka默认的contact-lens.arff数据集。

我已经完成了代码,它运行良好,只有一个例外。

import weka.core.Instances;
import weka.classifiers.rules.OneR;
import weka.classifiers.trees.J48;
import weka.classifiers.bayes.NaiveBayes;
/*
 ~ some codes ~
*/
    static OneR or_lens = new OneR(); 
    static J48 tree_lens=new J48(); 
    static NaiveBayes nb_lens = new NaiveBayes(); 
    
    static OneR or_weather = new OneR();
    static J48 tree_weather=new J48();
    static NaiveBayes nb_weather = new NaiveBayes(); 
    
    public static void lens_learning(Instances lens_data) {
        
        try {
            or_lens.buildClassifier(lens_data); // occur exception
        } catch (Exception e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
/*
 ~ some codes ~
*/
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 @4dcbadb4
    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.classifiers.AbstractClassifier.getCapabilities(AbstractClassifier.java:509)
    at weka.classifiers.rules.OneR.getCapabilities(OneR.java:289)
    at weka.classifiers.rules.OneR.buildClassifier(OneR.java:317)
    at hw2.Hw2.lens_learning(Hw2.java:25)
    at hw2.Hw2.main(Hw2.java:102)

发生此Runtime Exception后,程序运行顺利。

但是,我想隐藏或摆脱这个异常字符串。

我使用jdk-17.0.1

  1. 为什么buildClassifier会出现这个异常?

  2. 如何隐藏此异常字符串? try ... catch ... 无法隐藏它们 :,(

【问题讨论】:

    标签: java exception weka


    【解决方案1】:

    在撰写本文时,Weka 的包管理器不适用于 Java 16 或更高版本(由于低级类注入)。请改用 Java 11。

    【讨论】:

    • 也就是说,你说要安装jdk 11版本吗?
    • 是的,例如,从这里:adoptopenjdk.net
    • 感谢您的帮助!我解决了:)
    猜你喜欢
    • 2012-07-26
    • 1970-01-01
    • 1970-01-01
    • 2015-03-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多