Android-从url获取JSON时出错

Android-从url获取JSON时出错,android,runtime-error,getjson,Android,Runtime Error,Getjson,我为我的移动应用程序编写了一个API。它位于上,并以JSON格式返回数据。我想写一个登录方法,但当我的应用程序应该询问API时,我得到了一个错误,我不知道是什么原因导致了这个错误 这是我的登录功能的一部分: public static String logIn(String nick, String password) { Log.e("2", "1"); //added by me to debug JSONParser jParser = new JS

我为我的移动应用程序编写了一个API。它位于上,并以JSON格式返回数据。我想写一个登录方法,但当我的应用程序应该询问API时,我得到了一个错误,我不知道是什么原因导致了这个错误

这是我的登录功能的一部分:

public static String logIn(String nick, String password)
    {
        Log.e("2", "1"); //added by me to debug
        JSONParser jParser = new JSONParser();
        Log.e("2", "2"); //added by me to debug
        Log.wtf("Error !", "http://tymonradzik.pl/THUNDER_HUNTER/thapi.php?q=login&username=" + nick + "&password=" + password + "&imei=");
        String json = jParser.getJSONFromUrl("http://tymonradzik.pl/THUNDER_HUNTER/thapi.php?q=login&username=" + nick + "&password=" + haslo + "&imei=");
    Log.e("2", "3");
    Log.e("aaa",json.toString());
    JSONObject jObject;
    try {
        jObject = new JSONObject(json); //That is crash line !
        String error = jObject.getString("error");
        Log.e("ADSFDSFSDF", error);
    } catch (JSONException e1) {
        // TODO Auto-generated catch block
        e1.printStackTrace();
    }
    Log.e("2", "3");
我的JSONParser类:

package com.radzik.thunter;


import java.io.BufferedReader;

import java.io.InputStream;
import java.io.InputStreamReader;


import org.apache.http.HttpEntity;
import org.apache.http.HttpResponse;

import org.apache.http.client.methods.HttpPost;
import org.apache.http.impl.client.DefaultHttpClient;
import org.apache.http.params.BasicHttpParams;

import org.json.JSONObject;



public class JSONParser {

   static InputStream is = null;
   static JSONObject jObj = null;
   static String json = "";

   // constructor
   public JSONParser() {

   }

   public String getJSONFromUrl(String url) {

       DefaultHttpClient   httpclient = new DefaultHttpClient(new BasicHttpParams());
       HttpPost httppost = new HttpPost(url);
       // Depends on your web service
       httppost.setHeader("Content-type", "application/json");

       InputStream inputStream = null;
       String result = null;
       try {
           HttpResponse response = httpclient.execute(httppost);           
           HttpEntity entity = response.getEntity();

           inputStream = entity.getContent();
           // json is UTF-8 by default
           BufferedReader reader = new BufferedReader(new InputStreamReader(inputStream, "UTF-8"), 8);
           StringBuilder sb = new StringBuilder();

           String line = null;
           while ((line = reader.readLine()) != null)
           {
               sb.append(line + "\n");
           }
           result = sb.toString();
       } catch (Exception e) { 
           // Oops
       }
       finally {
           try{if(inputStream != null)inputStream.close();}catch(Exception squish){}
       }

       return result;
   }
}
我的日志:

07-24 13:11:08.440: E/2(18212): 1
07-24 13:11:08.440: E/2(18212): 2
07-24 13:11:08.440: A/Error !(18212): http://tymonradzik.pl/THUNDER_HUNTER/thapi.php?q=login&username=aaa&password=bbb&imei=
07-24 13:11:08.475: D/AndroidRuntime(18212): Shutting down VM
07-24 13:11:08.480: W/dalvikvm(18212): threadid=1: thread exiting with uncaught exception (group=0x414e92a0)
07-24 13:11:08.485: E/AndroidRuntime(18212): FATAL EXCEPTION: main
07-24 13:11:08.485: E/AndroidRuntime(18212): java.lang.RuntimeException: Unable to start activity ComponentInfo{com.radzik.thunter/com.radzik.thunter.ThunderHunter}: java.lang.NullPointerException
07-24 13:11:08.485: E/AndroidRuntime(18212):    at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2100)
07-24 13:11:08.485: E/AndroidRuntime(18212):    at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2125)
07-24 13:11:08.485: E/AndroidRuntime(18212):    at android.app.ActivityThread.access$600(ActivityThread.java:140)
07-24 13:11:08.485: E/AndroidRuntime(18212):    at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1227)
07-24 13:11:08.485: E/AndroidRuntime(18212):    at android.os.Handler.dispatchMessage(Handler.java:99)
07-24 13:11:08.485: E/AndroidRuntime(18212):    at android.os.Looper.loop(Looper.java:137)
07-24 13:11:08.485: E/AndroidRuntime(18212):    at android.app.ActivityThread.main(ActivityThread.java:4898)
07-24 13:11:08.485: E/AndroidRuntime(18212):    at java.lang.reflect.Method.invokeNative(Native Method)
07-24 13:11:08.485: E/AndroidRuntime(18212):    at java.lang.reflect.Method.invoke(Method.java:511)
07-24 13:11:08.485: E/AndroidRuntime(18212):    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1006)
07-24 13:11:08.485: E/AndroidRuntime(18212):    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:773)
07-24 13:11:08.485: E/AndroidRuntime(18212):    at dalvik.system.NativeStart.main(Native Method)
07-24 13:11:08.485: E/AndroidRuntime(18212): Caused by: java.lang.NullPointerException
07-24 13:11:08.485: E/AndroidRuntime(18212):    at org.json.JSONTokener.nextCleanInternal(JSONTokener.java:116)
07-24 13:11:08.485: E/AndroidRuntime(18212):    at org.json.JSONTokener.nextValue(JSONTokener.java:94)
07-24 13:11:08.485: E/AndroidRuntime(18212):    at org.json.JSONObject.<init>(JSONObject.java:154)
07-24 13:11:08.485: E/AndroidRuntime(18212):    at org.json.JSONObject.<init>(JSONObject.java:171)
07-24 13:11:08.485: E/AndroidRuntime(18212):    at com.radzik.thunter.FunkcjeAPI.zalogujSie(FunkcjeAPI.java:20)
07-24 13:11:08.485: E/AndroidRuntime(18212):    at com.radzik.thunter.ThunderHunter.onCreate(ThunderHunter.java:30)
07-24 13:11:08.485: E/AndroidRuntime(18212):    at android.app.Activity.performCreate(Activity.java:5206)
07-24 13:11:08.485: E/AndroidRuntime(18212):    at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1083)
07-24 13:11:08.485: E/AndroidRuntime(18212):    at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2064)
07-24 13:11:08.485: E/AndroidRuntime(18212):    ... 11 more
使用James Holderness回答的NullPointerException:

