我在使用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;
}
}
从这里可以看出,该类是作为单例实现的。资源显然存在并且大部分时间都被检测到,但我不确定为什么它偶尔会失败,这对我来说似乎很奇怪。
答案 0 :(得分:3)
getInstance
,其中一个获得一个未正确初始化的ConfigLoader,因为你的单例不是线程安全的所以我首先要确认日志记录,当它失败时,它是因为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中而成为打包问题?