进击云原生

V1

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.errSystem.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。将获得如图所示的打印输出。

使用 -verbose 标志后看到的内容
使用 -verbose 标志后看到的内容

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

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 程序列表中选择您的程序。有关更多信息,请参阅

jconsole 为您提供有关正在运行的程序的大量信息
jconsole 为您提供有关正在运行的程序的大量信息

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

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

参考

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

关注

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

扫码关注,加群学习
扫码关注,加群学习

分类:

后端

标签:

后端

作者介绍

进击云原生
V1

公众号:进击云原生