Search code examples
javaandroidexceptioninvocationtargetexception

Android Exception handling on EditText


I am going through an Android course online and have hit a stumbling block. When an EditText (Number) field is submitted without any content, my app crashes. I have tried adding exception handlers to the code, to my understanding. Nut I still have the same problem. I am handling the exceptions that show up in my logs, shown below. The InvocationTargetException entry flags in Android Studio as Cannot resolve symbol InvocationTargetException. I'm not sure what the problem is with that or if it might be related.

Code:

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);
    }
}

Errors:

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) 

Solution

  • Move into the "try" block this line of your code:

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