无法启动活动ComponentInfo:java.lang.NullPointerException

时间:2012-02-09 09:13:13

标签: android checkboxlist

Exception

Unable to start activity ComponentInfo{com.scytec.datamobile.vd.gui.android/com.scytec.datamobile.vd.gui.android.SelectedList}: java.lang.NullPointerException.. 我只想显示复选框列表视图,并在每次检查时显示“已检查”,但我不知道为什么这会给我一个例外。

public class SelectedList extends Activity implements IObserver{

        private ListView machine_listview;
        ArrayAdapter<String> adapter;
        ArrayList<String> arrayListofMachines;
        ArrayList<String> arrayListofMachineNumbers;
        Vector<MDCMachineStatus> machineStatus_vector;
        Handler handler;

        private static int oldPosition = 0;
        private Boolean firstClick = true;




        @Override
        protected void onCreate(Bundle savedInstanceState) {
            // TODO Auto-generated method stub
            super.onCreate(savedInstanceState);
            setContentView(R.layout.machinelistview);

            machine_listview = (ListView) findViewById(R.id.machine_listview);
            machine_listview.setFastScrollEnabled(true);

            MachineStatusSingleton.Register(this);

            getData();

            adapter = new ArrayAdapter<String>(SelectedList.this, R.layout.selectedlist,R.id.text1, arrayListofMachines);

            machine_listview.setAdapter(adapter);

            machine_listview.setSelection(oldPosition);


            CheckBox chk=(CheckBox)findViewById(R.id.check);
            chk.setOnCheckedChangeListener(new OnCheckedChangeListener()
            {

       public void onCheckedChanged(CompoundButton arg0, boolean arg1) {
        TextView txt=(TextView)findViewById(R.id.xtra);
        if (arg1)
            Log.d("", "abul, checked") ;
        else
             Log.d("", "abul, not checked") ;

       }

            }
            );


            machine_listview.setOnItemClickListener(new OnItemClickListener() {

                public void onItemClick(AdapterView<?> arg0, View arg1, int position,
                        long arg3) {
                    // TODO Auto-generated method stub
                    oldPosition = position;
                    MachineStatusSingleton.setMachineNumber(arrayListofMachineNumbers.get(position));
                    SelectedList.this.finish();


                }

            });


            handler = new Handler(){
                public void handleMessage(android.os.Message msg) {


                    machine_listview.setAdapter(adapter);
                    adapter.notifyDataSetChanged();

                };
            };






        }

        public void Update(ISubject arg0) {
            // TODO Auto-generated method stub
        }

        @Override
        public void onDestroy()
        {
            super.onDestroy();

            MachineStatusSingleton.Unregister(this);
        }

        private void getData(){
            machineStatus_vector = MachineStatusSingleton.GetData();
            arrayListofMachines = new ArrayList<String>();
            arrayListofMachineNumbers = new ArrayList<String>();
            for(MDCMachineStatus temp: machineStatus_vector){
                arrayListofMachines.add(temp.toString());
                arrayListofMachineNumbers.add(temp.getNumber());
            }

            Collections.sort(arrayListofMachines);
            Collections.sort(arrayListofMachineNumbers);

        }


        private void updateData(){
            getData();

            handler.sendEmptyMessage(0);
            adapter.notifyDataSetChanged();
            int index = machine_listview.getFirstVisiblePosition();
            View v = machine_listview.getChildAt(0);
            int top = (v == null) ? 0 : v.getTop();

            // ...

            // restore
            machine_listview.setSelectionFromTop(index, top);
        }


    }

3 个答案:

答案 0 :(得分:11)

我们运行我们的应用程序非常好,突然遇到 NullPointerException 无法启动活动等错误。

当我们的Activity的 onCreate()方法出现问题时,基本上会出现 NullPointerException 无法启动活动

发生在以下情况时:

  1. 我们更改与此活动相关的布局的任何xml值

  2. 如果我们没有在我们的Acivity中正确映射xml UI

  3. 尝试访问另一个布局文件中的UI。

  4. 解决方案:

    1. 首先交叉检查所有映射元素

    2. 提供唯一的命名

答案 1 :(得分:9)

直接之后:
TextView txt =(TextView)findViewById(R.id.xtra);

...加上这个:
if(txt == null){Log.w(“”,“TextView为null”); }

假设在您选中复选框之前未发生空指针异常,这听起来像是最可能的问题。当我忘记从XML布局中删除了相应的元素,或者我的ID出错时,我遇到了同样的问题。通常我会在null检查中对“findViewById”返回的元素进行任何操作,以确保即使检索失败,应用程序也至少不会崩溃。

答案 2 :(得分:1)

在您声明时,您似乎正在通过调用chk分配给txt,然后分配findViewById。我必须先声明它们,然后使用findViewById分配给它们。