【问题标题】:Converting string to hasthtable gives a NullPointerException将字符串转换为 hasthtable 会产生 NullPointerException
【发布时间】:2011-11-19 04:39:34
【问题描述】:

我正在编写一个代码来读取 json 格式的文件并将其转换为哈希表。

但是,当我尝试将字符串转换为哈希表时,我得到了 NullPointerException

readBackInfo = gson.fromJson(readjsonString, fileInfoType);

这是我正在实现的代码

public void readSyncFile(){
    String readjsonString = null;
    readBackInfo = new HashMap<String, ArrayList<String[]>>();
    try {
        FileInputStream fstream = new FileInputStream(_dirName+"/."+_dirName);
        DataInputStream in = new DataInputStream(fstream);
        BufferedReader br = new BufferedReader(new InputStreamReader(in));
        String strLine;

        while ((strLine = br.readLine()) != null)   {
            if(readjsonString==null){
                readjsonString = strLine;
            } else {
                readjsonString = readjsonString + "\n" + strLine;
            }
        }
        in.close();
        //System.out.println(readjsonString);

        Type fileInfoType = new TypeToken<HashMap<String, ArrayList<String[]>>>() {}.getType();

        System.out.println(allFiles.isEmpty());

        //getting a NullPointerException from the line below!
        readBackInfo = gson.fromJson(readjsonString, fileInfoType);

        sFileInToHashtable();
        //readjsonString = gson.toJson(readBackInfo);
        //System.out.println(readjsonString);

    } catch (FileNotFoundException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    } catch (IOException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }

}

【问题讨论】:

  • 在询问有关获取异常的问题时,最好在问题中包含堆栈跟踪。

标签: java nullpointerexception hashtable type-conversion


【解决方案1】:

您将readjsonString 初始化为null,然后在其上调用isEmpty() 方法。这就是抛出NullPointerException 的原因。注意null与空字符串""不同。

如果您想readjsonString 开始为空,请使用String readjsonString = "";

否则你应该检查null,使用if (readjsonString == null)

我不知道你为什么会像现在这样捕获NullPointerException - 这个异常永远不应该被捕获,因为它总是表明一个错误。

编辑:我认为构建readjsonString 的逻辑可能存在缺陷。请尝试以下操作:

String readjsonString = "";

...

while ((strLine = br.readLine()) != null) {
   if(!readjsonString.isEmpty()){
      readjsonString += "\n"; //append newline if it isn't the first line
   }
   readjsonString += strLine; //append line
}

或者StringBuilder:

StringBuilder readjsonStringBuilder = new StringBuilder();

...

while ((strLine = br.readLine()) != null) {
   if(readjsonStringBuilder.length() > 0){
      readjsonStringBuilder.append("\n");
   }
   readjsonStringBuilder.append(strLine);
}
String readjsonString = readjsonStringBuilder.toString();

【讨论】:

  • noo 不是那部分,我知道我在那里遇到空指针异常,我在问readBackInfo = gson.fromJson(readjsonString, fileInfoType);
  • @Leanne - 但是你为什么要在循环中捕获 NPE?为什么不解决第一个 NPE - 它可能与第二个有关,因为您的代码只是想吃掉它并继续前进。
  • 是的,我刚刚修复了它,但仍然从 readBackInfo = gson.fromJson(readjsonString, fileInfoType); 得到异常,我将编辑我的代码
【解决方案2】:

嗯,是的...您第一次访问readJsonString 是在您只为其分配了null 的值之后。有效:

String readjsonString = null;

...
if(readjsonString.isEmpty())

为什么会抛出异常?试试:

if (readjsonString == null || readJsonString.isEmpty())
{
    ...
}

你绝对应该在这里抓到NullPointerException

【讨论】:

  • noo 不是那个部分,我知道我在那里遇到空指针异常,我在问readBackInfo = gson.fromJson(readjsonString, fileInfoType);
【解决方案3】:

readjsonString 之间没有任何设置:

String readjsonString = null;

和:

if(readjsonString.isEmpty()){

因此,您遇到的第一个异常是意料之中的,而您正在做的事情根本就不是好的做法。如果 readjsonString 预期为 null(就像这里一样),请检查。

if (readjsonString == null) {
  readjsonString = strLine;
} else {
  ...
}

如果你使用StringBuilder 会更好——这就是它的用途。

只有当gson 为空时,第二个NPE 才会发生在那里。该变量未在您发布的内容中定义或设置,因此不知道这是否可能。

如果异常发生在内部 fromJson 方法调用,可能是因为您根本没有读取任何输入,因此readjsonString 仍然为空。所以切换到 StringBuilder 并停止使用异常进行正常的流控制,你应该没问题。

如果这不能解决您的问题,您需要发布堆栈跟踪。

【讨论】:

  • 我忘了加gson = new GsonBuilder().setPrettyPrinting().create();!,thanx^^现在解决了
  • 你应该真的考虑一下我和其他人给出的建议。将异常用于正常的流控制不是好习惯。
猜你喜欢
  • 2015-11-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-01-22
  • 2013-04-28
相关资源
最近更新 更多