07-26 16:42:41.665: E/AndroidRuntime(345): java.lang.RuntimeException: Unable to start activity ComponentInfo{com.radzik.thunter/com.radzik.thunter.ThunderHunter}: java.lang.NullPointerException: println needs a message
07-26 16:42:41.665: E/AndroidRuntime(345):  at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2100)
07-26 16:42:41.665: E/AndroidRuntime(345):  at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2125)
07-26 16:42:41.665: E/AndroidRuntime(345):  at android.app.ActivityThread.access$600(ActivityThread.java:140)
07-26 16:42:41.665: E/AndroidRuntime(345):  at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1227)
07-26 16:42:41.665: E/AndroidRuntime(345):  at android.os.Handler.dispatchMessage(Handler.java:99)
07-26 16:42:41.665: E/AndroidRuntime(345):  at android.os.Looper.loop(Looper.java:137)
07-26 16:42:41.665: E/AndroidRuntime(345):  at android.app.ActivityThread.main(ActivityThread.java:4898)
07-26 16:42:41.665: E/AndroidRuntime(345):  at java.lang.reflect.Method.invokeNative(Native Method)
07-26 16:42:41.665: E/AndroidRuntime(345):  at java.lang.reflect.Method.invoke(Method.java:511)
07-26 16:42:41.665: E/AndroidRuntime(345):  at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1006)
07-26 16:42:41.665: E/AndroidRuntime(345):  at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:773)
07-26 16:42:41.665: E/AndroidRuntime(345):  at dalvik.system.NativeStart.main(Native Method)
07-26 16:42:41.665: E/AndroidRuntime(345): Caused by: java.lang.NullPointerException: println needs a message
07-26 16:42:41.665: E/AndroidRuntime(345):  at android.util.Log.println_native(Native Method)
07-26 16:42:41.665: E/AndroidRuntime(345):  at android.util.Log.e(Log.java:297)
07-26 16:42:41.665: E/AndroidRuntime(345):  at com.radzik.thunter.FunkcjeAPI.zalogujSie(FunkcjeAPI.java:19)
07-26 16:42:41.665: E/AndroidRuntime(345):  at com.radzik.thunter.ThunderHunter.onCreate(ThunderHunter.java:30)
07-26 16:42:41.665: E/AndroidRuntime(345):  at android.app.Activity.performCreate(Activity.java:5206)
07-26 16:42:41.665: E/AndroidRuntime(345):  at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1083)
07-26 16:42:41.665: E/AndroidRuntime(345):  at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2064)
07-26 16:42:41.665: E/AndroidRuntime(345):  ... 11 more 
客户:

