重写 tostring() 应返回关键字段的可读信息,避免敏感数据和 null 异常,推荐用 objects.tostring() 处理 null,并配合日志框架延迟格式化输出。

直接调用 toString() 是最常用的调试方式,但默认实现只返回类名加哈希码(如 com.example.User@1b6d3586),对排查问题帮助有限——关键是要重写它,让输出包含真正有用的字段信息。
重写 toString() 返回关键字段值
在自定义类中覆盖 toString(),显式拼接你关心的属性。IDE 通常支持自动生成(如 IntelliJ 按 Alt+Insert → “toString()”)。
- 避免只返回
super.toString()或空字符串 - 优先选可读格式:用逗号或换行分隔字段,字段名加冒号便于识别
- 敏感字段(如密码、token)不要出现在
toString()中
例如:
public class User {private String name;
private int age;
private String email;
@Override
public String toString() {
return "User{" +
"name='" + name + '\'' +
", age=" + age +
", email='" + email + '\'' +
'}';
}
}
用 Objects.toString() 安全处理 null
如果某个字段可能为 null,直接拼接会触发空指针异常。推荐用 java.util.Objects.toString(obj, "null") 提供默认值。
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
- 比手动判空更简洁:
Objects.toString(name, "N/A") - 第二个参数是 null 时的替代字符串,可设为
"null"、"<missing>"</missing>等 - 适用于日志中不想因单个字段为空导致整个 toString 崩溃的场景
配合日志框架直接输出
调试时别只靠 System.out.println()。在 SLF4J / Log4j 中直接传入对象,日志框架会自动调用 toString():
-
log.debug("User info: {}", user);—— 推荐,延迟格式化且线程安全 -
log.debug("User info: " + user);—— 不推荐,字符串拼接无法短路,即使日志级别关闭也会执行 toString()
这样既清晰又高效,还能和日志上下文(时间、线程、类名)一起输出。
注意不可变类和集合的 toString 行为
Java 内置类(如 String、Integer、ArrayList)已重写 toString(),可直接用;但要注意:
- 数组本身没重写,
new int[]{1,2,3}.toString()还是地址形式 → 改用Arrays.toString(arr) - 嵌套对象(如
User包含Address字段)需确保Address也重写了toString() - 循环引用(A 引用 B,B 又引用 A)会导致
StackOverflowError,重写时要规避深层递归
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










