整合营销服务商

电脑端+手机端+微信端=数据同步管理

免费咨询热线:

Java程序员,你会在Eclipse IDE中调试代

Java程序员,你会在Eclipse IDE中调试代码吗?

试是所有Java程序员的必备技能。本文将从初学者指南开始,帮助程序员学习调试。在本文的第二部分,你还可以看到有关新版Eclipse Oxygen中如何调试的讲解。

调试是从程序中定位和删除bug或异常的常规过程。对于Java程序员来说,这是一个必须具备的技能,因为它有助于找到在代码审查过程中不可见的微妙错误,或者仅在特定情况下发生的错误。Eclipse Java IDE在“Debug Perspective”选项下提供了许多调试工具和视图,可帮程序员高效调试。

初学者指南——快速启动调试

以下是一些快速提示和工具,可帮助程序员快速开始调试Java项目。

1.启动和调试Java程序

可以通过从Package Explorer中右键单击Java编辑器类文件来简单地调试Java程序。 选择Debug As→Java Application,或者使用Alt + Shift + D,J代替快捷方式。

在大多数情况下,用户可以在调试时编辑和保存代码,而无需重新启动程序。这适用于HCR(热代码替换)支持,HCR已被特别添加为标准Java技术,以促进实验开发并促进迭代。

2.断点

断点是一个信号,告诉调试器在代码中的某一点暂时中止程序的执行。

要在源代码中定义断点,请右键单击Java编辑器中的左边距,然后选择切换断点。或者,您可以双击此位置。“断点”视图允许程序员删除和停用断点并修改其属性。

所有断点可以使用跳过所有断点启用/禁用。断点也可以导入/导出到工作区。

3. Debug perspective

debug perspective提供了可用于对断点,变量,调试,控制台等进行故障排除的其他视图。当在调试模式下启动Java程序时,会提示用户切换到debug perspective。

  • debug perspective - 可视化调用堆栈并提供操作。

  • Breakpoints view - 显示所有断点。

  • Variables/Expression view - 显示声明的变量及其值。在选定的变量或表达式上按Ctrl + Shift + d或Ctrl + Shift + i显示其值。您还可以在表达式/变量上添加永久性表,然后在调试开启时,将在“表达式”视图中显示。

  • Display view - 允许在调试期间检查变量,表达式或所选文本的值。

  • Console view - 程序输出如下所示。

4.按步骤调试

Eclipse Platform通过在工具栏中提供按钮和快捷键的方式来帮助程序员进行调试,以控制程序的执行。

调试复杂场景的高级工具

本节将为您提供更多高级提示和技巧,以调试Java项目。Eclipse Oxygen版本包含许多Java调试的极大改进。

1、观察点,异常断点,条件断点

  • 观察点 - 观察点是特定的断点,只要给定表达式/字段的值发生更改,而不指定可能发生的位置,就会停止应用程序的执行。 用户可以通过“断点属性”...指定监视表达式被访问,修改或同时停止执行


  • 异常断点 - 使用添加Java异常断点指定抛出异常的断点。NullPointerException的断点将在每次抛出此异常时停止。


  • 条件断点 - Eclipse用户可以创建条件来限制断点的激活。

只有当布尔值b为真时,才会激活断点。可以提供命中计数以在断点的第n个命中停止执行。断点被禁用,直到它被重新启用或其命中计数更改或程序结束为止。

2.远程调试

Eclipse IDE允许程序员调试在另一个Java虚拟机(JVM)上甚至另一台机器上运行的应用程序。要启用远程调试,需要启动具有某些标志的Java应用程序。连接类型可以指定为Socket Attach或Socket Listen。Socket Listen支持多个传入连接。

Eclipse Oxygen的新功能

以下是添加到Eclipse Java IDE版本中的新功能。

  • 追踪点

Eclipse平台中的一个新功能,允许用户创建条件断点来打印消息,而不会在断点处停止并使代码块混乱。


Eclipse Platform使用systrace模板创建了tracepoint。

  • 触发点

程序员可激活触发点,为工作区中的断点定义一组触发点。触发器最初被抑制的所有其他断点只有在触发点被触发之后才会被击中。触发点被触发后,所有的触发器被禁用,并且在运行后将被重新启用。


通过使用断点属性,可以通过“断点”视图的对话框或详细信息窗格将任何断点设置为触发点。


  • 逻辑结构

