
进击云原生
2022/02/09阅读:50主题:默认主题
Java 必须掌握的 12 个方便调试技巧
Java 必须掌握的 12 个方便调试技巧
调试器可以作为 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。将获得如图所示的打印输出。

此报告有时有助于诊断类路径问题。
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 程序列表中选择您的程序。有关更多信息,请参阅。

12、Java Mission Control是一个专业级别的分析和诊断工具,下载地址。
就像jconsole
,Java Mission Control 可以附加到正在运行的虚拟机上。它还可以分析Oracle Java Flight Recorder的输出,这是一个从正在运行的 Java 应用程序收集诊断和分析数据的工具。
参考
https://blogs.oracle.com/javamagazine/post/java-debugging-tips
关注
本文首发于微信公众号【我的小碗汤】,扫码关注,了解更多咨询,更有免费资源供您学习

作者介绍

进击云原生
公众号:进击云原生