【问题标题】:NullPointerException in android activity [duplicate]android活动中的NullPointerException [重复]
【发布时间】:2014-06-24 09:32:27
【问题描述】:

我创建了一个名为activity_category的布局和一个名为CategoryActivity的活动,其代码如下

public class CategoryActivity extends Activity {
    private LazyItemLoadAdapter adapter;
    private int[] selectionId;
    private Item[] item_data;
    private GridView grid;
    private TextView textview;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        // TODO Auto-generated method stub
        super.onCreate(savedInstanceState);
        requestWindowFeature(Window.FEATURE_INDETERMINATE_PROGRESS);
        setContentView(R.layout.activity_category);

        ActionBarUtils.setActionBar(this);
        String id=getIntent().getExtras().getString("id");

        try{
            AsyncData data=new AsyncData();
            data.execute(Constants.SERVER+"cat_adlist.php?id="+id);

            grid = (GridView) findViewById(R.id.gridViewAllItems);
        }catch(NotFoundException n){

        }
    }

    private class AsyncData extends AsyncTask<String, Void, Item[]>{

        @Override
        protected void onPreExecute() {
            // TODO Auto-generated method stub
            super.onPreExecute();
            setProgressBarIndeterminateVisibility(true);
        }

        @Override
        protected Item[] doInBackground(String... params) {
            String str=null;
            try {
                str = CustomHttpClient
                        .executeHttpGet(params[0]);
                Log.i("Category Data", str);
                JSONArray array = new JSONArray(str);
                item_data = new Item[array.length()];
                selectionId = new int[array.length()];

                for (int i = 0; i < item_data.length; i++) {
                    JSONObject jdata = array.getJSONObject(i);
                    String path = Constants.THUMBS
                            + jdata.getString("name");
                    int itemid = jdata.getInt("id");
                    item_data[i] = new Item(itemid, path, jdata.getString("title"),
                            jdata.getString("price"));
                    selectionId[i] = jdata.getInt("subcategory_id");// change the
                                                                    // field name
                                                                    // here
                }

            }catch(JSONException j){

            } catch (Exception e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
            return item_data;
        }

        @Override
        protected void onPostExecute(Item[] result) {

            adapter = new LazyItemLoadAdapter(CategoryActivity.this, R.layout.text_below_images, result);

            grid.setAdapter(adapter);
            if (result.length == 0) {
                grid.setVisibility(View.GONE);
                textview.setVisibility(View.VISIBLE);
            } else {
                grid.setVisibility(View.VISIBLE);
                textview.setVisibility(View.GONE);
            }
            TextView numResults=(TextView) findViewById(R.id.textView2);
            numResults.setText("Found "+String.valueOf(result.length)+" results");
            setProgressBarIndeterminateVisibility(false);
            super.onPostExecute(result);
        }

    }
}

logcat如下-

05-07 17:09:58.340: E/AndroidRuntime(2242): FATAL EXCEPTION: main
05-07 17:09:58.340: E/AndroidRuntime(2242): Process: com.opaxlabs.salepurchase, PID: 2242
05-07 17:09:58.340: E/AndroidRuntime(2242): java.lang.NullPointerException
05-07 17:09:58.340: E/AndroidRuntime(2242):     at com.opaxlabs.salepurchase.CategoryActivity$AsyncData.onPostExecute(CategoryActivity.java:115)
05-07 17:09:58.340: E/AndroidRuntime(2242):     at com.opaxlabs.salepurchase.CategoryActivity$AsyncData.onPostExecute(CategoryActivity.java:1)
05-07 17:09:58.340: E/AndroidRuntime(2242):     at android.os.AsyncTask.finish(AsyncTask.java:632)
05-07 17:09:58.340: E/AndroidRuntime(2242):     at android.os.AsyncTask.access$600(AsyncTask.java:177)
05-07 17:09:58.340: E/AndroidRuntime(2242):     at android.os.AsyncTask$InternalHandler.handleMessage(AsyncTask.java:645)
05-07 17:09:58.340: E/AndroidRuntime(2242):     at android.os.Handler.dispatchMessage(Handler.java:102)
05-07 17:09:58.340: E/AndroidRuntime(2242):     at android.os.Looper.loop(Looper.java:136)
05-07 17:09:58.340: E/AndroidRuntime(2242):     at android.app.ActivityThread.main(ActivityThread.java:5017)
05-07 17:09:58.340: E/AndroidRuntime(2242):     at java.lang.reflect.Method.invokeNative(Native Method)
05-07 17:09:58.340: E/AndroidRuntime(2242):     at java.lang.reflect.Method.invoke(Method.java:515)
05-07 17:09:58.340: E/AndroidRuntime(2242):     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:779)
05-07 17:09:58.340: E/AndroidRuntime(2242):     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:595)
05-07 17:09:58.340: E/AndroidRuntime(2242):     at dalvik.system.NativeStart.main(Native Method)