在 Variables view中,集合对象直接显示其包含的元素,而不是其内部结构。默认情况下,在Oxygen释放中激活逻辑结构,可以关闭显示逻辑结构以显示内部结构。

显示逻辑结构上下文菜单允许程序员创建,选择或编辑表示。

  • 步骤操作后的方法结果

在调试过程中,在“进入”,“逐步”或“返回”期间观察到的最后一个方法的结果(每次返回或抛出)在“变量”视图中显示为第一行。

  • 启动组

启动组在Oxygen中也是新增功能,启动组启动配置类型允许按顺序启动多个其他配置,并在启动每个组成员后执行可配置的操作。可以通过运行→运行配置...或运行→调试配置...对话框创建新的启动组。

  • 断点分组和排序

Eclipse用户现在可以根据Eclipse Oxygen中的不同类别对断点进行分组。断点工作集定义了一组断点。用户可以在工作集上执行启用/禁用操作。

、Eclipse的基本认识:Eclipse是Java以及JavaEE开发的IDE(integreated Development Environment,集成开发环境)之一,是目前软件企业使用最多的一种IDE。Ecplise最初是IBM的产品,在2001年交给了开源组织来维护,现在是非盈利组织Eclipse基金会(Ecplise Foundation)来管理。

- 下载在官网www.eclipse.org中下载。(Eclipse的安装很简单,直接解压下载的压缩文件即可。)

2、Eclipse基本设置(Window -> Preferences)

- 工作环境下的字符编码的设置:(一般设置为utf-8,否则按照默认的gbk在进行web编程时会出现乱码的问题)

- JRE设置:如果在系统环境变量中设置了JAVA_HOME,则会默认使用JAVA_HOME的设置。

- 编译器设置:

- 默认Web浏览器配置:默认情况下,Ecplise使用的是内部浏览器,但也可以指定为外部浏览器。

- 添加外部浏览器:

- 修改JSP、HTML文件的默认字符编码:

- HTML的字符编码格式默认为utf-8:

2、Eclipse文件相关常用的快捷键:

- Ctrl + N:新建一个工程、文件、文件夹等内容。

- Ctrl + M:窗口最大化/还原。

- Alt + Enter:打开被选中的工程、包、文件等的属性窗口。

- Ctrl + F11:以调试模式运行程序。

- F2:重命名工程名、文件名。

- Ctrl + E:打开编辑窗口查看目录。

- Ctrl + Page Up:切换到当前编辑窗口的上一个窗口。

- Ctrl + Page Down:切换到当前编辑窗口的下一个窗口。

3、Eclipse编写代码时常用的快捷键:

- Ctrl + Alt + 向下的箭头:向下赋值光标所在行内容或者选中内容。

- Ctrl + Alt + 向上的箭头:向上赋值光标所在行内容或者选中内容。

- Alt + 向下的箭头:向下移动光标所在行内容或者选中内容。

- Alt + 向上的箭头:向上移动光标所在行内容或者选中内容。

- Ctrl + 1: 给出解决方案。

- Alt + ?:显示自动提示功能。

- Alt + Shift + Z:对选中代码进行Surrount With。

- Alt + Shift + S:弹出Source菜单。(弹出菜单后,根据显示的字母下划线提示选择)

- Ctrl + /:行注释与解除注释。

- Ctrl + Shift + /:块注释。

- Ctrl + Shift + \:解除块注释。

- Ctrl + Shift + F:格式化代码。

- Alt + Shift + L:将选中内容抽取为变量。

- Alt + Shift + M:将选中内容抽取为方法。

4、Eclipse打印输出结果:

a、选中要打印的内容;b、Alt + ?,弹出帮助信息;c、按向上箭头一下,然后按下enter键即可。

5、Eclipse查看源码时常用的快捷键:

- Ctrl + T:查看类的继承关系、实现关系。

- Ctrl + O:查看类的结构。

- Ctrl + Shift + T:打开查看类窗口。

- 查看类或者方法的定义:鼠标悬浮在类或者方法上,同时按下Ctrl键。(显示下划线后单击即可进入类或者方法的定义)

6、Eclipse其他快捷键:

- Ctrl + Shift + 向左箭头或者向右箭头:快速选择一个单词。

- Shift + Home 或者是 End:从光标当前位置,快速选择到行首或者行尾。

- Shift + 向上箭头或者向下箭头:从光标当前位置,快速选择到上一行或者下一行。

