【问题标题】:App crashes on HttpResponse response = httpclient.execute(httpget) when attempting to send to JSON尝试发送到 JSON 时,应用程序在 HttpResponse response = httpclient.execute(httpget) 上崩溃
【发布时间】:2013-12-01 15:42:25
【问题描述】:

我正在尝试从 Android 应用程序获取 JSONObject,但在
response = httpclient.execute(httpget) 上崩溃并引发异常。

我认为问题在于 url 编码,但我不确定。如果我不对 URL 进行编码,应用程序会在 httpget = new HttpGet(encodeURL) 上面几行崩溃。

我传递的网址是:http://api.elpais.com/ws/LoteriaNavidadPremiados?n=99999

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.UnsupportedEncodingException;
import java.net.URLEncoder;
import org.apache.http.HttpEntity;
import org.apache.http.HttpResponse;
import org.apache.http.client.HttpClient;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.impl.client.DefaultHttpClient;
import org.json.JSONException;
import org.json.JSONObject;
import android.util.Log;

public class Json {

    public Json(){

    }

    public static JSONObject getJson(String url) {

    String encodeUrl = null;
    InputStream is = null;
    String result = "";
    JSONObject jsonObject = null;
    HttpGet httpget;

    // Encode URL. If not, HttpGet will crash
    try {
        encodeUrl = URLEncoder.encode(url, "UTF-8");
        //encodeUrl = encodeUrl.replaceAll("%3F", "?"); // I tried replacing this but does not work
        //encodeUrl = encodeUrl.replaceAll("%3D", "=");  //

    } catch (UnsupportedEncodingException e1) {
        // TODO Auto-generated catch block
        Log.d("LOG_EXCEPTION", "Unsuported Encoding Exception");
        e1.printStackTrace();
    }
    // HTTP
    try {
        HttpClient httpclient = new DefaultHttpClient(); // for port 80
        // requests!
        httpget = new HttpGet(encodeUrl);
        // HttpPost httppost = new HttpPost(url);
                    Log.d("LOG", "THIS CODE I SEE in LOGCAT");
        HttpResponse response = httpclient.execute(httpget); // HERE CRASH
                    Log.d("LOG", "THIS CODE I DO NOT SEE in LOGCAT");
        HttpEntity entity = response.getEntity();

        is = entity.getContent();
    } catch (IOException e) {

        Log.d("LOG_EXCEPTION", "IOException");
    } catch (IllegalArgumentException e) {

        Log.d("LOG_EXCEPTION", "URL no valida");
    } catch (Exception e) {
        // return null;
        Log.d("LOG_EXCEPTION", "Exception");
    }

    // Read response to string
    try {
        BufferedReader reader = new BufferedReader(new InputStreamReader(
                is, "utf-8"), 8);
        StringBuilder sb = new StringBuilder();
        String line = null;
        while ((line = reader.readLine()) != null) {
            sb.append(line + "\n");
        }
        is.close();
        result = sb.toString();
    } catch (Exception e) {
        Log.d("LOG_EXCEPTION", "Reader response to string");
        // return null;
    }

    // Convert string to object
    try {
        jsonObject = new JSONObject(result);
    } catch (JSONException e) {
        // return null;
    }
    return jsonObject;

}

}

和日志:

12-01 11:04:01.336: D/(1631): HostConnection::get() New Host Connection established                                    0xb8d029d0, tid 1631
12-01 11:04:05.866: D/LOG(1631): http%3A%2F%2Fapi.elpais.com%2Fws%2FLoteriaNavidadPremiados?n=99999
12-01 11:04:05.866: D/LOG(1631): httpget work fine
12-01 11:04:06.176: D/LOG_EXCEPTION(1631): Exception
12-01 11:04:06.176: D/LOG_EXCEPTION(1631): Reader response to string
12-01 11:04:06.176: D/AndroidRuntime(1631): Shutting down VM
12-01 11:04:06.186: W/dalvikvm(1631): threadid=1: thread exiting with uncaught exception (group=0xb1a5bb90)
12-01 11:04:06.186: E/AndroidRuntime(1631): FATAL EXCEPTION: main
12-01 11:04:06.186: E/AndroidRuntime(1631): Process: com.example.loterianavidad, PID:    1631
12-01 11:04:06.186: E/AndroidRuntime(1631): java.lang.NullPointerException
12-01 11:04:06.186: E/AndroidRuntime(1631):     at com.example.loterianavidad.MainActivity$2.onClick(MainActivity.java:86)
12-01 11:04:06.186: E/AndroidRuntime(1631):     at     android.view.View.performClick(View.java:4424)
12-01 11:04:06.186: E/AndroidRuntime(1631):     at android.view.View$PerformClick.run(View.java:18383)
12-01 11:04:06.186: E/AndroidRuntime(1631):     at   android.os.Handler.handleCallback(Handler.java:733)
12-01 11:04:06.186: E/AndroidRuntime(1631):     at  android.os.Handler.dispatchMessage(Handler.java:95)
12-01 11:04:06.186: E/AndroidRuntime(1631):     at     android.os.Looper.loop(Looper.java:137)
12-01 11:04:06.186: E/AndroidRuntime(1631):     at android.app.ActivityThread.main(ActivityThread.java:4998)
12-01 11:04:06.186: E/AndroidRuntime(1631):     at   java.lang.reflect.Method.invokeNative(Native Method)
12-01 11:04:06.186: E/AndroidRuntime(1631):     at   java.lang.reflect.Method.invoke(Method.java:515)
12-01 11:04:06.186: E/AndroidRuntime(1631):     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:777)
12-01 11:04:06.186: E/AndroidRuntime(1631):     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:593)
12-01 11:04:06.186: E/AndroidRuntime(1631):     at dalvik.system.NativeStart.main(Native Method)

