【问题标题】:Android Error while filling Array inside AsyncTask在 AsyncTask 中填充数组时出现 Android 错误
【发布时间】:2014-04-03 04:22:55
【问题描述】:

我想填充一个数组,以便将结果附加到 TextView,但应用程序不断崩溃:

04-02 23:45:29.286: E/AndroidRuntime(6620): FATAL EXCEPTION: AsyncTask #3
04-02 23:45:29.286: E/AndroidRuntime(6620): java.lang.RuntimeException: An error occured while executing doInBackground()
04-02 23:45:29.286: E/AndroidRuntime(6620):     at android.os.AsyncTask$3.done(AsyncTask.java:200)
04-02 23:45:29.286: E/AndroidRuntime(6620):     at java.util.concurrent.FutureTask$Sync.innerSetException(FutureTask.java:274)
04-02 23:45:29.286: E/AndroidRuntime(6620):     at java.util.concurrent.FutureTask.setException(FutureTask.java:125)
04-02 23:45:29.286: E/AndroidRuntime(6620):     at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:308)
04-02 23:45:29.286: E/AndroidRuntime(6620):     at java.util.concurrent.FutureTask.run(FutureTask.java:138)
04-02 23:45:29.286: E/AndroidRuntime(6620):     at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1088)
04-02 23:45:29.286: E/AndroidRuntime(6620):     at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:581)
04-02 23:45:29.286: E/AndroidRuntime(6620):     at java.lang.Thread.run(Thread.java:1019)
04-02 23:45:29.286: E/AndroidRuntime(6620): Caused by: java.lang.NullPointerException
04-02 23:45:29.286: E/AndroidRuntime(6620):     at com.gettford.community.MessageActivity$Mensajes.doInBackground(MessageActivity.java:166)
04-02 23:45:29.286: E/AndroidRuntime(6620):     at com.gettford.community.MessageActivity$Mensajes.doInBackground(MessageActivity.java:1)
04-02 23:45:29.286: E/AndroidRuntime(6620):     at android.os.AsyncTask$2.call(AsyncTask.java:185)
04-02 23:45:29.286: E/AndroidRuntime(6620):     at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:306)
04-02 23:45:29.286: E/AndroidRuntime(6620):     ... 4 more

我有两个字符串:

public String[] mensa;
public String[] NomUsuario;

然后我在 doInBackround 中执行 AsynTask:

// Retrieve JSON Objects from the given URL address
            jsonobject = JSONfunctions
                    .getJSONfromURL("http://www.gettford.net/comunidad/api/chat_conv.php?user="+usuarioID+"&id="+idsala);

            try {
                // Locate the array name in JSON

                jsonarray = jsonobject.getJSONArray("lista");

                for (int i = 0; i < jsonarray.length(); i++) {
                    //HashMap<String, String> map = new HashMap<String, String>();
                    jsonobject  = jsonarray.getJSONObject(i);

                    // Retrive JSON Objects
                    //usuario = jsonobject.getString("Nombre");
                    mensa[i] = jsonobject.getString("mensaje");
                    NomUsuario[i] = jsonobject.getString("NomUsuario");
                    Log.i("mensaje",mensa[i]);

                }
            } catch (JSONException e) {
                Log.e("Error", e.getMessage());
                e.printStackTrace();
            }
            return null;
        }

        @Override
        protected void onPostExecute(Void args) {
            lblMessage.setText("");
            for (int i= 0; i < mensa.length; i++){
            lblMessage.append(NomUsuario[i]+": "+mensa[i] + "\n");
            }
        }

给出错误的行是这一行:

mensa[i] = jsonobject.getString("mensaje");

感谢帮助

谢谢!

【问题讨论】:

  • 是这个mensa[i] = jsonobject.getString("mensaje");
  • 你还没有初始化 mensa 只是将它声明为 public String[] mensa;

标签: java android arrays android-asynctask


【解决方案1】:

您只是忘记初始化 Array 变量。在 try 块开始时,您需要初始化 Array 变量,如下所示,

try {
            // Locate the array name in JSON 
           mensa = new String[jsonarray.length()]; // Add this line.
           NomUsuario = new String[jsonarray.length()]; // Add this line.

【讨论】:

    【解决方案2】:

    您应该在 for 循环之前添加 mensa = new String[jsonarray.length()]。

    【讨论】:

    • 谢谢,具体怎么做?我虽然它是由 mensa[i] = jsonobject.getString("mensaje");
    • @DouglasRoos 查看文档docs.oracle.com/javase/tutorial/java/nutsandbolts/arrays.html,最好使用列表
    • @DouglasRoos ,在该行中,您正在向未初始化的数组添加值,因为您得到了一个空指针。
    • 你也应该启动 NomUsuario。@DouglasRoos
    • 谢谢,是的,现在正在工作,太好了,非常感谢您的帮助。我不知道如何在谷歌上寻找它。与它战斗了将近 2 个小时
    【解决方案3】:

    您尚未初始化任何数组。

    jsonarray = jsonobject.getJSONArray("lista");
    
    if (jsonarray.length() > 0) {
    // Initialized both array if the size of that JSONArray is grater then 0
    mensa = new String[jsonarray.length()]
    NomUsuario= new String[jsonarray.length()]
    
        for (int i = 0; i < jsonarray.length(); i++) {
            jsonobject  = jsonarray.getJSONObject(i);
            mensa[i] = jsonobject.getString("mensaje");
            NomUsuario[i] = jsonobject.getString("NomUsuario");
            Log.i("mensaje",mensa[i]);
        }
    }
    

    【讨论】:

      【解决方案4】:

      试试这个..

      把mensa和NomUsuario初始化String数组大小放在for循环之前

      mensa = new String[jsonarray.length()];
      NomUsuario = new String[jsonarray.length()];
      for (int i = 0; i < jsonarray.length(); i++) {
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-04-08
        • 2014-04-05
        • 2018-06-16
        相关资源
        最近更新 更多