java 调试技巧

【0】README

0.1) 本文描述+源代码均 转自 core java volume 1, 旨在理解 java 调试技巧 的相关知识;


【1】调试技巧相关

1.1)可以用下面的方法打印或记录任意变量的值:

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

1.2)在每一个类中放置一个main方法进行单元测试;
1.3)JUnit 是一个非常常见的单元测试框架;
1.4)日志代理: 日志代理是一个子类对象, 它可以窃取方法调用, 并进行日志记录, 然后调用超类中的方法;

  • 1.4.1)看个荔枝: 如果在调用一个面板的 setBackground 方法时 出现了问题, 就可以按照下面的方式, 以匿名子类的形式创建一个代理对象:
Random generator = new Random() {public double getDouble(){double result = super.nextDouble();Logger.getGlobal().info("nextDouble" + result);return result;        }}
  • 当调用nextDouble 方法时, 就会产生一个日志消息。 要想知道谁调用了这个方法, 就要生成一个 堆栈跟踪;

1.5)利用 Throwable 类提供的 printStackTrace 方法,可以从任何一个异常对象中获得堆栈情况。

  • 1.5.1)看个荔枝: 下面 的代码将捕获任何异常, 打印异常对象和堆栈跟踪, 然后,重新抛出异常, 以便能够找到相应的处理器;
try
{}
catch(Throwable t)
{t.printStackTrace();throw t;
}
  • 1.5.2)不一定要通过捕获异常来生成堆栈跟踪, 只要在代码的任何位置插入下面这条语句就可以获得堆栈跟踪:Thread.dumpStack();

1.6)堆栈跟踪显示在 System.err 上。 也可以利用 printStackTrace(PrintWriter s) 方法将它发送到一个文件中。另外, 如果想要记录或显示堆栈跟踪, 就可以采用下面的方式, 将它捕获到一个字符串中;

ByteArrayOutputStream out = new ByteArrayOutputStream();
new Throwable().printStackTrace();
String description = out.toString();

1.7)要知道,错误信息被发送到 System.err 而不是 System.out 中, 所以, 不能够通过下列语句获取他们:

java MyProgram > errors.txt
  • 1.7.1)而是采用下面方式捕获错误流:
java MyProgram 2> errors.txt
  • 1.7.2)要想在同一个文件中同时捕获 System.err 和 System.out , 需要使用下面这条命令:
java MyProgram >& errors.txt

1.8)让非捕获异常的堆栈跟踪出现在System.err 中并不是一个很好的想法。 比较好的方法是将这些内容记录到一个文件中。 可以调用静态的 Thread.setDefaultUncaughtExceptionHandler 方法改变非捕获异常的处理器;

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

1.9)要想观察类的加载过程, 可以使用 -verbose 标志启动 java 虚拟机, 看到如下输出结果:(有时候, 这种方法有助于诊断由于类路径引发的问题)

1.10)Xlint 选项告诉编译器对一些普遍容易出现的代码问题进行检查。如, 使用下面这条命令编译:

javac -Xlint: fallthrough
  • 当switch 语句中缺少break 语句时, 编译器会给出报告, 下面列出了可以使用的选项:

1.11)jvm 增加了对 java应用程序进行监控和管理的支持; 它允许利用jvm 中的代理装置跟踪内存消耗, 线程使用, 类加载等情况;
1.12)可以使用 jmap 实用工具获得一个堆的转储, 其中显示了堆中的每一个对象,使用命令如下:

jmap -dump:format=b, file=dumpFileNmae processID
jhat dumpFileName

然后, 通过浏览器进入 localhost:7000, 将会运行一个网络应用程序, 借此探查存储对象时堆的内容;
1.13)如果使用 -Xprof 标志运行 jvm , 就会运行一个基本的剖析器来跟踪那些代码中经常被调用的方法。 剖析信息将发送给 System.out, 输出结果还会显示哪些方法是由 即时编译器编译的;

Warning)编译器的 -X 选项并没有被正式支持, 而且在有些 JDK 版本中并不存在这个选项。 可以运行命令java -X 得到所有非标准选项的列表;

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/331769.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

jdk 版本和内部版本对应_JDK 14 Rampdown:内部版本27

jdk 版本和内部版本对应马克 雷因霍尔德( Mark Reinhold)最近的帖子“ JDK 14现在处于Rampdown第一阶段 ”宣布“我们现在处于Rampdown第一阶段”,并且“整体功能已冻结”。 JDK 14 Early Access Build #27(2019/12/12…

对一个java源文件进行正确编译,给定如下一个Java源文件Child.java,编译并运行Child.java,以下结果正确的是()...

总成化无本优部问决企题业内法解,给定流配特别题是物送问。而他再告真的不是己这却一诉自,个源文译并运行下某人重病的家得了假如人忽然间,的应对策略有他使用到。结果感是个人自我指一效能对:。哲学的规揭示律一般,管…

异常java.lang.Thread.dumpStack(Unknown Source)

转自: http://www.blogjava.net/landon/archive/2011/02/27/345265.html 昨天在公司写了一段代码,很简单,就是测试Thread的dumpStack方法的使用。 因为Thread的dumpStack方法不是很常用,但它对于如果想看看谁在运行时调用方法还是…

java集合框架——接口图+类图+遗留类图

【0】README 0.1)绝对的干货,理清 java集合框架中类和接口的层次关系;

构建maven项目插件_如何构建一个Maven插件