如您所见,我收到了一个空指针异常。最初是因为我使用了错误的布局,但我已经更正了,但问题仍然存在。请帮我提出您的建议。提前致谢。

【问题讨论】:

  • 第 115 行是哪一个?
  • 写下一行 grid = (GridView) findViewById(R.id.gridViewAllItems);在执行异步任务之前
  • 代码中的哪一行是第 115 行(有问题的地方;又名 NULL 元素)。还有几点:在初始化网格变量之前运行 AsynTask; R.layout.text_below_images 存在吗? ...
  • 您需要学习如何调试您的应用程序。当在特定行引发 NullPointerException 时,这意味着该行上的一个元素永远不会被初始化。看看 Mat 提供的链接。
  • 第 115 行超出范围。没有115行,代码只有105行。

标签: java android json android-asynctask


【解决方案1】:

您忘记在 onPostExecute 方法中初始化 TextView textview

     @Override
    protected void onPostExecute(Item[] result) {

           TextView textview =(TextView) findViewById(R.id.textView2);
        adapter = new LazyItemLoadAdapter(CategoryActivity.this, R.layout.text_below_images, result);

        grid.setAdapter(adapter);
        if (result.length == 0) {
            grid.setVisibility(View.GONE);
            textview.setVisibility(View.VISIBLE); 
        } else {
            grid.setVisibility(View.VISIBLE);
            textview.setVisibility(View.GONE);
        }
       TextView numResults=(TextView) findViewById(R.id.textView2);
        numResults.setText("Found "+String.valueOf(result.length)+" results");
        setProgressBarIndeterminateVisibility(false);
        super.onPostExecute(result);
    }

【讨论】:

  • GridView 已初始化,但他使用的 TextView 不是:textview.setVisibility(View.VISIBLE);
  • 确实 textview 没有初始化。初始化它解决了这个问题。 @Android-Developer 你能发布你的回复,以便我可以选择它作为正确答案吗?
  • @Pankaj TextView 已初始化,但它在 onPostExecute 中无法获取 TextView,因为它是在 onPostExecute 方法中的 if 循环之后初始化的。
  • @GrIsHu 实际上有两个文本视图。如您所说,一个在 if 块之后初始化,另一个在 if 块中从未初始化。还是谢谢。
  • @Pankaj 这就是错误。我已经提到,在onCreate 中初始化所有视图总是更好
【解决方案2】:

首先,我认为您应该遵循的最佳做法是将代码组织成块。在setContentView() 之后初始化所有视图,无论何时使用它们。如果你开始这样做,你就不会像你所拥有的那样抛出异常。

您的代码中的问题是您没有初始化您的textView 变量并在AsyncTaskonPostExecute() 方法中使用它。你的onCreate 应该是这样的:

@Override
public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        requestWindowFeature(Window.FEATURE_INDETERMINATE_PROGRESS);
        setContentView(R.layout.activity_category);

        grid = (GridView) findViewById(R.id.gridViewAllItems);
        textview = (TextView) findViewById(R.id.myTextView);
        numResults = (TextView) findViewById(R.id.textView2);

        // Start your AsyncTask here ...

}

【讨论】:

    猜你喜欢
    • 2017-06-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-04-26
    • 2012-08-17
    • 2016-09-03
    相关资源
    最近更新 更多