FATAL EXCEPTION:将字符串转换为int时的主java.util.ArrayOutOfBoundsException

时间:2015-03-24 00:15:00

标签: java android

我有一个包含编辑文本的对话框片段。这些编辑文本将允许用户输入有关事件的信息,即eventName,eventStartDate,eventStartTime,eventEndDate和eventEndTime。

单击“添加”或“正”按钮时,日期和时间的信息将作为字符串获取,然后将这些字符串拆分,以便将信息作为单个变量获取。然后将这些变量转换为int值。

然后我希望将这些int值放入我设置的SQLiteDatabase中。所以我将值传递给insertRow()方法。

这是DialogFragment类:

private class EventDetailsDialogFragment
{
    public Dialog onCreateDialogFragment(final Bundle savedInstanceState, Calendar time)
    {
        AlertDialog.Builder builder = new AlertDialog.Builder(MainActivity.this);

        LayoutInflater inflater = MainActivity.this.getLayoutInflater();

        builder.setView(inflater.inflate(R.layout.dialog_event_details, null));
        builder.setTitle("Empty time clicked:\n" + String.valueOf(time.getTime()))
               .setPositiveButton("Add", new DialogInterface.OnClickListener()
               {
                    @Override
                    public void onClick(DialogInterface dialog, int which)
                    {
                        String name = "";
                        int startYear, startMonth, startDay, startHour, startMinute;
                        int endYear, endMonth, endDay, endHour, endMinute;

                        EditText eventName = (EditText)findViewById(R.id.editTextEventName);
                        EditText eventStartDate = (EditText) findViewById(R.id.editTextEventStartDate);
                        EditText eventStartTime = (EditText) findViewById(R.id.editTextEventStartTime);
                        EditText eventEndDate = (EditText) findViewById(R.id.editTextEventEndDate);
                        EditText eventEndTime = (EditText) findViewById(R.id.editTextEventEndTime);

                        String [] startDate = String.valueOf(eventStartDate).split("/");
                        String [] startTime = String.valueOf(eventStartTime).split(":");
                        String [] endDate = String.valueOf(eventEndDate).split("/");
                        String [] endTime = String.valueOf(eventEndTime).split(":");

                        name = String.valueOf(eventName);

                        startYear = Integer.parseInt(startDate[2]);
                        startMonth = Integer.parseInt(startDate[1]);
                        startDay = Integer.parseInt(startDate[0]);
                        startHour = Integer.parseInt(startTime[0]);
                        startMinute = Integer.parseInt(startTime[1]);

                        endYear = Integer.parseInt(endDate[2]);
                        endMonth = Integer.parseInt(endDate[1]);
                        endDay = Integer.parseInt(endDate[0]);
                        endHour = Integer.parseInt(endTime[0]);
                        endMinute = Integer.parseInt(endTime[1]);


                        long newId = myDatabase.insertRow(name, startYear, startMonth, startDay, startHour,
                                startMinute, endYear, endMonth, endDay, endHour, endMinute);
                    }
                }).setNeutralButton("Show Events", new DialogInterface.OnClickListener() {
                      @Override
                      public void onClick(DialogInterface dialog, int which)
                      {
                          Cursor cursor = myDatabase.getAllRows();
                          displayRecordSet(cursor);
                      }
                })
                .setNegativeButton("Cancel", new DialogInterface.OnClickListener() {
                    @Override
                    public void onClick(DialogInterface dialog, int which) {

                    }
                }).show();
        return builder.create();
    }
}

当我进入应用程序并弹出对话框时,我输入了一个事件的信息。例如,(Database Systems Exam,04/03 / 2015,15:00,04 / 03 / 2015,17:30)。然后,当单击添加按钮时,应用程序将停止工作。

我进入了LogCat,这是它给我的错误:

03-23 20:03:08.676: E/AndroidRuntime(816): FATAL EXCEPTION: main
03-23 20:03:08.676: E/AndroidRuntime(816): java.lang.ArrayIndexOutOfBoundsException: length=1; index=2
03-23 20:03:08.676: E/AndroidRuntime(816):  at com.example.davidnkanga.sample.MainActivity$EventDetailsDialogFragment$3.onClick(MainActivity.java:174)
03-23 20:03:08.676: E/AndroidRuntime(816):  at com.android.internal.app.AlertController$ButtonHandler.handleMessage(AlertController.java:166)
03-23 20:03:08.676: E/AndroidRuntime(816):  at android.os.Handler.dispatchMessage(Handler.java:99)
03-23 20:03:08.676: E/AndroidRuntime(816):  at android.os.Looper.loop(Looper.java:137)
03-23 20:03:08.676: E/AndroidRuntime(816):  at android.app.ActivityThread.main(ActivityThread.java:5103)
03-23 20:03:08.676: E/AndroidRuntime(816):  at java.lang.reflect.Method.invokeNative(Native Method)
03-23 20:03:08.676: E/AndroidRuntime(816):  at java.lang.reflect.Method.invoke(Method.java:525)
03-23 20:03:08.676: E/AndroidRuntime(816):  at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:737)
03-23 20:03:08.676: E/AndroidRuntime(816):  at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:553)
03-23 20:03:08.676: E/AndroidRuntime(816):  at dalvik.system.NativeStart.main(Native Method)

我主要活动的第174行是:

startYear = Integer.parseInt(startDate[2]);

我已经尝试了很多方法将字符串转换为int但无效。

2 个答案:

答案 0 :(得分:0)

这不是因为您正在将String转换为int。您的startDate数组的长度为1,但您正在从中访问索引2。因此,将数组的长度更改为您将在代码中访问的值。

以下是解决方案

EditText eventStartDate = (EditText) findViewById(R.id.editTextEventStartDate);

在上面一行中,eventStartDate引用了View,而不是该视图中的实际字符串数据(在您的情况下为日期)。所以你的数组startDate中只有一个元素。

String [] startDate = String.valueOf(eventStartDate).split("/");

用下面的

替换所有上述类型的行
String[] startDate = eventStartDate.getText().toString().split("/");

现在,您的数组中有3个元素符合预期。

答案 1 :(得分:0)

堆栈跟踪中的这一行:

java.lang.ArrayIndexOutOfBoundsException: length=1; index=2

假设您可以尝试访问索引2中的元素,但该数组只有一个元素(长度= 1)。