1

Я изучаю курс Android онлайн и попал в камнем преткновения. Когда поле EditText (Number) отправляется без какого-либо контента, мое приложение выходит из строя. Я пытался добавить обработчики исключений в код, насколько я понимаю. Орех у меня все еще такая же проблема. Я обрабатываю исключения, которые отображаются в моих журналах, как показано ниже. Флаги ввода InvocationTargetException в Android Studio как Cannot resolve symbol InvocationTargetException. Я не уверен, в чем проблема с этим, или если это может быть связано.Обработка исключений Android на EditText

Код:

package com.example.richardcurteis.higherorlower; 

import android.os.Bundle; 
import android.support.design.widget.FloatingActionButton; 
import android.support.design.widget.Snackbar; 
import android.support.v7.app.AppCompatActivity; 
import android.support.v7.widget.Toolbar; 
import android.view.View; 
import android.view.Menu; 
import android.view.MenuItem; 
import android.widget.EditText; 
import android.widget.Toast; 

import java.lang.reflect.Method; 
import java.util.Random; 

public class MainActivity extends AppCompatActivity { 

    int randomNumber; 
    EditText getUserInput; 

    public int getRandomNumber() { 
     Random randomGenerator = new Random(); 
     randomNumber = randomGenerator.nextInt(10) +1; 
     return randomNumber; 
    } 

    public void higherOrLower(View view) { 
     String exceptionMessage = ""; 
     try { 
      getUserInput = (EditText) findViewById(R.id.userInput); 
     } catch (InvocationTargetException e) { 
      exceptionMessage = "InvocationTargetException"; 
     } catch (NumberFormatException e) { 
      exceptionMessage = "NumberFormatException"; 
     } catch (IllegalStateException e) { 
      exceptionMessage = "IllegalStateException"; 
     } 

     Toast.makeText(this, exceptionMessage, Toast.LENGTH_LONG).show(); 

     int userInteger = Integer.parseInt(getUserInput.getText().toString()); 

     String message = ""; 

     if (userInteger > randomNumber) { 
      message = "Lower!"; 
      getUserInput.getText().clear(); 
     } else if (userInteger < randomNumber) { 
      message = "Higher!"; 
      getUserInput.getText().clear(); 
     } else { 
      message = "You win!"; 
      getUserInput.getText().clear(); 
      getRandomNumber(); 
     } 

     Toast.makeText(getApplicationContext(), message, Toast.LENGTH_SHORT).show(); 

    } 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_main); 
     Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar); 
     setSupportActionBar(toolbar); 

     FloatingActionButton fab = (FloatingActionButton) findViewById(R.id.fab); 
     fab.setOnClickListener(new View.OnClickListener() { 
      @Override 
      public void onClick(View view) { 
       Snackbar.make(view, "Replace with your own action", Snackbar.LENGTH_LONG) 
         .setAction("Action", null).show(); 
      } 
     }); 

     randomNumber = getRandomNumber(); 
    } 

    @Override 
    public boolean onCreateOptionsMenu(Menu menu) { 
     // Inflate the menu; this adds items to the action bar if it is present. 
     getMenuInflater().inflate(R.menu.menu_main, menu); 
     return true; 
    } 

    @Override 
    public boolean onOptionsItemSelected(MenuItem item) { 
     // Handle action bar item clicks here. The action bar will 
     // automatically handle clicks on the Home/Up button, so long 
     // as you specify a parent activity in AndroidManifest.xml. 
     int id = item.getItemId(); 

     //noinspection SimplifiableIfStatement 
     if (id == R.id.action_settings) { 
      return true; 
     } 

     return super.onOptionsItemSelected(item); 
    } 
} 

Ошибки:

12-28 16:36:23.985 5035-5035/com.example.richardcurteis.higherorlower E/AndroidRuntime: FATAL EXCEPTION: main 
                         Process: com.example.richardcurteis.higherorlower, PID: 5035 
                         java.lang.IllegalStateException: Could not execute method for android:onClick 
                          at android.support.v7.app.AppCompatViewInflater$DeclaredOnClickListener.onClick(AppCompatViewInflater.java:275) 
                          at android.view.View.performClick(View.java:5198) 
                          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) 
                         Caused by: java.lang.reflect.InvocationTargetException 
                          at java.lang.reflect.Method.invoke(Native Method) 
                          at android.support.v7.app.AppCompatViewInflater$DeclaredOnClickListener.onClick(AppCompatViewInflater.java:270) 
                          at android.view.View.performClick(View.java:5198)  
                          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)  
                         Caused by: java.lang.NumberFormatException: Invalid int: "" 
                          at java.lang.Integer.invalidInt(Integer.java:138) 
                          at java.lang.Integer.parseInt(Integer.java:358) 
                          at java.lang.Integer.parseInt(Integer.java:334) 
                          at com.example.richardcurteis.higherorlower.MainActivity.higherOrLower(MainActivity.java:40) 
                          at java.lang.reflect.Method.invoke(Native Method)  
                          at android.support.v7.app.AppCompatViewInflater$DeclaredOnClickListener.onClick(AppCompatViewInflater.java:270)  
                          at android.view.View.performClick(View.java:5198)  
                          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)  

ответ

1

Переместить в блок "попробовать" эту строку кода:

int userInteger = Integer.parseInt(getUserInput.getText().toString()); 
0

Просматривая журнал ошибок, это показывает, что вы пытаетесь разобрать пустую строку в int.

Caused by: java.lang.NumberFormatException: Invalid int: "" 

InvocationTargetException - это всего лишь оболочка для исключения, которое выбрасывается в динамический вызов.

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

3

Используйте этот вспомогательный метод для преобразования строки в целое

public static Integer toInteger(final String str, final Integer defaultValue) { 
      if (str == null) { 
       return defaultValue; 
      } 
      try { 
       return Integer.valueOf(str); 
      } catch (NumberFormatException nfe) { 
       return defaultValue; 
      } 
     } 

Что-то вроде этого

Integer userInteger = toInteger(getUserInput.getText().toString(), null); 

if (userInteger == null) { 
    Toast.makeText(getApplicationContext(), "Invalid input", Toast.LENGTH_SHORT).show(); 
    return; 
}