常見崩潰情境:使用者未輸入數字直接按下確定,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;
}
使用 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);
// 正常處理
}
掌握正確驗證流程,不僅能避免崩潰,更能提供友善的使用者體驗。