2016-08-18 48 views
0

我有一個文本字段,用戶可以輸入任何數字,當用戶輸入100到200之間的數字時,該按鈕應該被禁用。我已將文本字段轉換爲整數,並將輸入的文本與數字進行比較。但我正在崩潰。比較一個文本到整數,數字格式異常

private EditText flightNumber; 

@Override 
     public void afterTextChanged(Editable s) { 
      if(flightNumber.getText().toString()!=null) { 
       int flightNo = Integer.parseInt(flightNumber.getText().toString()); 
       if (flightNo >=30 && flightNo <=99) { 
        saveButton.setEnabled(false); 
        saveButton.setVisibility(View.GONE); 
        Toast.makeText(getApplicationContext(), getText(R.string.flight_warning), Toast.LENGTH_LONG) 
          .show(); 
       } else { 
        saveButton.setEnabled(true); 
        saveButton.setVisibility(View.VISIBLE); 
       } 
      } 
      verifyFlightKeyData(); 
      checkMandatoryFields(); 

     } 

這是日誌

java.lang.NumberFormatException: Invalid int: "" 
                   at java.lang.Integer.invalidInt(Integer.java:137) 
                   at java.lang.Integer.parseInt(Integer.java:358) 
                   at java.lang.Integer.parseInt(Integer.java:331) 
                   at com.miairline.chooseflight.FlightDataActivity$1.afterTextChanged(FlightDataActivity.java:112) 
                   at android.widget.TextView.sendAfterTextChanged(TextView.java:8939) 

飛機墜毀在此行中發生的事情:

int flightNo = Integer.parseInt(flightNumber.getText().toString()); 

回答

4

發生了什麼事是你的文本字段是空的,你想一個空字符串""轉換爲數字。

不是:

if (flightNumber.getText().toString()!=null) 

這將永遠是正確的,因爲從來沒有toString()返回null,你可以這樣做:

if (flightNumber.getText().length() > 0) 

,檢查該字段不爲空。

+0

我用這個,它工作(!flightNumber.getText.toString()。isEmpty())。 – Peele

2

正如你可以在郵件中看到:

java.lang.NumberFormatException: Invalid int: "" 

值是一個空字符串,它不能轉換爲整數。

你可以這樣做:

int flightNo = Integer.parseInt(flightNumber.getText()== null ||flightNumber.getText().isEmpty() ? 0: flightNumber.getText()); 

來解決這個問題。

順便說一句。 toString()不nesassery,因爲getText()返回一個字符串

2

您需要在嘗試將其解析爲Int之前檢查字符串的長度。解析一個空值將導致異常。

[編輯]

Abdelhak評論說我應包括代碼,這是正確的。道歉!我會怎麼做低於:

if (!flightNumber.getText().toString().isEmpty()) { 
    // code here. 
} 

我想你也已經設置的EditText到數字的XML,所以用戶不能輸入非數字?那會導致類似的例外。只是包括在這個時候你的代碼在你的EditText XML以下...

android:inputType="number" 
+0

嘗試把一些代碼,以澄清你的想法 – Abdelhak

+0

公平點@Abdelhak。已添加代碼! :) –

0

也許更好的條件將是這樣

if(!("".equals(flightNumber.getText().toString())) 

嘗試解析甚至空字符串,從而產生給定異常

0

當您嘗試調用Integer.praseInt()時,可能會發生該字符串不是像「」或「嘿」這樣的實際數字。然後parseInt()函數拋出一個NumberFormatException異常。你必須添加一個嘗試,catch子句:

try{ 
    int flightNo = Integer.parseInt(flightNumber.geText().toString()); 
}catch(NumberFormatException exception){ 
    //here do some error handling 
} 

你也可以flightNumber.getText()的isEmpty添加到您,如果條件額外的性能和安全性提升。

0

您可以使用此代碼

if (!flightNumber.getText().toString().trim().equals("")) 
{ 
    int flightNo = Integer.parseInt(flightNumber.getText().toString()); 
}else{ 
    int flightNo = 0; 
} 
0

而不是

if(flightNumber.getText().toString()!=null) { 

嘗試像

String text = flightNumber.getText(); 
if (text !=null && text.trim().length() > 0) then { 

這是相當冗長的,所以你可能會考慮某處抽象的代碼:

public class NullUtil { 

    /** Blocked constructor **/ 
    private NullUtil() 
    {} 

    public static boolean isNullOrEmpty(String specifiedString) { 
     if (specifiedString == null) 
      return true; 
     if (specifiedString.trim().equals("")) 
      return true; 
     return false; 
    } 
} 

另一種策略是檢查是否實際上可以將字符串解析爲整型,因爲可能文本字段中填充的不是數字。