者:为了美好的明天

来源:https://javapapers.com/core-java/system-out-println/

什么是System.out.println()

System.out.println是一个Java语句,一般情况下是将传递的参数,打印到控制台。

System:是 java.lang包中的一个final类

根据 javadoc,“java.lang.System该类提供的设施包括标准输入,标准输出和错误输出流; 访问外部定义的属性和环境变量; 一种加载文件和库的方法; 以及用于快速复制数组等一部分的实用方法… ”

out:是System类的静态成员字段,类型为PrintStream。

public static final PrintStream out

他在启动时就会被实例化,并与主机的标准输出控制台进行映射。该流在实例化之后立即打开,并准备接受数据。

println:是PrintStream类的一个方法。println打印(参数内容+换行符) 到控制台。

PrintStream类中有多个重载的println方法。每个println是通过调用print方法并添加一个换行符实现的。print方法是通过调用write方法实现的。

System.out.println() 结构图如下:

以下是JDK源中System.out.println的骨架结构,和代码片段。

UML图

部分代码段:

public final class System {
 static PrintStream out;
 static PrintStream err;
 static InputStream in;
 ...
}
public class PrintStream extends FilterOutputStream {
 //out object is inherited from FilterOutputStream class
 public void println() {
 ...
}

输出重定向——改变输出路径

out对象可以自定义的。在启动时由java运行时环境初始化,并且可以在执行期间由开发人员更改。代替在默认情况下的标准输出。

当您通过命令行运行程序时,输出将打印在同一个命令窗口中。我们可以使用setOut方法来改变这种行为。

在以下示例中,我将输出重定向到同一目录中的文本文件。

public class ChangeOut {
 public static void main(String args[]) {
 try {
 System.setOut(new PrintStream(new FileOutputStream("log.txt")));
 System.out.println("Now the output is redirected!");
 } catch(Exception e) {}
 }
}

System.out.println性能分析

有一个普遍的观念需要大家知道——System.out.println性能并不好。

当我们深入分析时,其调用顺序如下println - > print - > write()+ newLine()。这个顺序流是Sun / Oracle JDK的实现。

write()和newLine()都包含一个synchronized块。同步有一点开销,但更多的是添加字符到缓冲区和打印的开销更大。

当我们运行性能分析时,运行多个System.out.println并记录时间,执行时间会按比例增加。当打印超过50个字符并打印超过50,000行时,性能下降。

当然这一切都取决于我们使用的场景。不过无论如何请勿使用System.out.println打印日志( logging)到stdout。

System.out.println VS 日志记录组件(Log4j等)

Log4J具有多种记录级别。如果我们正在编写一个小程序,只是为了实验/学习目的那么使用 System.out.println 就很不错。

但当我们开发生产质量软件时,我们应该注意到应该使用记录组件(log4j等),并且应该避免使用System.out.println。为什么?

  • 灵活性:log4j的记录器提供了多种记录级别。我们可以相应地分隔日志信息。例如,X消息只能在PRODUCTION上打印,Y消息应打印在ERROR等上。
  • 可重构性:log4j只需一个参数更改即可关闭所有日志记录。
  • 可维护性:想象一下,如果我们有数百个System.out.println全部通过应用程序散落,那么在一段时间内将难以维护程序。
  • 粒度:在应用程序中,每个类都可以有不同的记录器并相应地进行控制。
  • 实用性:在System.out中限制重定向消息的选项,但是如果是记录器(like log4j),则可以提供多种选项。我们甚至可以创建自定义输出选项并将其重定向。

所以我们不应该使用System.out.println进行日志记录和调试(logging and debugging)

静态导入来缩短System.out.println

有时我们觉得System.out.println是一个很长的语句要打印。静态导入可能会缩短一点,但不推荐使用,因为它导致可读性差。

我只是使用这种情况来解释静态导入,并避免在下面的情况下使用它。

import static java.lang.System.out;
public class ShortSOP {
 public static void main(String[] args) {
 out.println("Hello, world");
 }
}

不静态导入的话直接写out.println会提示编译错误的。

System.err和System.in

作为相关部分,接下来介绍一下“err”和“in”。'in'与InputStream相关联。与“out”相对,“in”用于从标准控制台通用键盘获取输入。

'err'与PrintStream相关联,并将参数打印到标准错误输出流。当您使用eclipse等的IDE时,可以看到“out”和“err”之间的输出差异。