【问题标题】:Unable to start activity ComponentInfo: java.lang.NullPointerException无法启动活动 ComponentInfo:java.lang.NullPointerException
【发布时间】:2012-02-09 09:13:13
【问题描述】:

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);
        }


    }

【问题讨论】:

  • 你能发布完整的堆栈跟踪吗?
  • 在您的LogCat 中,查看最后几行red 行,这将为您提供导致崩溃的确切java 文件的准确行号。它的内容类似于Dalvik... NullPointerException caused by...
  • 对不起,伙计们..我有一个问题: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, 检查") ; else Log.d("", "abul, not checked") ; } } );
  • 布局中是否定义了R.id.xtra
  • 用更新的问题编辑您的问题。

标签: android checkboxlist


【解决方案1】:

我们的应用运行良好,但突然遇到 NullPointerExceptionUnable to start activity 等错误。

基本上NullPointerException无法启动Activity发生在我们Activity的onCreate()方法出现问题时。

这发生在:

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

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

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

解决方案:

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

  2. 给出唯一的命名

【讨论】:

    【解决方案2】:

    紧随其后:
    TextView txt=(TextView)findViewById(R.id.xtra);

    ...添加这个:
    if (txt == null) { Log.w("", "TextView is null"); }

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

    【讨论】:

    • 永远不要这样做。您不需要使用空检查来包装所有 findViewByIds。如果 ID 已从布局中删除,则应更改代码以反映这一点。
    • 同意,更新代码以反映更改是迄今为止最好的方法。但是,如果错过了这样的错误,则值得考虑潜在的影响——如果没有空检查,应用程序最终可能无法使用,每次用户尝试加载特定页面时都会崩溃,与空检查相比,应用程序很可能会保留运行与视觉错误。是否使用空值检查模式的决定可能会受到一个人是否正在开发单独的项目以及是否拥有完整的 QA 支持以确保完整的应用程序稳定性的影响。
    【解决方案3】:

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

    【讨论】:

      猜你喜欢
      • 2023-03-16
      • 2012-12-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-07-08
      • 2012-11-23
      • 2017-09-19
      相关资源
      最近更新 更多