构建maven项目插件使用Okta的身份管理平台轻松部署您的应用程序 使用Okta的API在几分钟之内即可对任何应用程序中的用户进行身份验证,管理和保护。 今天尝试Okta。 由于其插件生态系统的普及,Apache Maven仍然是Java领域最受欢迎的构建工具。 很容易找到…

shu函数php,【函数分享】每日PHP函数分享(2021-3-3)

array_intersect_assoc — 带索引检查计算数组的交集说明array_intersect_assoc ( array $array1 , array $array2 , array $... ? ) : arrayarray_intersect_assoc() 返回一个数组,该数组包含了所有在 array1 中也同时出现在所有其它参数数组中的值。注意和 arra…

spring 注释_Spring@主要注释

spring 注释介绍: 当存在多个相同类型的bean时,使用Spring Primary批注为标记的bean提供更高的优先级。 默认情况下,Spring按类型自动连线。 因此,当Spring尝试自动装配并且有多个相同类型的bean时,我们将得到一个NoU…

java集合——集合接口+迭代器接口

【0】README 0.1) 本文描述转自 core java volume 1, 源代码 diy 的, 旨在理解 java集合框架——集合接口迭代器接口 的相关知识; 0.2) for full source code , please visit https://github.com/pacosonTang/core-j…

snmp在php中的使用,在php中转换python代码以计算snmpvlan掩码的最佳方法

我有一些python代码,我想在一个100%的php代码中使用。你知道我怎么转换代码吗???我在转换代码时遇到问题,尤其是部分get bit和set bit。在位掩码通过snmp从交换机中读取,掩码表示交换机端口位于定义的vlan中…

java ssl发送邮件_通过SSL发送的Java邮件

java ssl发送邮件抽象 本博客的目的是演示如何使用Java Mail通过具有SSL连接的SMTP服务器发送电子邮件。 免责声明 这篇文章仅供参考。 在使用所提供的任何信息之前,请认真思考。 从中学到东西,但最终自己做出决定,风险自负。 要求 我使用以…

java集合—— 链表(java中的所有链表都是双向链表)

【0】README 0.1) 本文描述转自 core java volume 1, 源代码 diy 的, 旨在理解 java集合—— 链表(java中的所有链表都是双向链表) 的相关知识; 0.2) for full source code , please visit ht…

使用matlab内存不足,Matlab内存不足问题(Out of memory)

今天遇到过这个错误:??? Error using > horzcatOut of memory. Type HELP MEMORY for your options.做算法仿真时,矩阵太大,超出内存了。当信号矩阵缩到可以满足内存时,仿真也没意义了,只有找解决办法了。找到一…

java 邮件 tls_通过TLS发送的Java邮件

java 邮件 tls抽象 本博客的目的是演示如何使用Java Mail通过具有TLS连接的SMTP服务器发送电子邮件。 免责声明 这篇文章仅供参考。 在使用所提供的任何信息之前,请认真思考。 从中学到东西,但最终自己做出决定,风险自负。 要求 我使用以下…

java中的break与continue用法

一、break break 的作用为跳出循环&#xff0c;执行循环外面的操作 &#xff08;1&#xff09;简单break public class Main {public static void main(String[] args) {int i0;for(;i<100;i){if(i2)break;}System.out.println(i);} } 输出结果&#xff1a;2 双重循环 publ…

java中的native关键字有什么作用?(java本地方法)

转自&#xff1a; http://zhidao.baidu.com/link?urlXu94DBMxXz3sJyCrG7G1sCmXoHuyuYx4DMG1x7UqYL7FhfFnqF7-Z9nxIQUpntPkqzaZ0xAyIjKIrEYrwIett_ 1、什么是Native Method 简单地讲&#xff0c;一个Native Method就是一个java调用非java代码的接口。一个Native Method是这样一…

php sessionid 重复,php_ session_id 限制同一用户同时登录

出于信息安全的考虑&#xff0c;希望给每个能进入系统的人员一个账户&#xff0c;而不是所有人共用一个账户&#xff0c;并且一个账户同时只能一人登陆。刚开始的做法是登陆加锁&#xff0c;当用户登陆之后&#xff0c;对此用户进行标记&#xff0c;若此用户未下线状态下进行第…

JavaFX之TableView

TableView表 构建一个表主要有TableView,TableColumn,ObservableList,Bean。 添加列table.getColumns().addAll(); ObservableList里面是存放的数据 table.setItems(observableList);添加数据 observableList里面一般是存放的Bean&#xff0c;列与Bean之间建立联系&#xf…

java native关键字(java本地方法)

转自&#xff1a; http://blog.csdn.net/youjianbo_han_87/article/details/2586375 native是与C联合开发的时候用的&#xff01;java自己开发不用的&#xff01; 【1】使用native关键字说明这个方法是原生函数&#xff0c;也就是这个方法是用C/C语言实现的&#xff0c;并且被…

php 按钮的属性值,HTML button标签的属性有哪些

HTML button的属性有&#xff1a;autofocus、disabled、form、formaction、formenctype、formmethod、formnovalidate、formtarget、name、type、value。本教程操作环境&#xff1a;windows7系统、HTML5版、Dell G3电脑。HTML 标签标签定义一个按钮。在 button 元素内部&#x…

javafx之TableView的FXCSS

TableView的FXCSS 一、特殊的table设置 TableView的单元之间去掉行横线 .table-view .table-row-cell { -fx-background-insets: 0; } TableView的单元之间去掉没有数据的竖线 table-row-cell:empty .table-cell { -fx-border-width: 0px; } TableView 的单元…