【问题标题】:NullPointerException in connecting to mysql using php and in android使用 php 和 android 连接到 mysql 时出现 NullPointerException
【发布时间】:2013-09-25 02:47:15
【问题描述】:

我正在尝试使用一些使用 php 连接到 mysql 的教程从 URL 获取数据。

但是,当我运行代码时,我得到了一个空指针异常。

Database_demo.java

 package com.database_demo;

 import java.io.BufferedReader;
 import java.io.InputStream;
 import java.io.InputStreamReader;
 import java.util.ArrayList;
 import java.util.List;

 import org.apache.http.HttpEntity;
 import org.apache.http.HttpResponse;
 import org.apache.http.NameValuePair;
 import org.apache.http.client.HttpClient;
 import org.apache.http.client.entity.UrlEncodedFormEntity;
 import org.apache.http.client.methods.HttpPost;
 import org.apache.http.impl.client.DefaultHttpClient;
 import org.json.JSONArray;
 import org.json.JSONException;
 import org.json.JSONObject;

 import android.app.ListActivity;
 import android.net.ParseException;
 import android.os.Bundle;
 import android.widget.ArrayAdapter;
 import android.widget.Toast;

 public class Database_demo extends ListActivity {

/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {

    super.onCreate(savedInstanceState);

    String result = null;
    InputStream is = null;
    StringBuilder sb = null;
    ArrayList<NameValuePair> nameValuePairs = new ArrayList<NameValuePair>();
    List<String> r = new ArrayList<String>();

    try{

    //http post
    HttpClient httpclient = new DefaultHttpClient();
    HttpPost httppost = new HttpPost("http://uragon-dev.com/synergy/webservices.php?action=displayAll");
    httppost.setEntity(new UrlEncodedFormEntity(nameValuePairs));
    HttpResponse response = httpclient.execute(httppost);
    HttpEntity entity = response.getEntity();
    is = entity.getContent();
    }
    catch(Exception e){
        Toast.makeText(getBaseContext(),e.toString() ,Toast.LENGTH_LONG).show();
   }

    //Convert response to string  
    try
    {
      BufferedReader reader = new BufferedReader(new InputStreamReader(is,"UTF-8"));

      sb = new StringBuilder();

      String line = null;

      while ((line = reader.readLine()) != null) 
      {
         sb.append(line + "\n");
      }

      is.close();

      result = sb.toString();
    }
    catch(Exception e)
    {
        Toast.makeText(getBaseContext(),e.toString() ,Toast.LENGTH_LONG).show();
    }
    //END Convert response to string   
    try{
            JSONArray jArray = new JSONArray(result);
            JSONObject json_data=null;
            for(int i=0;i<jArray.length();i++)
            {
               json_data = jArray.getJSONObject(i);
               r.add(json_data.getString("users"));
           }
           setListAdapter(new ArrayAdapter<String>(this, android.R.layout.simple_expandable_list_item_1, r));
        }
        catch(JSONException e1){
            Toast.makeText(getBaseContext(),e1.toString() ,Toast.LENGTH_LONG).show();
        } catch (ParseException e1) {
            Toast.makeText(getBaseContext(),e1.toString() ,Toast.LENGTH_LONG).show();
    }

}
 }

logcat 中的错误指向这一行。

 try{
            JSONArray jArray = new JSONArray(result);

这是要在 url http://uragon-dev.com/synergy/webservices.php?action=displayAll 上获取的数据

{"users":[{"username":"jokerxvier","firstname":"jason","lastname":"javier"},{"username":"migz","firstname":"miguel","lastname":"rivera"}],"success":1}

造成这种情况的问题可能是什么?另外我想知道如何将数据传递给 url 而不仅仅是从中获取数据。 Android新手在这里。谢谢!

【问题讨论】:

    标签: php android mysql json nullpointerexception


    【解决方案1】:

    您说错误出现在JSONArray jArray = new JSONArray(result); 上。如果是这种情况,您可以尝试检查result 的值吗?或许可以使用Log 将其显示在Logcat 上。

    如果错误是NetworkOnMainThread,则需要查看@user2045570的答案

    希望对你有帮助,祝你好运

    里德

    【讨论】:

      【解决方案2】:

      你有几个问题。您尝试读取的 JSON 不是一个对象数组。所以代码应该是

      JSONObject result = new JSONObject(result);
      JSONArray users = result.getJSONArray("users");
      

      并且,请不要在主线程上打开网络连接。

      【讨论】:

      • 我遵循了您的回答,并在 logcat 上收到了这些消息。 shrib.com/logerror logcat 指向这个错误。 ` HttpResponse 响应 = httpclient.execute(httppost); `
      【解决方案3】:

      看起来您正在尝试在主线程上进行网络操作。看看这篇关于如何处理的帖子:https://stackoverflow.com/a/6343299/2045570

      阅读docs

      编辑:

      您收到 JSON 错误的原因是您遇到了第一个异常:这里

          try{
      
          //http post
          HttpClient httpclient = new DefaultHttpClient();
          HttpPost httppost = new HttpPost("http://uragon-dev.com/synergy/webservices.php?action=displayAll");
          httppost.setEntity(new UrlEncodedFormEntity(nameValuePairs));
          HttpResponse response = httpclient.execute(httppost);
          HttpEntity entity = response.getEntity();
          is = entity.getContent();
          }
          catch(Exception e){
              Toast.makeText(getBaseContext(),e.toString() ,Toast.LENGTH_LONG).show();
      
         }
      

      所以这里:

      JSONArray jArray = new JSONArray(result);
      

      result 将始终为空。这是您需要解决的第一个问题。您无法从主线程访问网络。

      要查看您的错误消息,请将此行:e.printStackTrace(); 添加到您的 catch 块中,它将在您的 logcat 输出中打印一个 android.os.NetworkOnMainThreadException

      【讨论】:

      • 我在 logcat 中得到这些错误 at org.json.JSONTokener.nextCleanInternal(JSONTokener.java:116) at org.json.JSONTokener.nextValue(JSONTokener.java:94) at org.json.JSONArray.&lt;init&gt;(JSONArray.java:87) at org.json.JSONArray.&lt;init&gt;(JSONArray.java:103) 是 json 部分错误吗?
      • @MiguelRivera 这正是我所说的。请在此处阅读此答案:stackoverflow.com/a/6343299/2045570
      • 所以我要创建一个新方法,就像链接中给出的那样?
      • 主线程上的网络绝对是一个问题,但在 Android 3.0 或 API 级别 11 上添加了该异常,因此如果您在较旧的 Android 版本上运行您的应用程序,您将不会收到 networkonMainThread 错误。
      • 我真的是这里的新手,所以非常感谢任何帮助。
      猜你喜欢
      • 2015-04-24
      • 2018-05-05
      • 1970-01-01
      • 1970-01-01
      • 2013-12-03
      • 2012-03-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多