寻找一种用Java编写调试print语句的简单方法

Las*_*ifa 9 java debugging

编辑:我很想看看史蒂夫里德的AOP方法的反应.鼓励回答他的回答!

我是新手,在某些时候我意识到在程序执行期间知道变量的内容会很有帮助.所以我开始这样做:

编辑:修复此问题.曾经是:var +":"+ var,这是完全错误的.愚蠢的错字.

System.err.println ( "var: " + var );
Run Code Online (Sandbox Code Playgroud)

后来我才知道这是常见的做法.至少,调试器不可用或不需要的地方.

我使用基本的文本编辑器,每次需要调试变量时键入print语句都很烦人,所以我想,为什么不是这样的:

void dbug ( Object obj )
{
    String variableName = obj.somehowGetVariableName();
    String variableContents = obj.toString();
    System.out.println ( variableName +": " + variableContents );
}
Run Code Online (Sandbox Code Playgroud)

但显然得到变量名称说起来容易做起来难.

Java的反射如何对获得最名称对的一变量

我坚持:

System.err.println ( "var: " + var );
Run Code Online (Sandbox Code Playgroud)

或者有一个流行的速记版本?

pjp*_*pjp 9

我不会尝试编写任何花哨的方法来打印出调试信息.LOG.debug(...)如果您使用记录器或System.err.println(...)其他,请坚持使用.

您可能希望使用String.format("var=%s val=%s", "VarName", val)而不是字符串连接.

确保覆盖toString每个类中的方法以提供有意义的调试信息.

在一天结束时,通常更容易启动调试器并查看正在进行的操作,而不必跟踪已记录的调试行的负载.

我使用您的调试方法的唯一时间是,如果我的应用程序在地图中维护了所有状态,我可以轻松地打印出键值对(例如,Web应用程序中的会话映射).


Tim*_*Tim 6

看看Simple Logging Framework,它允许您输入:

class Example {
    static final org.slf4j.Logger LOG = org.slf4j.LoggerFactory.getLogger(Example.class);

    void doSomething(Object obj1, Object obj2) {
        LOG.debug("This is object 1: {}, and this is object 2: {}", obj1, obj2);
    }
}
Run Code Online (Sandbox Code Playgroud)

  • 我认为它只是一个toString()所以这除了避免字符串连接之外没有提供太多东西. (3认同)

dfa*_*dfa 6

我认为System.err.format是你想要的:

System.err.format("var: %s\n", var);
Run Code Online (Sandbox Code Playgroud)

是以下的简写:

System.err.println(String.format("var: %s", var));
Run Code Online (Sandbox Code Playgroud)