Java 为什么XMLDecoders readObject方法在尝试读取对象时抛出了畸形的DurLexception?

Java 为什么XMLDecoders readObject方法在尝试读取对象时抛出了畸形的DurLexception?,java,Java,我正在尝试实例化一个设置类。此外,我正在使用单例模式。这是我的密码: package com.op.OccupancyPrediction.BusinessLogic.utility; import java.beans.XMLDecoder; import java.io.BufferedInputStream; import java.io.FileInputStream; import java.io.FileNotFoundException; public class Settin

我正在尝试实例化一个设置类。此外,我正在使用单例模式。这是我的密码:

package com.op.OccupancyPrediction.BusinessLogic.utility;

import java.beans.XMLDecoder;
import java.io.BufferedInputStream;
import java.io.FileInputStream;
import java.io.FileNotFoundException;

public class Settings {


    private int preHeatTimeIntervalInMinutes;
    private double PIROccupiedValue;
    private int hoursPerDay;
    private int minutesPerHour;

    private static Settings instance = null;

    private Settings()
    {

    }

    public static Settings getInstance() {
          if(instance == null) {

              instance = new Settings();

             try {

                XMLDecoder d = new XMLDecoder(
                         null, new BufferedInputStream(
                             new FileInputStream("Settings.xml")));
                instance = (Settings) d.readObject();
                d.close();  
            } catch (FileNotFoundException e) {
                e.printStackTrace();        
            }

            return instance;

          }
          return instance;
    }

    public int getPreHeatTimeIntervalInMinutes() {
        return preHeatTimeIntervalInMinutes;
    }

    public void setPreHeatTimeIntervalInMinutes(int preHeatTimeIntervalInMinutes) {
        this.preHeatTimeIntervalInMinutes = preHeatTimeIntervalInMinutes;
    }

    public double getPIROccupiedValue() {
        return PIROccupiedValue;
    }

    public void setPIROccupiedValue(double pIROccupiedValue) {
        this.PIROccupiedValue = pIROccupiedValue;
    }

    public int getHoursPerDay() {
        return hoursPerDay;
    }

    public void setHoursPerDay(int hoursPerDay) {
        this.hoursPerDay = hoursPerDay;
    }

    public int getMinutesPerHour() {
        return minutesPerHour;
    }

    public void setMinutesPerHour(int minutesPerHour) {
        this.minutesPerHour = minutesPerHour;
    }
}
XML文档位于根文件夹中,如下所示:

<?xml version="1.0" encoding="UTF-8"?>
<java version="1.8.0" class="java.beans.XMLDecoder">
    <object class="com.op.OccupancyPrediction.BusinessLogic.utility.Settings">
        <void property="preHeatTimeIntervalInMinutes">
            <int>15</int>
        </void>
        <void property="PIROccupiedValue">
            <double>30</double>
        </void>
        <void property="hoursPerDay">
            <int>24</int>
        </void>
        <void property="minutesPerHour">
            <int>60</int>
        </void>
    </object>
</java>

我找到了一个解决办法,所以我会回答我自己的问题。这可能对其他人有帮助。由于Settings类的构造函数不是公共的,因此在尝试调用readObject时将引发异常。我的解决方案:

package com.op.OccupancyPrediction.BusinessLogic.utility;

import java.beans.XMLDecoder;
import java.io.BufferedInputStream;
import java.io.FileInputStream;
import java.io.FileNotFoundException;

public class SettingsWrapper {

    private static SettingsWrapper instance = null;
    private static Settings settings = null;

    private SettingsWrapper() {
        // Exists only to defeat instantiation.
    }

    public static SettingsWrapper getInstance() {
        if (instance == null) {
            instance = new SettingsWrapper();
        }
        return instance;
    }

    public Settings GetSettings() {
        if(settings == null)
        {
            settings = new Settings();
            try {

                XMLDecoder d = new XMLDecoder(new BufferedInputStream(
                        new FileInputStream("Settings.xml")));
                settings = (Settings) d.readObject();
                d.close();
            } catch (FileNotFoundException e) {
                e.printStackTrace();

            }
        }
        return settings;
    }

}

stacktrace?代码中的相关位置?此外,如果您希望在多个线程中工作,那么您的单例逻辑不是线程安全的。我用stacktrace编辑了我的问题。稍后我会使它成为线程安全的,谢谢。@jtahlborn我发现这个方法是在设置类构造函数不是公共的时候抛出的
package com.op.OccupancyPrediction.BusinessLogic.utility;

import java.beans.XMLDecoder;
import java.io.BufferedInputStream;
import java.io.FileInputStream;
import java.io.FileNotFoundException;

public class SettingsWrapper {

    private static SettingsWrapper instance = null;
    private static Settings settings = null;

    private SettingsWrapper() {
        // Exists only to defeat instantiation.
    }

    public static SettingsWrapper getInstance() {
        if (instance == null) {
            instance = new SettingsWrapper();
        }
        return instance;
    }

    public Settings GetSettings() {
        if(settings == null)
        {
            settings = new Settings();
            try {

                XMLDecoder d = new XMLDecoder(new BufferedInputStream(
                        new FileInputStream("Settings.xml")));
                settings = (Settings) d.readObject();
                d.close();
            } catch (FileNotFoundException e) {
                e.printStackTrace();

            }
        }
        return settings;
    }

}