Работа с StringIndexOutOfBoundsException, даже если указанное поле пустое - PullRequest
0 голосов
/ 13 июня 2019

enter image description here Я получаю сбой приложения, который происходит, когда я нажимаю кнопку "Отправить" в моем приложении для 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);
        }
    }

Logcat:

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)

Ответы [ 2 ]

0 голосов
/ 13 июня 2019

Работает как положено. Вы сделали ошибку. Вопрос в том, что вы не можете позвонить subString () для пустой строки. Но когда ваши поля пусты, согласно коду он попытается вызвать метод subString () для пустых значений.

Это может быть решено, как показано ниже.

if(date!=null && !date.isEmpty()){
     day = Integer.parseInt(date.substring(0, 2));
     month = Integer.parseInt(date.substring(3, 5)) - 1;
     year = Integer.parseInt(date.substring(6, 10));
}

Имейте в виду, что все способы следуют этим видам проверок каждый раз, когда ожидается ввод данных пользователем.

0 голосов
/ 13 июня 2019

Вы получаете исключение из-за этой строки:

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

Второй параметр больше длины строки, поэтому метод 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 символов.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...