MainActivity相关代码:

@Override
public void onClick(View v) {
    // TODO Auto-generated method stub
    Context context = getApplicationContext();
    CharSequence text = "Accediendo a la base de datos...";
    JSONObject j = Json.getJson("http://api.elpais.com/ws/LoteriaNavidadPremiados?n=99999");
    Log.d("LOG", j.toString()); // HERE is LINE 87
    int duration = Toast.LENGTH_LONG;
    Toast toast = Toast.makeText(context, text, duration);
    toast.show();
    String prem = "hola";

【问题讨论】:

  • 问题在MainActivity87 中的onClick 方法内,请分享代码的相关部分以获得更多帮助
  • 那里,我只实例化对象。 86. JSONObject j = json.getJson("api.elpais.com/ws/LoteriaNavidadPremiados?n=99999"); 87. Log.d("LOG", j.toString()); // 检查对象是否正确
  • 在类名中使用JSONObject j = Json.getJson("api.elpais.com/ws/LoteriaNavidadPremiados?n=99999"); 而不是小s,因为getJson 方法是static,因此您无需创建Json 类的实例即可访问它
  • 好吧,照办。但问题不在于 MainActivity。在这个班。 Log.d("LOG", "我在 LOGCAT 中看到的这个代码"); HttpResponse 响应 = httpclient.execute(httpget); // 这里崩溃 Log.d("LOG", "THIS CODE I DO NOT SEE in LOGCAT");
  • 你能在 logcat 中看到Log.d("LOG_EXCEPTION", "Unsuported Encoding Exception"); 行吗?如果是,则分享完整的 logcat 结果或 MainActivity 代码

标签: java android json httpclient


【解决方案1】:

目前您正在使用参数对整个 url 进行编码,因此只需对参数进行编码,然后附加到 url,然后将其传递给 HttpGet 构造函数:

String str_url="99999";
encodeUrl = URLEncoder.encode(url, "UTF-8");
String final_url="http://api.elpais.com/ws/LoteriaNavidadPremiados?n="+encodeUrl;

【讨论】:

  • 好!非常感谢您。但不幸的是,我什至有一个问题。一秒。
  • @IkerOcioZuazo:什么问题?
  • 最后我有两个问题。第一个是,如果我像这样在 URL“api.elpais.com/ws/LoteriaNavidadPremiados?n%3D99999”中编码参数,我收到的 json 是 busqueda={“error”:1},但是如果你从纯 URL 获得请求(用“=”替换“%3D” "),我收到的 json 是 busqueda={"numero":99999,"premio":0,"timestamp":1356190680,"status":2,"error":0}。我认为这会更好地创建另一个问题。
  • @IkerOcioZuazo :我的错误只是编码值而不是参数遵循此语法 :: www.example.com/test/name= URLEncoder.encode(url, "UTF-8")+"second_param= "+URLEncoder.encode(url, "UTF-8")
  • 谢谢。第二个 LAST 问题...“结果”变量,返回一个字符串:example={"key":value,"key2":value2}... 好的。然后我创建 JSONObject jsonObject = new JSONObject(result) 如果我用 logcat 看类似 Log.d("LOG", jsonObject.toString()); logcat 引发另一个 NullPointerException。有什么想法吗?
【解决方案2】:

您的应用在 MAINACTIVITY 中的行号 87 处崩溃

java.lang.NullPointerException 12-01 10:25:08.546: E/AndroidRuntime(1428): at com.example.loterianavidad.MainActivity$2.onClick(MainActivity.java:87) 

因为您在 MAINACTIVITY 的引用 XML 视图中不存在的按钮上使用了 onclicklistener

【讨论】:

  • 那个按钮工作正常。如果我删除 MAIN 87 Log.d("LOG", j.toString()) 中的第 87 行代码,则可以正常工作。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2019-05-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-09-03
  • 1970-01-01
相关资源
最近更新 更多