我正在使用websphere和Java EE并收到此错误消息:
Exception reading propertiesfile in init java.lang.NullPointerException
java.lang.NullPointerException
at java.io.Reader.<init>(Reader.java(Inlined Compiled Code))
at java.io.InputStreamReader.<init>(InputStreamReader.java(Inlined Compiled Code))
at java.util.Properties.load(Properties.java(Compiled Code))
at se.prv.register.admin.util.MessageHandler.loadDictionary(MessageHandler.java:90)
at se.prv.register.admin.util.MessageHandler.<clinit>(MessageHandler.java:15)
这是我的代码
package se.prv.pandora.arendeprocess.util;
import java.io.InputStream;
import java.util.Properties;
import org.apache.log4j.Logger;
public class MessageHandler extends AbstractTextHandler{
private static Properties dictionary;
private final static String dictionaryFileName="messages.properties";
private final static String className="se.prv.pandora.arendeprocess.util.MessageHandler";
private static Logger logger = Logger.getLogger(MessageHandler.class);
static {
loadDictionary();
}
public static void main(String[] args) {
String str = getParameterizedMessageTest("TEST",new String[]{"PETER","GÖRAN"});
System.out.println(str);
}
public static String getMessage(String key){
return getMessage(key,true);
}
public static String getMessage(String key,boolean useReference){
logger.debug("!!!! getMessage "+ key);
if (key==null || key.length()==0){
throw new RuntimeException("GetMessage without key");
}
if (dictionary==null){
loadDictionary();
}
if (useReference){
return getFullMessage(getMessage(dictionary,key));
}
else {
//String str = getMessage(dictionary,key);
//logger.debug(str);
String str2 = getCoreMessage(getMessage(dictionary,key));
//logger.debug(str2);
return str2;
}
}
public static String getFirstPartOfMessage(String key){
if (key==null || key.length()==0){
throw new RuntimeException("GetMessage without key");
}
if (dictionary==null){
loadDictionary();
}
String msg = getMessage(dictionary,key);
int pos = msg.indexOf('$');
if (pos==-1){
return msg;
}
else {
return msg.substring(0,pos);
}
}
public static String getLastPartOfMessage(String key){
if (key==null || key.length()==0){
throw new RuntimeException("GetMessage without key");
}
if (dictionary==null){
loadDictionary();
}
String msg = getMessage(dictionary,key);
int pos = msg.lastIndexOf('$');
if (pos==-1){
return msg;
}
else {
return msg.substring(pos+1);
}
}
public static String getParameterizedMessage(String key, String [] params){
if (dictionary==null){
loadDictionary();
}
return getParameterizedMessage(dictionary,key,params);
}
private static void loadDictionary(){
String fileName = getPropertiesPath()+dictionaryFileName;
//String fileName = "se/prv/register/admin/dao/sql-map-config.xml";
try {
dictionary=new Properties();
//InputStream fileInput = Class.forName("se.prv.register.admin.util.MessageHandler").getClassLoader().getResourceAsStream(fileName);
InputStream fileInput = Class.forName(className).getClassLoader().getResourceAsStream(fileName);
dictionary.load(fileInput);
fileInput.close();
}
catch(Exception e) {
System.err.println("Exception reading propertiesfile in init "+e);
e.printStackTrace();
dictionary=null;
}
}
private static String getCoreMessage(String str){
StringBuffer buff = new StringBuffer();
boolean doCopy=true;
for (int i=0;i<str.length();i++){
if (str.charAt(i)=='$'){
doCopy=!doCopy;
continue;
}
if (doCopy){
buff.append(str.charAt(i));
}
}
return buff.toString();
}
private static String getFullMessage(String str){
int pos = str.indexOf('$');
if (pos==-1){
return str;
}
StringBuffer buff = new StringBuffer(str);
int originalLength = buff.length();
for (int i=pos+1;i<buff.length();i++){
if (buff.charAt(i)== '$'){
String key = buff.substring(pos+1,i).trim();
String msg = getMessage(dictionary,key);
buff.replace(pos,i+1,msg);
if (buff.length()!=originalLength){
i += (buff.length()-originalLength);
originalLength=buff.length();
}
pos = buff.indexOf("$",i+1);
if (pos==-1){
break;
}
else {
i = pos+1;
}
}
}
return buff.toString();
}
// private static void loadDictionary(){
// loadDictionary(dictionary,dictionaryFileName,className);
// }
}
package se.prv.register.admin.util;
import java.io.FileInputStream;
import java.io.InputStream;
import java.util.Properties;
import org.apache.log4j.Logger;
import se.prv.framework.general.PRVWebSphere;
import se.prv.framework.util.Strings;
public abstract class AbstractTextHandler {
private static final String propertiesPath="//se//prv//register//properties//";
protected static Logger logger = Logger.getLogger(AbstractTextHandler.class);
// static {
// loadProperties();
// }
protected static String getPropertiesPath(){
return propertiesPath;
}
protected static String getMessage(Properties dictionary,String key){
if (dictionary==null){
return "ERROR";
}
String msg = dictionary.getProperty(key);
//System.out.println("KEY="+key);
if (msg==null){
return "?!Meddelande " +key + " saknas!?";
}
return msg;
}
protected static String getParameterizedMessage(Properties dictionary,String key,String []params){
if (dictionary==null){
return "ERROR";
}
String msg = dictionary.getProperty(key);
if (msg==null){
return "?!Meddelande " +key + " saknas!?";
}
if (params==null){
return msg;
}
StringBuffer buff = new StringBuffer(msg);
for (int i=0;i<params.length;i++){
String placeHolder = "<<"+(i+1)+">>";
if (buff.indexOf(placeHolder)!=-1){
replace(buff,placeHolder,params[i]);
}
else {
remove(buff,placeHolder);
}
}
return buff.toString();
}
public static String getParameterizedMessageTest(String key,String []params){
String msg = "HEJ <<1>>!HUR MÅR DU? HEJ DÅ FRÅN <<2>>";
if (msg==null){
return "?!Meddelande saknas!?";
}
if (params==null){
return msg;
}
StringBuffer buff = new StringBuffer(msg);
for (int i=0;i<params.length;i++){
String placeHolder = "<<"+(i+1)+">>";
if (buff.indexOf(placeHolder)!=-1){
replace(buff,placeHolder,params[i]);
}
else {
remove(buff,placeHolder);
}
}
return buff.toString();
}
private static void replace(StringBuffer buff,String placeHolder,String param){
int pos = buff.indexOf(placeHolder);
if (pos==-1){
return;
}
buff.replace(pos,pos+placeHolder.length(),param);
}
private static void remove(StringBuffer buff,String placeHolder){
int pos = buff.indexOf(placeHolder);
if (pos==-1){
return;
}
buff.replace(pos,pos+placeHolder.length(),placeHolder);
}
protected static void loadDictionary(Properties dictionary,String fileName,String className){
//String fileName = "se/prv/register/admin/dao/sql-map-config.xml";
try {
dictionary=new Properties();
InputStream fileInput = Class.forName("se.prv.register.admin.util.AbstractTextHandler").getClassLoader().getResourceAsStream(fileName);
dictionary.load(fileInput);
fileInput.close();
}
catch(Exception e) {
logger.error("Exception reading propertiesfile in init "+e);
e.printStackTrace();
dictionary=null;
}
}
}
我把我的消息文件messages.properties放在与log4j.properties文件相同的目录中,所以我认为它应该被拿起来。我做错了什么?
谢谢
答案 0 :(得分:2)
您应该将属性文件作为类路径资源加载,而不是从文件系统加载文件。阅读本文,了解如何执行此操作Smartly load your properties。
答案 1 :(得分:1)
而不是执行以下操作,
InputStream fileInput = Class.forName(className).getClassLoader().getResourceAsStream(fileName);
这样做:
InputStream fileInput = MessageHandler.class.getClassLoader().getResourceAsStream(fileName);
答案 2 :(得分:1)
这条线
InputStream fileInput = Class.forName(className).getClassLoader().getResourceAsStream(fileName);
返回null
。
这就是NPE投入读者的原因。
问题是为什么输入流为空?因为fileName
包含错误的值。所以,调试它。在行中切换断点
String fileName = getPropertiesPath()+dictionaryFileName;
并看看它返回了什么。
答案 3 :(得分:1)
您看到的异常是从Properties.load()
深度抛出的空指针异常。原因是传递的参数(fileInput
)为空。很可能是因为fileName
中指定的路径不正确。
尝试使用/
预先添加路径。
另外,请确保该文件存在。 getResourceAsStream()
方法将在与该类关联的资源中查找该文件(例如,如果您从一个程序运行程序,则必须是.jar的一部分。)