// 錯誤:負奇數 % 2 == -1,非 1
public static boolean isOddWrong(int i) { return i % 2 == 1; }
// 正確:位運算或 != 0
public static boolean isOddRight(int i) { return (i & 1) != 0; }
// 或
public static boolean isOddRight2(int i) { return i % 2 != 0; }
核心:Java `%` 運算結果符號與被除數一致,負奇數模 2 得 -1。
System.out.println(2.0 - 1.9); // 0.10000000000000009
System.out.println(0.05 + 0.01); // 0.060000000000000005
System.out.println(4.015 * 100); // 401.49999999999994
System.out.println(123.3 / 100); // 1.2329999999999999
原因:二進制無法精確表示十進制小數(如 0.1 = 0.0001100110011...)。
Math.abs(a - b) < 1e-9BigDecimal a = new BigDecimal("2.0");
BigDecimal b = new BigDecimal("1.9");
System.out.println(a.subtract(b)); // 0.1
public static void infiniteLoop() {
int END = Integer.MAX_VALUE;
int START = END - 2;
int count = 0;
for (int i = START; i <= END; i++) count++; // 永不結束!
System.out.println(count);
}
原因:i 遞增至 MAX_VALUE 後再 ++ 溢出變為 MIN_VALUE,永遠 <= END。
for (int i = START; i < END; i++) // 改為 < 而非 <=
// 或用 long 作為循環變量
for (long i = START; i <= END; i++)
public static boolean trap() {
try { return true; }
finally { return false; } // 直接返回 false,try 的 return 被丟棄
}
規則:finally 中的 return/throw 會覆蓋 try/catch 的返回/異常。編譯器會警告「try 中的 return 被 finally 覆蓋」。
int a = 5;
System.out.println("value is " + ((a < 5) ? 10.9 : 9)); // 輸出: value is 9.0
原因:三元運算符要求二、三操作數類型一致,9 (int) 提升為 9.0 (double)。
StringBuffer s1 = new StringBuffer("123");
StringBuffer s2 = new StringBuffer("123");
System.out.println(s1.equals(s2)); // false!繼承 Object.equals 比較引用
// 正確:s1.toString().equals(s2.toString())
Float f1 = new Float(0.9f);
Float f2 = new Float(0.9f);
Double d = new Double(0.9f);
System.out.println(f1 == f2); // false (引用比較)
System.out.println(f1.equals(f2)); // true (值比較)
System.out.println(d.equals(f1)); // false (類型不同直接 false)
規則:equals 先檢查類型,Float 與 Double 永不相等。
| 場景 | 錯誤寫法 | 正確寫法 |
|---|---|---|
| 奇數判斷 | i % 2 == 1 | (i & 1) != 0 |
| 金額計算 | double 直接運算 | BigDecimal / 長整型(分) |
| 邊界循環 | i <= Integer.MAX_VALUE | i < Integer.MAX_VALUE 或用 long |
| finally 返回 | finally 中 return | 避免 finally 中 return/throw |
| 三元運算符 | 混用 int/double | 統一類型或顯式轉型 |
| StringBuffer 比較 | equals | toString().equals() |
| 包裝類比較 | == / 跨類型 equals | 同類型 equals / compareTo |