I'm using this tutorial to learn how to connect my app to an API:JSON парсер дает нулевой указатель
Основываясь на том, что мой JSONParser выглядит следующим образом:
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.UnsupportedEncodingException;
import java.util.List;
import org.apache.http.HttpEntity;
import org.apache.http.HttpResponse;
import org.apache.http.NameValuePair;
import org.apache.http.client.ClientProtocolException;
import org.apache.http.client.entity.UrlEncodedFormEntity;
import org.apache.http.client.methods.HttpPost;
import org.apache.http.impl.client.DefaultHttpClient;
import org.json.JSONException;
import org.json.JSONObject;
import android.util.Log;
public class JSONParser {
static InputStream is = null;
static JSONObject json = null;
static String outPut = "";
public JSONObject getJSONFromUrl(String url, List<NameValuePair> params) {
try {
DefaultHttpClient httpClient = new DefaultHttpClient();
HttpPost httpPost = new HttpPost(url);
httpPost.setEntity(new UrlEncodedFormEntity(params));
HttpResponse httpResponse = httpClient.execute(httpPost);
HttpEntity httpEntity = httpResponse.getEntity();
is = httpEntity.getContent();
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
} catch (ClientProtocolException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
try {
BufferedReader in = new BufferedReader(new InputStreamReader(
is, "iso-8859-1"), 8);
StringBuilder sb = new StringBuilder();
String line = null;
while ((line = in.readLine()) != null) {
sb.append(line + "\n");
}
is.close();
outPut = sb.toString();
Log.e("JSON", outPut);
} catch (Exception e) {
Log.e("Buffer Error", "Error converting result " + e.toString());
}
try {
json = new JSONObject(outPut);
} catch (JSONException e) {
Log.e("JSON Parser", "Error parsing data " + e.toString());
}
return json;
}
}
Я пытаюсь получить ответ JSON с помощью этого:
String requestType = "author";
String getType = "get-list";
apiURL = apiURL+requestType+"/"+getType;
List<NameValuePair> params = new ArrayList<NameValuePair>();
params.add(new BasicNameValuePair("ConsumerKey", consumerKey));
params.add(new BasicNameValuePair("SharedSecret", sharedSecret));
JSONObject json = jsonParser.getJSONFromUrl(apiURL, params);
I 've использовал log.d(), чтобы проверить apiURL, потребительский ключ и общий секрет, и оба они выглядят отлично. API требует метода «Post», поэтому я использую HttpPost вместо HttpGet.
Согласно журналу JSONObject json = jsonParser.getJSONFromUrl(apiURL, params);
запускается исключение нулевого указателя. Я предполагаю, что это потому, что api ничего не возвращает, но я могу ошибаться. Что-то выглядит неправильно, что я не вижу?
------ Редактирование: добавлен журнал/StackTrace -----
threadid=1: thread exiting with uncaught exception (group=0x419ffb90)
FATAL EXCEPTION: main
Process: com.library.books, PID: 19156
java.lang.RuntimeException: Unable to start activity ComponentInfo{com.library.books/com.library.books.SplashScreen}: java.lang.NullPointerException
at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2176)
at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2226)
at android.app.ActivityThread.access$700(ActivityThread.java:135)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1397)
at android.os.Handler.dispatchMessage(Handler.java:102)
at android.os.Looper.loop(Looper.java:137)
at android.app.ActivityThread.main(ActivityThread.java:4998)
at java.lang.reflect.Method.invokeNative(Native Method)
at java.lang.reflect.Method.invoke(Method.java:515)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:777)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:593)
at dalvik.system.NativeStart.main(Native Method)
Caused by: java.lang.NullPointerException
at com.library.books.libraryDB.getAPIRegions(libraryDB.java:467)
at com.library.books.SplashScreen.updateRegions(SplashScreen.java:90)
at com.library.books.SplashScreen.onCreate(SplashScreen.java:35)
at android.app.Activity.performCreate(Activity.java:5243)
at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1087)
at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2140)
... 11 more
----- редактировать: новый журнал ----- Я переместил URL и pramas в файл JSONParser.java, а не включать их в getJSONFromUrl(), и я получаю новый журнал.
D/AndroidRuntime(27736): Shutting down VM
W/dalvikvm(27736): threadid=1: thread exiting with uncaught exception (group=0x419ffb90)
D/dalvikvm(27736): GC_FOR_ALLOC freed 378K, 6% free 7731K/8148K, paused 33ms, total 34ms
E/AndroidRuntime(27736): FATAL EXCEPTION: main
E/AndroidRuntime(27736): Process: com.library.books, PID: 27736
E/AndroidRuntime(27736): java.lang.RuntimeException: Unable to start activity ComponentInfo{com.library.books/com.library.books.SplashScreen}: android.os.NetworkOnMainThreadException
E/AndroidRuntime(27736): at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2176)
E/AndroidRuntime(27736): at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2226)
E/AndroidRuntime(27736): at android.app.ActivityThread.access$700(ActivityThread.java:135)
E/AndroidRuntime(27736): at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1397)
E/AndroidRuntime(27736): at android.os.Handler.dispatchMessage(Handler.java:102)
E/AndroidRuntime(27736): at android.os.Looper.loop(Looper.java:137)
E/AndroidRuntime(27736): at android.app.ActivityThread.main(ActivityThread.java:4998)
E/AndroidRuntime(27736): at java.lang.reflect.Method.invokeNative(Native Method)
E/AndroidRuntime(27736): at java.lang.reflect.Method.invoke(Method.java:515)
E/AndroidRuntime(27736): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:777)
E/AndroidRuntime(27736): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:593)
E/AndroidRuntime(27736): at dalvik.system.NativeStart.main(Native Method)
E/AndroidRuntime(27736): Caused by: android.os.NetworkOnMainThreadException
E/AndroidRuntime(27736): at android.os.StrictMode$AndroidBlockGuardPolicy.onNetwork(StrictMode.java:1145)
E/AndroidRuntime(27736): at java.net.InetAddress.lookupHostByName(InetAddress.java:385)
E/AndroidRuntime(27736): at java.net.InetAddress.getAllByNameImpl(InetAddress.java:236)
E/AndroidRuntime(27736): at java.net.InetAddress.getAllByName(InetAddress.java:214)
E/AndroidRuntime(27736): at org.apache.http.impl.conn.DefaultClientConnectionOperator.openConnection(DefaultClientConnectionOperator.java:137)
E/AndroidRuntime(27736): at org.apache.http.impl.conn.AbstractPoolEntry.open(AbstractPoolEntry.java:164)
E/AndroidRuntime(27736): at org.apache.http.impl.conn.AbstractPooledConnAdapter.open(AbstractPooledConnAdapter.java:119)
E/AndroidRuntime(27736): at org.apache.http.impl.client.DefaultRequestDirector.execute(DefaultRequestDirector.java:360)
E/AndroidRuntime(27736): at org.apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpClient.java:555)
E/AndroidRuntime(27736): at org.apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpClient.java:487)
E/AndroidRuntime(27736): at org.apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpClient.java:465)
E/AndroidRuntime(27736): at com.library.books.JSONParser.getJSONFromUrl(JSONParser.java:46)
E/AndroidRuntime(27736): at com.library.books.libraryDB.getAPIRegions(libraryDB.java:467)
E/AndroidRuntime(27736): at com.library.books.SplashScreen.updateRegions(SplashScreen.java:90)
E/AndroidRuntime(27736): at com.library.books.SplashScreen.onCreate(SplashScreen.java:35)
E/AndroidRuntime(27736): at android.app.Activity.performCreate(Activity.java:5243)
E/AndroidRuntime(27736): at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1087)
E/AndroidRuntime(27736): at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2140)
E/AndroidRuntime(27736): ... 11 more
----- редактирования: новый LogCat и сценарий -----
LogCat:
D/libEGL(15073): loaded /system/lib/egl/libEGL_tegra.so
D/libEGL(15073): loaded /system/lib/egl/libGLESv1_CM_tegra.so
D/libEGL(15073): loaded /system/lib/egl/libGLESv2_tegra.so
D/dalvikvm(15073): GC_FOR_ALLOC freed 196K, 3% free 7913K/8148K, paused 34ms, total 35ms
D/OpenGLRenderer(15073): Enabling debug mode 0
... the script outputs the json as the html for a 404 page ...
E/JSON Parser(15073): Error parsing data org.json.JSONException: Value <!DOCTYPE of type java.lang.String cannot be converted to JSONObject
D/dalvikvm(15073): GC_FOR_ALLOC freed 187K, 3% free 8239K/8464K, paused 53ms, total 53ms
Вызов: JSON
public void getAPIRegions(String appUpdateDate){
String requestType = "author";
String getType = "get-list";
apiURL = apiURL+requestType+"/"+getType;
jsonParser.execute(new String[] {apiURL,consumerKey,sharedSecret});
}
jsonParser, consumerKey , sharedSecret и apiURL начинаются в начале кода.
Проблема теперь в том, как вы можете видеть, «... скрипт выводит JSON как HTML для 404 страницы ...»
Там не все ошибки, как и раньше, теперь он посылает назад на странице 404, так как она не получает ConsumerKey и SharedSecret.
вы действительно возражаете проводкой StackTrace? – njzk2
снова, json не закодирован в iso-8859-1. никогда. это противоречит спецификациям. люди, которые говорили вам, что лежат. и использование readLines в файле, в котором вы даже не знаете, есть ли строки, не имеет никакого смысла. никто. – njzk2
Что такое исключение? Пожалуйста, включите исключение в свой вопрос. – frozenkoi