3therk1ll
3therk1ll

Reputation: 2441

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) 

Upvotes: 2

Views: 2175

Answers (3)

Rediska
Rediska

Reputation: 1470

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

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

Upvotes: 1

v.ladynev
v.ladynev

Reputation: 19986

Use this helper method to convert string to integer

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

Something like this

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

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

Upvotes: 3

em_
em_

Reputation: 2279

Looking through the error log it shows you're trying to parse a blank string to an int.

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

InvocationTargetException is just a wrapper for an exception that's thrown within a dynamic invocation.

The exceptions are thrown because you're try catching around the wrong snippet of code.

Upvotes: 0

Related Questions