import com.google.gson.Gson;

private static final String LOG = "Login layout";
private static final String URL = "xxx";

@SuppressWarnings("unused")
@Override
public void onClick(View view) {
    Resources standardResources = getApplicationContext().getResources();
    AssetManager assets = standardResources.getAssets();
    DisplayMetrics metrics = standardResources.getDisplayMetrics();
    Configuration config = new Configuration(standardResources.getConfiguration());
    Resources defaultResources;

    int id = view.getId();
    if (id == R.id.btnCheck) {
        if (isNetworkAvailable()) {
            try {
                if (!login.getText().toString().equals("")
                        && !password.getText().toString().equals("")) {
                    HttpComunication task = new HttpComunication();
                    task.login(login.getText().toString(), password
                            .getText().toString(), false);
                    task.execute(new String[] { URL });
                    if (!task.get().equals("0")) {
                        Log.i(LOG, task.get());
                        Profile profile = new Gson().fromJson(task.get(),
                                Profile.class);

                        Intent intent = new Intent(getApplicationContext(),
                                StopPointsActivity.class);
                        intent.putExtra("PROFILE", profile);
                        intent.putExtra("LOGIN", login.getText().toString());
                        intent.putExtra("PASS", password.getText()
                                .toString());

                        startActivity(intent);
                        finish();
                    } else {
                        Toast.makeText(
                                getApplicationContext(),
                                getResources().getString(
                                        R.string.incorect_data),
                                Toast.LENGTH_LONG).show();
                    }
                } else {
                    Toast.makeText(getApplicationContext(),
                            getResources().getString(R.string.empty_data),
                            Toast.LENGTH_LONG).show();
                }

            } catch (Exception e) {
                Log.e(LOG, e.toString());
            }
        } else {
            Toast.makeText(getApplicationContext(),
                    getResources().getString(R.string.error_connection),
                    Toast.LENGTH_LONG).show();
        }
    }
}

private boolean isNetworkAvailable() {
    ConnectivityManager connectivityManager 
          = (ConnectivityManager) getSystemService(Context.CONNECTIVITY_SERVICE);
    NetworkInfo activeNetworkInfo = connectivityManager.getActiveNetworkInfo();
    return activeNetworkInfo != null && activeNetworkInfo.isConnected();
}
}



public class HttpComunication extends AsyncTask<String, Void, String> {
private String login;
private String password;
private boolean isLoged;
private String logReport;
private String start;
private String stop;

public void login(String _login, String _password, boolean _isLoged) {
    this.login = _login;
    this.password = _password;

    if (_isLoged) {
        logReport = "yes";
    } else {
        logReport = "no";
    }
    this.isLoged = _isLoged;
}

public void getPath(String _start, String _stop) {
    this.start = _start;
    this.stop = _stop;
}

@Override
protected String doInBackground(String... urls) {
    String output = null;
    if (!isLoged) {
        for (String url : urls) {
            output = loginToSystem(url);
        }
    } else {
        for (String url : urls) {
            output = getSchedules(url);
        }
    }
    return output;
}

private String loginToSystem(String url) {
    String output = null;
    try {
        DefaultHttpClient httpClient = new DefaultHttpClient();
        HttpPost httpPost = new HttpPost(url);

        ArrayList<NameValuePair> postParameters = new ArrayList<NameValuePair>();
        postParameters.add(new BasicNameValuePair("username", login));
        postParameters.add(new BasicNameValuePair("password", password));
        postParameters.add(new BasicNameValuePair("loged", logReport));
        httpPost.setEntity(new UrlEncodedFormEntity(postParameters));

        HttpResponse httpResponse = httpClient.execute(httpPost);
        HttpEntity httpEntity = httpResponse.getEntity();
        output = EntityUtils.toString(httpEntity);
    } catch (UnsupportedEncodingException e) {
        e.printStackTrace();
    } catch (ClientProtocolException e) {
        e.printStackTrace();
    } catch (IOException e) {
        e.printStackTrace();
    }
    return output;
}

private String getSchedules(String url) {
    String output = null;
    try {
        DefaultHttpClient httpClient = new DefaultHttpClient();
        HttpPost httpPost = new HttpPost(url);

        ArrayList<NameValuePair> postParameters = new ArrayList<NameValuePair>();

        postParameters.add(new BasicNameValuePair("username", login));
        postParameters.add(new BasicNameValuePair("password", password));
        postParameters.add(new BasicNameValuePair("loged", logReport));
        postParameters.add(new BasicNameValuePair("start", start));
        postParameters.add(new BasicNameValuePair("stop", stop));
        httpPost.setEntity(new UrlEncodedFormEntity(postParameters));

        HttpResponse httpResponse = httpClient.execute(httpPost);
        HttpEntity httpEntity = httpResponse.getEntity();
        output = EntityUtils.toString(httpEntity);
    } catch (UnsupportedEncodingException e) {
        e.printStackTrace();
    } catch (ClientProtocolException e) {
        e.printStackTrace();
    } catch (IOException e) {
        e.printStackTrace();
    }
    return output;
}

@Override
protected void onPostExecute(String output) {
}
检查人:

