首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 更多程式語言 >> 程式設計綜合問答

Android EditText 空值檢查:避免 NumberFormatException 的正確寫法

     編輯:程式設計綜合問答

常見崩潰情境:使用者未輸入數字直接按下確定,Integer.parseInt("") 拋出 NumberFormatException,導致 App 閃退。錯誤程式碼典型特徵:

// ❌ 錯誤示範
String item = itemET.getText().toString();
int quantity = Integer.parseInt(quantityET.getText().toString()); // 空字串直接崩潰
if (itemET.equals("")) { ... } // 錯誤:比較 EditText 物件而非文字內容

正確處理流程:先取字串、再檢查、最後轉型

// ✅ 正確寫法
public void onClick(DialogInterface dialog, int id) {
    String itemString = itemET.getText().toString().trim();
    String quantityString = quantityET.getText().toString().trim();
    
    // 1. 先檢查空值
    if (itemString.isEmpty()) {
        Toast.makeText(this, "請輸入名稱", Toast.LENGTH_SHORT).show();
        return; // 直接返回,不執行後續邏輯
    }
    if (quantityString.isEmpty()) {
        Toast.makeText(this, "請輸入數量", Toast.LENGTH_SHORT).show();
        return;
    }
    
    // 2. 再轉型(已確定非空)
    int quantity;
    try {
        quantity = Integer.parseInt(quantityString);
    } catch (NumberFormatException e) {
        Toast.makeText(this, "數量格式錯誤,請輸入整數", Toast.LENGTH_SHORT).show();
        return;
    }
    
    // 3. 正常業務邏輯
    saveItem(itemString, quantity);
}

關鍵修正點解析

錯誤寫法問題正確寫法
Integer.parseInt(et.getText().toString())空字串直接拋異常先 .isEmpty() 判斷
if (et.equals(""))比較 EditText 物件而非文字et.getText().toString().isEmpty()
無 try-catch非數字字元(如 "abc")也會崩潰包裹 parseInt 捕獲異常
未 .trim()純空白字串視為合法先 .trim() 再判斷

進階:封裝通用驗證工具類

public class InputValidator {
    public static boolean isEmpty(EditText et) {
        return et.getText().toString().trim().isEmpty();
    }
    
    public static Integer parseIntOrNull(EditText et) {
        String s = et.getText().toString().trim();
        if (s.isEmpty()) return null;
        try { return Integer.parseInt(s); } 
        catch (NumberFormatException e) { return null; }
    }
    
    public static Double parseDoubleOrNull(EditText et) {
        String s = et.getText().toString().trim();
        if (s.isEmpty()) return null;
        try { return Double.parseDouble(s); } 
        catch (NumberFormatException e) { return null; }
    }
}

// 使用範例
Integer qty = InputValidator.parseIntOrNull(quantityET);
if (qty == null) {
    Toast.makeText(this, "請輸入有效數量", Toast.LENGTH_SHORT).show();
    return;
}

現代替代:TextInputLayout + Material 元件

使用 com.google.android.material.textfield.TextInputLayout 內建錯誤提示:

<com.google.android.material.textfield.TextInputLayout
    android:id="@+id/quantityLayout"
    android:layout_width="match_parent"
    android:layout_height="wrap_content">
    <com.google.android.material.textfield.TextInputEditText
        android:id="@+id/quantityET"
        android:inputType="number"
        android:layout_width="match_parent"
        android:layout_height="wrap_content" />
</com.google.android.material.textfield.TextInputLayout>
TextInputLayout layout = findViewById(R.id.quantityLayout);
String text = layout.getEditText()?.getText().toString().trim() ?: "";
if (text.isEmpty()) {
    layout.setError("請輸入數量");
    layout.setErrorEnabled(true);
} else {
    layout.setErrorEnabled(false);
    // 正常處理
}

掌握正確驗證流程,不僅能避免崩潰,更能提供友善的使用者體驗。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved