android - 即使指定字段为空也处理 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)
解决方案
由于这一行,您会遇到异常:
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
我会在操作之前检查字符串的长度。由于您hint
有DD/MM/YYYY
格式,您应该确保字符串包含 10 个字符。
推荐阅读
- php - 如何调试错误“已弃用:curl_setopt():”
- typescript - 打字稿是类型检查不包含的文件吗?
- tcl - tcl 脚本中的命令名无效
- c - 以结构为输入参数的 C 代码的 FMU 导出
- oracle - pl/sql 函数中的多个查询
- data-structures - 如何在不需要分配新变量的情况下为链表实现前置?
- javascript - Reactjs 组件`this.state` 未定义
- opencv - 使用 OpenCV4Android 还是运行基于 Python 的 openCV 代码?
- linux - 如何制作一个可以使用 shell 脚本过滤文件的提示过滤器?
- php - PHP RESTful API 未获取变量并崩溃