    private static String localLogin = "Dragy";
private static String localPassword = "qwe";
    protected static boolean comfirmData(String userName, String password) {
    if (userName.equals(localLogin) && password.equals(localPassword)) {
        fillDataForUser();
        return true;
    } else {
        return false;
    }
}

在我看来,您正在向服务器发送POST请求,该服务器正在等待GET。除此之外,您的POST请求设置了一个内容类型头,但您实际上没有提供任何内容

我预计这会导致请求失败,从而导致异常(您将忽略该异常)。这意味着从getJSONFromUrl返回的结果字符串为null,这最终会导致JSON解析器中出现null指针异常

另外,为什么要用空的BasicHttpParams对象覆盖默认HTTP参数?如果不使用该参数,客户端将使用默认HTTP参数初始化,这似乎是一个更合理的选项

您可以将POST请求转换为GET请求,并通过如下方式替换getJSONFromUrl的前几行来摆脱BasicHttpParams:

 DefaultHttpClient   httpclient = new DefaultHttpClient();
 HttpGet httpget = new HttpGet(url);

 InputStream inputStream = null;
 String result = null;
 try {
     HttpResponse response = httpclient.execute(httpget);           
     HttpEntity entity = response.getEntity();

 ...

如果这不起作用,请在异常处理程序中添加一些日志记录,以查看导致请求失败的原因。

崩溃位于
com.radzik.thunter.FunkcjeAPI.zalogujSie(FunkcjeAPI.java:20)
。FunkcjeAPI表示APIFunctions(我翻译了变量名)。zalogujSie意味着登录(我还翻译了函数名)。我添加了崩溃行我想说的是,您的stacktrace似乎没有进入
getJSONFromUrl
。我猜错误发生在调用
getJSONFromUrl
之后。第20行到底是什么?我在尝试解析json并检查它是否正确之前添加了informationlog。在
getJSONFromUrl
中添加e.printStrackTrace而不是
//Oops
。我猜它在这里崩溃了,但你放弃了异常,然后返回null。jak może mi to pomóc(这怎么能帮助我呢?)开玩笑说praktycznie cały program do poączenia miedzy serwerem a aplikacja na androidzie przy użyciu jsona,mo esz porównaćco I jak bo mnie dzia bez zarzutów:)dzia kod,na pewno siebie,leci+1现在我也得到了NullPointerException,但另一个(粘贴在我的问题中)异常出现在您的
Log.e
调用中(在FunkcjeAPI.java第19行的FunkcjeAPI.zalogujSie中)。是的,我知道。我想因为json是空的(null),它是哪一行?如果是
Log.e(“ADSFDSFSDF”,错误)那么json不是空的-它只是没有“error”值。您是否尝试记录json字符串。我在代码中添加了新行,它正在崩溃:
Log.e(“aaa”,json.toString())
    private static String localLogin = "Dragy";
private static String localPassword = "qwe";
    protected static boolean comfirmData(String userName, String password) {
    if (userName.equals(localLogin) && password.equals(localPassword)) {
        fillDataForUser();
        return true;
    } else {
        return false;
    }
}
 DefaultHttpClient   httpclient = new DefaultHttpClient();
 HttpGet httpget = new HttpGet(url);

 InputStream inputStream = null;
 String result = null;
 try {
     HttpResponse response = httpclient.execute(httpget);           
     HttpEntity entity = response.getEntity();

 ...