调试器可以作为 IDE 的一部分使用。但在使用 IDE 的调试器之前,这里有 12 个值得尝试的技巧。

1、可以使用如下代码打印或记录任何变量的值:

System.out.println("x=" + x);
// 或者
Logger.getGlobal().info("x=" + x);

如果​​x​​​是数字,则将其转换为等效的字符串。如果​​x​​​是一个对象,Java 调用它的​​toString​​​方法。要获取隐式参数对象的状态,请打印对象的状态​​this​​。

Logger.getGlobal().info("this=" + this);

Java 库中的大多数类都非常认真地重写​​toString​​方法,提供有关该类的有用信息。

2、一个非常有用的技巧是​​main​​在每个类中放置一个单独的方法。在其中,可以放置一个单元测试,让您可以单独测试该类。

public class MyClass
{
// the methods and fields
//. . .
public static void main(String[] args)
{
// the test code
}
}

创建对象,调用所有方法,并检查每一个是否符合预期。

当您运行一个小程序时,这些​​main​​方法都不会被调用。

运行应用程序时,JVM 只调用启动类的​​main​​方法。

3、​​JUnit​​ 是一个非常流行的单元测试框架,可以轻松组织测试用例套件。

当您对类进行更改时,运行测试,并在发现错误时添加另一个测试用例。

4、日志代理是子类的一个对象,它拦截方法调用,记录它们,然后调用超类。如果你在使用 Random 类的 nextDouble 方法时遇到麻烦,你可以创建一个代理对象作为一个匿名子类的实例,如下所示:

var generator = new Random()
{
public double nextDouble()
{
double result = super.nextDouble();
Logger.getGlobal().info("nextDouble: "
+ result);
return result;
}
};

每当​​nextDouble​​调用该方法时,都会生成一条日志消息。要找出谁调用了该方法,生成堆栈跟踪即可。

5、通过使用 Throwable 类中的 printStackTrace 方法,可以从任何异常对象获得堆栈跟踪。下面的代码捕获任何异常,打印异常对象和堆栈跟踪,并重新抛出异常,以便它可以找到预期的处理程序:

try
{
. . .
}
catch (Throwable t)
{
t.printStackTrace();
throw t;
}

您甚至不需要捕获异常来生成堆栈跟踪。只需将以下语句插入代码中的任何位置即可获取堆栈跟踪:

Thread.dumpStack();

6、通常,堆栈跟踪显示在​​System.err​​. 如果要记录或显示堆栈跟踪,可以通过以下方法将其捕获到字符串中。

var out = new StringWriter();
new Throwable().printStackTrace(new PrintWriter(out));
String description = out.toString();

7、在文件中捕获程序错误通常很方便。但是,错误会发送到​​System.err​​​,而不是​​System.out​​。因此,您不能简单地通过运行来捕获它们

java MyProgram > errors.txt

相反,将错误流捕获为

java MyProgram 2> errors.txt

要在同一个文件中同时捕获两者​​System.err​​​,​​System.out​​请使用

java MyProgram 1> errors.txt 2>&1

这可以在 bash 和 Windows shell 中工作。

8、显示未捕获异常的堆栈跟踪​​System.err​​并不理想。如果用户看到这些消息,他们会感到困惑,并且在您需要它们时无法用于诊断目的。

更好的方法是将未捕获的异常记录到文件中。您可以使用静态方法​​Thread.setDefaultUncaughtExceptionHandler​​更改未捕获异常的处理程序。

Thread.setDefaultUncaughtExceptionHandler(
new Thread.UncaughtExceptionHandler()
{
public void uncaughtException(Thread t,
Throwable e)
{
// save information in log file
};
});

9、要观察类加载,启动带有​​-verbose​​标志的 JVM。将获得如图所示的打印输出。

Java的12个方便调试的技巧_堆栈

此报告有时有助于诊断类路径问题。

10、该​​-Xlint​​选项告诉编译器发现常见的代码问题。例如,如果您使用命令编译

javac -Xlint sourceFiles

编译器会报告 switch 语句中缺少 break 语句。


lint 这个词最初描述的是一种用于定位 C 程序中潜在问题的工具,但现在普遍适用于任何标记构造有问题但不违法的工具。


您将收到以下警告:

"warning: [fallthrough] possible fall-through into case.""

方括号中的字符串标识警告类别。您可以启用和禁用每个类别。因为它们中的大多数都非常有用,所以最好将它们全部保留下来,只禁用那些你不关心的,如下所示:

javac -Xlint:all,-fallthrough,-serial sourceFiles

您可以使用此命令查看所有可用警告的列表。

javac --help -X

11、JVM 通过允许在虚拟机中安装跟踪内存消耗、线程使用、类加载等的代理来支持 Java 应用程序的监视和管理。这些特性对于大型且长时间运行的 Java 程序(例如应用程序服务器)尤其重要。

作为这些功能的演示,JDK 附带了一个名为的图形工具​​jconsole​​​,用于显示有关虚拟机性能的统计信息。启动您的程序,然后启动​​jconsole​​​并从正在运行的 Java 程序列表中选择您的程序。​​有关更多信息,请参阅​​。

Java的12个方便调试的技巧_应用程序_02

12、​​Java Mission Control​​​是一个专业级别的分析和诊断工具,​​下载地址​​。

就像​​jconsole​​​,Java Mission Control 可以附加到正在运行的虚拟机上。它还可以分析​​Oracle Java Flight Recorder​​的输出,这是一个从正在运行的 Java 应用程序收集诊断和分析数据的工具。

参考

https://blogs.oracle.com/javamagazine/post/java-debugging-tips

关注

微信公众号【我的小碗汤】,扫左侧码关注,了解更多咨询,更有免费资源供您学习