getResourceAsStream随机且不经常返回null

时间:2013-09-03 20:05:54

标签: java singleton

我在使用getResourceAsStream时很少得到一个空指针异常,很少像每10000次运行一次。这就是班级的样子

public class ConfigLoader{
  private Properties propies;
  private static ConfigLoader cl = null;
  private ConfigLoader(){
        propies = new Properties;
  }
  public static ConfigLoader getInstance(){
    if(cl == null){
          cl = new ConfigLoader();
    }
  }

  public boolean Load(){
   try{
         propies.load(this.getClass().getResourceAsStream("/config.properties"));          
   }
   catch(NullPointerException e){
         System.out.println("File Does Not Exist");
         return false;
   }
   return true;
   }
}

从这里可以看出,该类是作为单例实现的。资源显然存在并且大部分时间都被检测到,但我不确定为什么它偶尔会失败,这对我来说似乎很奇怪。

1 个答案:

答案 0 :(得分:3)

  1. 有助于找出什么是null(propies?getResourceAsStream返回的值?)
  2. 我的猜测是你从几个线程调用getInstance,其中一个获得一个未正确初始化的ConfigLoader,因为你的单例不是线程安全的
  3. 所以我首先要确认日志记录,当它失败时,它是因为propies为空,如果是这样,那么使单例线程安全,例如:

    private static final ConfigLoader cl = new ConfigLoader;
    public static ConfigLoader getInstance() { return cl; }
    

    甚至更好地使用枚举:

    public enum ConfigLoader{
      INSTANCE;
      private Properties propies;
      private ConfigLoader(){
        propies = new Properties;
      }
    
      public static ConfigLoader getInstance(){ return INSTANCE; }
    
      public boolean Load(){
       try{
             propies.load(this.getClass().getResourceAsStream("/config.properties"));          
       }
       catch(NullPointerException e){
             System.out.println("File Does Not Exist");
             return false;
       }
       return true;
       }
    }
    

    或者,如果getResourceAsStream("/config.properties")返回null,是否由于资源未包含在您的jar中而成为打包问题?