当我选择单选按钮时,我的应用程序崩溃了。

3

我有三个单选按钮,每个单选按钮都执行一些操作。使用这些单选按钮,我正在过滤我的结果。例如,对于RB1,按日期排序;对于RB2,按客户名称排序;对于RB3,按产品名称排序。

以上两个单选按钮(RB2和RB3)运行良好,但当我选择RB3(按日期排序)时,我的应用程序崩溃了。

final RadioGroup rgroup = (RadioGroup)findViewById(R.id.radioType);
        final RadioButton Ta = (RadioButton)findViewById(R.id.type_a);
        final RadioButton Tb = (RadioButton)findViewById(R.id.type_b);
        final RadioButton Tc = (RadioButton)findViewById(R.id.type_c);
        rgroup.setOnCheckedChangeListener(new RadioGroup.OnCheckedChangeListener()     {
            @Override
            public void onCheckedChanged(RadioGroup group, int checkedId) {
                if (rgroup.getCheckedRadioButtonId() == Ta.getId()) {
                    cus_names = listItems.get(cus_name.getSelectedItemPosition());
                    btn1.setVisibility(View.VISIBLE);
                    btn2.setVisibility(View.VISIBLE);
                    created_date1.setVisibility(View.VISIBLE);
                    created_date2.setVisibility(View.VISIBLE);
                    cus_name.setVisibility(View.GONE);
                    po_id.setVisibility(View.GONE);
                }
                else if (rgroup.getCheckedRadioButtonId() == Tb.getId()) {
                    cus_name.setSelection(0);
                    cus_name.setVisibility(View.VISIBLE);
                    btn1.setVisibility(View.GONE);
                    btn2.setVisibility(View.GONE);
                    created_date1.setVisibility(View.GONE);
                    created_date2.setVisibility(View.GONE);
                    po_id.setVisibility(View.GONE);
                }
                else if (rgroup.getCheckedRadioButtonId() == Tc.getId()) {
                    po_id.setSelection(0);
                    po_id.setVisibility(View.VISIBLE);
                    btn1.setVisibility(View.GONE);
                    btn2.setVisibility(View.GONE);
                    created_date1.setVisibility(View.GONE);
                    created_date2.setVisibility(View.GONE);
                    cus_name.setVisibility(View.GONE);
                }
            }
        });

我的日志:

07-28 11:47:53.243 13244-13244/com.example.Minal E/AndroidRuntime: FATAL EXCEPTION: main
Process: com.example.Minal, PID: 13244
java.lang.ArrayIndexOutOfBoundsException: length=0; index=-1
    at java.util.ArrayList.get(ArrayList.java:310)
    at com.example.Minal.Purchase_Pending$1.onCheckedChanged(Purchase_Pending.java:180)
    at android.widget.RadioGroup.setCheckedId(RadioGroup.java:173)
    at android.widget.RadioGroup.-wrap0(RadioGroup.java)
    at android.widget.RadioGroup$CheckedStateTracker.onCheckedChanged(RadioGroup.java:351)
    at android.widget.CompoundButton.setChecked(CompoundButton.java:159)
    at android.widget.CompoundButton.toggle(CompoundButton.java:115)
    at android.widget.RadioButton.toggle(RadioButton.java:76)
    at android.widget.CompoundButton.performClick(CompoundButton.java:120)
    at android.view.View$PerformClick.run(View.java:21147)
    at android.os.Handler.handleCallback(Handler.java:739)
    at android.os.Handler.dispatchMessage(Handler.java:95)
    at android.os.Looper.loop(Looper.java:148)
    at android.app.ActivityThread.main(ActivityThread.java:5417)
    at java.lang.reflect.Method.invoke(Native Method)
    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:726)
    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:616)

2
cus_name.getSelectedItemPosition() 返回了负数1,而且你的列表为空。有两个问题。 - OneCricketeer
1
cus_names = listItems.get(cus_name.getSelectedItemPosition()); 检查你的listItems大小 - Pavya
是的,我的列表为空,你说得对 @cricket_007,因为我的数据库中没有数据。如何处理这种情况? - AndroidBoy
我的列表大小为空 @Pravin - AndroidBoy
1
这就是为什么你会得到ArrayIndexOutOfBoundsException异常的原因。 - Pavya
显示剩余3条评论
2个回答

2
在你的情况下,原因是 cus_name.getSelectedItemPosition() 返回 -1(它不是你的listItem的索引),而且你的listItem大小为0。
因此,在获取值之前,你应该检查两者以防止出现 ArrayIndexOutOfBoundsException 错误。
if(cus_name.getSelectedItemPosition() > -1 && cus_name.getSelectedItemPosition() < listItems.size()){
      cus_names = listItems.get(cus_name.getSelectedItemPosition());
}

希望这有所帮助。

我可以检查>0还是-1哪个更好吗?我认为-1更好,对吗? - AndroidBoy
1
我有一些案例给你。`你的列表中没有任何项目,cus_name.getSelectedItemPosition() = -1(错误)
  • 你的列表中没有任何项目,cus_name.getSelectedItemPosition() = 1(错误)
  • 你的列表中有一个项目,cus_name.getSelectedItemPosition() = -1(错误)
  • 你的列表中有一个项目,cus_name.getSelectedItemPosition() = 1(错误)
    你的列表中有一个项目,cus_name.getSelectedItemPosition() = 0(正确)`
- Linh
所以我将使用-1。 - AndroidBoy
@AndroidBoy 测试一下这个案例:your list have 1 item and cus_name.getSelectedItemPosition() = -1,如果使用我的代码或接受答案,我相信你会明白这个想法。 - Linh

1

您将下面的代码写在了错误的位置,因此当您得到空列表时,它会导致应用程序崩溃。

cus_names = listItems.get(cus_name.getSelectedItemPosition());

因此,请尝试以下代码以涵盖所有三个条件,而不仅仅是其中一个:

if(listItmes != null & listItems.size() > 0)
      cus_names = listItems.get(cus_name.getSelectedItemPosition());

数组下标越界异常:length=0;index=-1他的cus_name没有选择,所以有数据或没有数据都不会改变任何东西。 - AxelH

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接