1

我正在通過Android在線課程,並且遇到了絆腳石。 當沒有任何內容提交EditText(Number)字段時,我的應用程序崩潰。 我已經嘗試添加異常處理程序的代碼,以我的理解。堅果我仍然有同樣的問題。我正在處理顯示在我的日誌中的異常,如下所示。 Android Studio中的InvocationTargetException條目標記爲Cannot resolve symbol InvocationTargetException。 我不確定這個問題是什麼或者它可能是相關的。EditText上的Android異常處理

代碼:

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