經典 Java 語法陷阱:if/else 後若不加大括號 {},僅控制緊跟的單條語句。原代碼中 else 只管了 setVisibility,導致後續 Toast.show() 無條件執行。
on.setOnClickListener(v -> {
if (((CheckBox) v).isChecked())
receiverEmail.setVisibility(View.GONE); // 屬於 if
if (((CheckBox) v).isChecked())
Toast.makeText(..., "Saved", ...).show(); // 屬於 if
else
receiverEmail.setVisibility(View.VISIBLE); // 屬於 else
Toast.makeText(..., "Enter Email", ...).show(); // ❌ 無條件執行!
});
on.setOnClickListener(v -> {
CheckBox cb = (CheckBox) v;
if (cb.isChecked()) {
receiverEmail.setVisibility(View.GONE);
Toast.makeText(getContext(), "Your Information is Saved", Toast.LENGTH_LONG).show();
} else {
receiverEmail.setVisibility(View.VISIBLE);
Toast.makeText(getContext(), "Enter Your Email Address", Toast.LENGTH_LONG).show();
}
});
// 第二個 CheckBox 同理
on2.setOnClickListener(v -> {
CheckBox cb = (CheckBox) v;
if (cb.isChecked()) {
clientID.setVisibility(View.GONE);
Toast.makeText(getContext(), "Your Information is Saved", Toast.LENGTH_LONG).show();
} else {
clientID.setVisibility(View.VISIBLE);
Toast.makeText(getContext(), "Enter Your Email Address", Toast.LENGTH_LONG).show();
}
});
| 風格 | 代碼 | 風險 |
|---|---|---|
| ❌ 省略大括號 | if (cond) doA(); else doB(); doC(); | 極易誤讀、維護時插入語句導致邏輯錯誤 |
| ✅ 完整大括號 | if (cond) { doA(); } else { doB(); } doC(); | 結構清晰、防禦性編程、團隊協作安全 |
| ✅ 單行也加括號 | if (cond) { doA(); } | 統一風格、消除歧義 |
CheckBox 狀態改變更語義化用 setOnCheckedChangeListener,避免點擊與狀態不同步:
checkBox.setOnCheckedChangeListener((buttonView, isChecked) -> {
if (isChecked) {
editText.setVisibility(View.GONE);
Toast.makeText(context, "Saved", Toast.LENGTH_SHORT).show();
} else {
editText.setVisibility(View.VISIBLE);
Toast.makeText(context, "Enter Email", Toast.LENGTH_SHORT).show();
}
});
checkBox.setOnCheckedChangeListener { _, isChecked ->
editText.visibility = if (isChecked) View.GONE else View.VISIBLE
Toast.makeText(context, if (isChecked) "Saved" else "Enter Email", Toast.LENGTH_SHORT).show()
}
OnCheckedChangeListener。這個錯誤看似低級,但極其常見,甚至出現在資深代碼中。養成「永遠加大括號」習慣,能省去無數調試時間。