在 Java 中將任意物件轉為字串有三種常見寫法,行為細節差異極大,選錯易導致 NullPointerException 或 ClassCastException。
Object obj = new Integer(100);
String s = obj.toString(); // "100"
// 風險:obj 為 null 時拋出 NPE
Object n = null;
n.toString(); // NullPointerException
Object,預設回傳 類別名@雜湊碼。String、包裝類、集合等) 已覆寫回傳有意義內容。Object obj = "hello";
String s = (String) obj; // 正常
Object num = new Integer(100);
String s2 = (String) num; // ClassCastException: Integer cannot be cast to String
ClassCastException。Object obj = new Integer(100);
String s1 = String.valueOf(obj); // "100"
Object n = null;
String s2 = String.valueOf(n); // "null" (字串 "null",非 null 參考!)
public static String valueOf(Object obj) {
return (obj == null) ? "null" : obj.toString();
}
null 輸入回傳字串 "null",不拋出例外。| 場景 | obj.toString() | (String) obj | String.valueOf(obj) |
|---|---|---|---|
| obj 為 String | ✅ 正常 | ✅ 正常 | ✅ 正常 |
| obj 為 Integer | ✅ "100" | ❌ ClassCastException | ✅ "100" |
| obj 為 null | ❌ NullPointerException | ✅ null (參考) | ✅ "null" (字串) |
| 語意 | 取得字串表示 | 型別斷言 | 取得字串表示 (Null 安全) |
| 推薦度 | ⭐⭐ (需非 null) | ⭐ (極少用) | ⭐⭐⭐⭐⭐ (通用首選) |
String.valueOf(obj):最安全、語意清晰、無需 null 檢查。toString() 時,obj.toString() 可接受。(String) obj 做轉換,除非你在做型別斷言 (如從 Map<String, Object> 取值且確定是 String)。String.valueOf(obj) 避免 NPE 導致日誌中斷。"" + obj 底層實際呼叫 String.valueOf(obj),同樣 Null 安全。public class User {
private Long id;
private String name;
@Override
public String toString() {
return "User{id=" + id + ", name='" + name + "'}";
}
}
// 現在 String.valueOf(user) 會輸出 "User{id=1, name='Alice'}"