NullPointerException при разборе java в java - PullRequest
0 голосов
/ 30 сентября 2018

Я пытаюсь проанализировать JSON из веб-API в первый раз, и я получаю исключение NullPointerException.Я скачал файл json .jar и добавил его как внешнюю библиотеку, затем добавил JSON в StringBuffer и просто посмотрел, работает ли он, - добавил System.Out.println.Затем я сделал JSON Object, но не был уверен в аргументе, должен ли это быть объект stringBuffer?В конце я попытался создать массив JSON и найти в нем строку «Država», но затем я получил это исключение NullPointerException.Где я не прав?

edit: я еще не использую Maven.

мой код:

try {   

    double responseCode = conn.getResponseCode();
    BufferedReader in = new BufferedReader(new InputStreamReader(conn.getInputStream()));
    System.out.println("Broj tečajnice = "+ responseCode);

    String inputLine;
    StringBuffer response = new StringBuffer();

    while ((inputLine = in.readLine()) != null) {
        response.append(inputLine);
        System.out.println(inputLine);
    }

    JSONObject obj = new JSONObject(inputLine);

    JSONArray arr = obj.getJSONArray("Država");
    for (int i = 0; i < arr.length(); i++)
    {
        String drzava = arr.getJSONObject(i).getString("Država");
        System.out.println(drzava);
    }
    in.close();
    }
    catch (IOException | JSONException e) {
        e.printStackTrace();
    }

И JSON с веб-сайта:

[{"Broj tečajnice":"188",
"Datum primjene":"30.09.2018",
"Država":"Australija",
"Šifra valute":"036",
"Valuta":"AUD",
"Jedinica":1,
"Kupovni za devize":"4,605078",
"Srednji za devize":"4,618935",
"Prodajni za devize":"4,632792"},

{"Broj tečajnice":"188",
"Datum primjene":"30.09.2018",
"Država":"Kanada",
"Šifra valute":"124",
"Valuta":"CAD",
"Jedinica":1,
"Kupovni za devize":"4,903440",
"Srednji za devize":"4,918195",
"Prodajni za devize":"4,932950"}
...etc...]

Исключение:

java.lang.NullPointerException
at java.io.StringReader.<init>(StringReader.java:50)
at org.json.JSONTokener.<init>(JSONTokener.java:66)
at org.json.JSONObject.<init>(JSONObject.java:420)
at pretvaracValuta.PretvaracController.connection(PretvaracController.java:49)
at pretvaracValuta.PretvaracController.initialize(PretvaracController.java:24)
at javafx.fxml.FXMLLoader.loadImpl(FXMLLoader.java:2548)
at javafx.fxml.FXMLLoader.loadImpl(FXMLLoader.java:2441)
at javafx.fxml.FXMLLoader.loadImpl(FXMLLoader.java:3214)
at javafx.fxml.FXMLLoader.loadImpl(FXMLLoader.java:3175)
at javafx.fxml.FXMLLoader.loadImpl(FXMLLoader.java:3148)
at javafx.fxml.FXMLLoader.loadImpl(FXMLLoader.java:3124)
at javafx.fxml.FXMLLoader.loadImpl(FXMLLoader.java:3104)
at javafx.fxml.FXMLLoader.load(FXMLLoader.java:3097)
at pretvaracValuta.Main.start(Main.java:14)
at com.sun.javafx.application.LauncherImpl.lambda$launchApplication1$106(LauncherImpl.java:863)
at com.sun.javafx.application.PlatformImpl.lambda$runAndWait$119(PlatformImpl.java:326)
at com.sun.javafx.application.PlatformImpl.lambda$null$117(PlatformImpl.java:295)
at java.security.AccessController.doPrivileged(Native Method)
at com.sun.javafx.application.PlatformImpl.lambda$runLater$118(PlatformImpl.java:294)
at com.sun.glass.ui.InvokeLaterDispatcher$Future.run(InvokeLaterDispatcher.java:95)
at com.sun.glass.ui.gtk.GtkApplication._runLoop(Native Method)
at com.sun.glass.ui.gtk.GtkApplication.lambda$null$450(GtkApplication.java:139)
at java.lang.Thread.run(Thread.java:748)

Ответы [ 3 ]

0 голосов
/ 30 сентября 2018

Я думаю, что вы используете неправильный ввод для вашего JSonObject:

double responseCode = conn.getResponseCode();
try (InputStreamReader  sr =new InputStreamReader(conn.getInputStream());
     BufferedReader in = new BufferedReader(sr)){  
// ^ this is Jdk7+, will close your streams after the block exists, like in finally block 

...

JSONObject obj = new JSONObject(response.toString()); // pass the input as a String

....
}catch (IOException | JSONException e) {
    e.printStackTrace();
}

Ваша переменная response содержит ввод в виде строки, тогда как inputLine содержит только одну строку.И после последней итерации он устанавливается в ноль.Что вызовет NPE.

0 голосов
/ 30 сентября 2018

Вам нужно получить JSONArray, а затем повторить его для анализа требуемого значения.

JSONArray array = new JSONArray(inputLine);
for (int i = 0; i < array.length(); i++) {
   System.out.println(array.get(i).get("Država"));
}
0 голосов
/ 30 сентября 2018

Первая проблема

Вы передаете неправильное значение в конструктор JSONObject.Посмотрите на этот фрагмент кода:

String inputLine;
StringBuffer response = new StringBuffer();

while ((inputLine = in.readLine()) != null) {
    response.append(inputLine);
    System.out.println(inputLine);
}

JSONObject obj = new JSONObject(inputLine);

Цикл while завершится только тогда, когда inputLine равен нулю - поэтому ваша последняя строка эквивалентна:

JSONObject obj = new JSONObject(null);

... что явно не то, что вы хотите.Я думаю, вы хотите:

JSONObject obj = new JSONObject(response.toString());

Обратите внимание, что вы, вероятно, также хотите использовать StringBuilder вместо StringBuffer, чтобы избежать бессмысленной синхронизации.

Следующая проблема

Если ваш JSON на самом деле имеет форму [ ... ], то это массив, а не объект на верхнем уровне.Поэтому вы, вероятно, захотите:

JSONArray arr = new JSONArray(response.toString());
for (int i = 0; i < arr.length(); i++)
{
    String drzava = arr.getJSONObject(i).getString("Država");
    System.out.println(drzava);
}

В конце концов, если вы посмотрите на свой JSON, в нем не будет Država в качестве имени свойства с массивом в качестве значения.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...