Преобразование строки в hasthtable дает исключение NullPointerException - PullRequest
0 голосов
/ 17 сентября 2011

Я пишу код, который читает файл в формате 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();
    }

}

Ответы [ 3 ]

2 голосов
/ 17 сентября 2011

Ничто не устанавливает readjsonString между:

String readjsonString = null;

и:

if(readjsonString.isEmpty()){

Таким образом, ожидается первое исключение, которое вы ловите, и то, что вы делаете, это не хорошая практика вообще.Если ожидается, что readjsonString будет нулевым (как здесь), проверьте это.

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

Было бы еще лучше, если бы вы использовали StringBuilder - вот для чего он.

Второй NPE произойдет точно там , только если gson равен нулю.Эта переменная не определена или не установлена ​​в том, что вы опубликовали, поэтому не может знать, возможно ли это.

Если происходит исключение внутри вызова метода fromJson, оноЭто может быть связано с тем, что вы вообще не читаете ввод, и, таким образом, readjsonString все равно будет нулевым.Поэтому переключитесь на StringBuilder и прекратите использовать исключения для нормального управления потоком, и все будет в порядке.

Если это не решит ваши проблемы, вам нужно опубликовать трассировку стека.

1 голос
/ 17 сентября 2011

Ну, да ... первый раз, когда вы получаете доступ к readJsonString, это только после того, как вы присвоили ему значение null.Фактически:

String readjsonString = null;

...
if(readjsonString.isEmpty())

Почему бы этому не выдать исключение?Попробуйте:

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

Вы определенно должны не ловить NullPointerException здесь.

0 голосов
/ 17 сентября 2011

Вы инициализируете 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();
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...