首页 > 解决方案 > 即使指定字段为空也处理 StringIndexOutOfBoundsException

问题描述

在此处输入图像描述当我按下我的 android 应用程序的提交按钮时,我遇到了一个应用程序崩溃。该应用程序处理发送输入的数据以作为事件添加到用户的日历中。仅当日期字段为空时,应用程序才会崩溃。我注意到存储日期拆分部分的变量存在 java.lang.StringIndexOutOfBoundsException。我尝试评论日期字段数据输入,然后应用程序工作。

如果上述字段为空,为什么会发生此异常?

任何修复将不胜感激。

代码:

public void onClick(View view) {

        TextInputEditText textInputEditTextDate = (TextInputEditText) findViewById(R.id.date);
        EditText editTextTitle = (EditText) findViewById(R.id.title);
        EditText editTextDesc = (EditText) findViewById(R.id.desc);
        EditText editTextLocation = (EditText) findViewById(R.id.location);
        titl = editTextTitle.getText().toString();
        desc = editTextDesc.getText().toString();
        location = editTextLocation.getText().toString();
        date = textInputEditTextDate.getText().toString();
        day = Integer.parseInt(date.substring(0, 2));
        month = Integer.parseInt(date.substring(3, 5)) - 1;
        year = Integer.parseInt(date.substring(6, 10));

        if (titl.isEmpty() || desc.isEmpty() || location.isEmpty() || date.isEmpty()) {
            Toast.makeText(this, "No information", Toast.LENGTH_SHORT).show();
        } else {
            Intent calendarIntent = new Intent(Intent.ACTION_INSERT, CalendarContract.Events.CONTENT_URI);
            calendarIntent.putExtra(CalendarContract.Events.TITLE, titl);
            calendarIntent.putExtra(CalendarContract.Events.EVENT_LOCATION, location);
            calendarIntent.putExtra(CalendarContract.Events.DESCRIPTION, desc);
            calendarIntent.putExtra(CalendarContract.Reminders.METHOD, CalendarContract.Reminders.METHOD_DEFAULT);
            calendarIntent.putExtra(CalendarContract.Reminders.MINUTES, 1);
            calendarIntent.putExtra(String.valueOf(CalendarContract.Reminders.METHOD_ALERT), "1");
            GregorianCalendar date = new GregorianCalendar(year, month, day);
            calendarIntent.putExtra(CalendarContract.EXTRA_EVENT_BEGIN_TIME, date.getTimeInMillis());
            calendarIntent.putExtra(CalendarContract.EXTRA_EVENT_END_TIME, date.getTimeInMillis());
            startActivity(calendarIntent);
        }
    }

日志猫:

Process: com.cypherlabs.calendarapp, PID: 32057
    java.lang.IllegalStateException: Could not execute method for android:onClick
        at android.support.v7.app.AppCompatViewInflater$DeclaredOnClickListener.onClick(AppCompatViewInflater.java:390)
        at android.view.View.performClick(View.java:7333)
        at android.widget.TextView.performClick(TextView.java:14160)
        at android.view.View.performClickInternal(View.java:7299)
        at android.view.View.access$3200(View.java:846)
        at android.view.View$PerformClick.run(View.java:27773)
        at android.os.Handler.handleCallback(Handler.java:873)
        at android.os.Handler.dispatchMessage(Handler.java:99)
        at android.os.Looper.loop(Looper.java:214)
        at android.app.ActivityThread.main(ActivityThread.java:6981)
        at java.lang.reflect.Method.invoke(Native Method)
        at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:493)
        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1445)
     Caused by: java.lang.reflect.InvocationTargetException
        at java.lang.reflect.Method.invoke(Native Method)
        at android.support.v7.app.AppCompatViewInflater$DeclaredOnClickListener.onClick(AppCompatViewInflater.java:385)
        at android.view.View.performClick(View.java:7333) 
        at android.widget.TextView.performClick(TextView.java:14160) 
        at android.view.View.performClickInternal(View.java:7299) 
        at android.view.View.access$3200(View.java:846) 
        at android.view.View$PerformClick.run(View.java:27773) 
        at android.os.Handler.handleCallback(Handler.java:873) 
        at android.os.Handler.dispatchMessage(Handler.java:99) 
        at android.os.Looper.loop(Looper.java:214) 
        at android.app.ActivityThread.main(ActivityThread.java:6981) 
        at java.lang.reflect.Method.invoke(Native Method) 
        at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:493) 
        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1445) 
     Caused by: java.lang.StringIndexOutOfBoundsException: length=0; index=2
        at java.lang.String.substring(String.java:2032)
        at com.cypherlabs.calendarapp.MainActivity.onClick(MainActivity.java:34)
        at java.lang.reflect.Method.invoke(Native Method) 
        at android.support.v7.app.AppCompatViewInflater$DeclaredOnClickListener.onClick(AppCompatViewInflater.java:385) 
        at android.view.View.performClick(View.java:7333) 
        at android.widget.TextView.performClick(TextView.java:14160) 
        at android.view.View.performClickInternal(View.java:7299) 
        at android.view.View.access$3200(View.java:846) 
        at android.view.View$PerformClick.run(View.java:27773) 
        at android.os.Handler.handleCallback(Handler.java:873) 
        at android.os.Handler.dispatchMessage(Handler.java:99) 
        at android.os.Looper.loop(Looper.java:214) 
        at android.app.ActivityThread.main(ActivityThread.java:6981) 
        at java.lang.reflect.Method.invoke(Native Method) 
        at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:493) 
        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1445)

标签: androidcrash

解决方案


由于这一行,您会遇到异常:

day = Integer.parseInt(date.substring(0, 2));

第二个参数大于字符串的长度,因此该substring方法抛出异常。

这是 substring 方法,您可以在其中检查它抛出异常的原因:

public String substring(int beginIndex, int endIndex) {
        if (beginIndex < 0) {
            throw new StringIndexOutOfBoundsException(this, beginIndex);
        }
        if (endIndex > length()) {
            throw new StringIndexOutOfBoundsException(this, endIndex);
        }
        int subLen = endIndex - beginIndex;
        if (subLen < 0) {
            throw new StringIndexOutOfBoundsException(subLen);
        }

        return ((beginIndex == 0) && (endIndex == length())) ? this
                : fastSubstring(beginIndex, subLen);
}

date我会在操作之前检查字符串的长度。由于您hintDD/MM/YYYY格式,您应该确保字符串包含 10 个字符。


推荐阅读