2014-11-06 54 views
0

我想实例化一个设置类。另外,我正在使用Singleton模式。这里是我的代码:为什么XMLDecoders readObject方法在尝试读取对象时抛出MalformedURLException?

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> 

它的工作我创建的设置类作为一个单身了。

有什么建议吗?

这是堆栈跟踪:

java.net.MalformedURLException 
Continuing ... 
Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: 0 
    at java.beans.XMLDecoder.readObject(Unknown Source) 
    at com.op.OccupancyPrediction.BusinessLogic.utility.Settings.getInstance(Settings.java:32) 
    at com.op.OccupancyPrediction.BusinessLogic.engine.PreHeat.GenerateOccupancyVectorFromPIR(PreHeat.java:83) 
    at com.op.OccupancyPrediction.BusinessLogic.engine.PreHeat.GenerateDaysFromPIR(PreHeat.java:43) 
    at com.op.OccupancyPrediction.BusinessLogic.parser.PIRBereklyParser.Parse(PIRBereklyParser.java:49) 
    at com.op.OccupancyPrediction.App.ParserTest(App.java:22) 
    at com.op.OccupancyPrediction.App.main(App.java:14) 
+0

stacktrace?你的代码中的相关位置? – jtahlborn 2014-11-06 17:28:36

+0

也,你的单例逻辑不是线程安全的,如果你期望这个工作瓦特/多个线程。 – jtahlborn 2014-11-06 17:29:25

+0

我用堆栈跟踪编辑我的问题。稍后我会让它变得安全,谢谢。 – Kenci 2014-11-06 17:40:37

回答

0

我找到了解决办法,所以我将作出回答我自己的问题。这可能对其他人有帮助。因为Settings类的构造函数不是public的,所以在尝试调用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; 
    } 

} 
相关问题