# 如何使用 Eclipse 调试 Java
> 原文: [https://javatutorial.net/how-to-debug-java-with-eclipse](https://javatutorial.net/how-to-debug-java-with-eclipse)
调试–一种使用最多且不可避免的技术。 如果只有一种工具可以使我们使这个有时繁琐的任务变得更加轻松和不那么繁琐……等等。
![java-featured-image](https://img.kancloud.cn/05/3e/053ee0bb59842d92359246c98f815e0c_780x330.jpg)
Eclipse 允许在所谓的**调试模式**中启动 Java 程序。 最有用的是它允许您使用调试命令来控制执行流程。
您可以设置行断点,条件断点和/或异常断点。
## 开始调试过程
要在代码中初始化一个断点,请在 Java 编辑器中右键单击左边界,然后选择“Toggle Breakpoint”,如下所示:
![Setting a breakpoint in java using debugger](https://img.kancloud.cn/f4/04/f404940b7d84deeadd737b8f7a94cc97_1269x733.jpg)
您还可以做的是(我想这是一种较快的方法)再次双击左边缘(红色箭头指向的位置)。 无论哪种方法适合您,它们都是完全相同的方法。
就我而言,我在`for`循环的开头添加了一个断点
![Setting a Breakpoint at For Loop](https://img.kancloud.cn/87/93/8793e851a7e5300ea1423f919ec99cf9_524x225.jpg)
现在是时候在“调试”模式下运行程序了。 有 3 种方法:
* 单击主菜单中的“运行”命令,然后选择“调试”
* 按`F11`
* 单击顶部面板上的类似 bug 的图标,然后选择“调试为 Java 应用程序”
![Debug As](https://img.kancloud.cn/0a/15/0a151fe4c489c6f0c6ad5bdbbc70b786_981x829.jpg)
请注意,要调试程序,您需要定义断点。
![Confirming Debug As](https://img.kancloud.cn/65/0c/650c0b960218d807c0c222dc91efb27e_325x420.jpg)
从上方的图片中选择“Java 应用程序”后,将提示此屏幕。 单击“确定”。
![Confirm Perspective Switch](https://img.kancloud.cn/91/c0/91c036020c58d1228408f93643f4df5f_687x284.jpg)
之所以会调用此窗口,是因为 Eclipse 想知道在到达停止点后是否要切换到调试透视图。 点击“切换”。
## 控制调试过程
您将在顶部面板上找到按钮,这些按钮的目的是帮助您控制决定调试的程序的执行。
![toolbar menu debugger](https://img.kancloud.cn/58/ee/58ee49aacc3d44fae1e92c48c1245a88_183x41.jpg)
但是,您也可以使用以下键绑定:
![Resume toolbar button](https://img.kancloud.cn/ae/9e/ae9eca66bc6b1fa2b94bdb4ef67da9df_46x34.jpg):此按钮的作用是恢复程序的执行,直到到达下一个断点。(`F8`)
![Terminate toolbar button](https://img.kancloud.cn/62/a0/62a0acef16d6869a29944023b526ccec_29x42.jpg):终止当前正在运行的服务器,而不是 Eclipse。(`CTRL + F2`)
![F5 toolbar menu](https://img.kancloud.cn/09/43/0943a9c23d1d0d1531cb88664a448911_25x26.jpg):执行当前突出显示的行并跳过下一行。 重要的是要注意,如果当前突出显示的行是函数调用,则调试器将进入功能。(`F5`)
![F6 toolbar menu](https://img.kancloud.cn/b7/89/b7897793a64e5e4ec54762e62d388962_40x41.jpg):执行一种方法,而调试器实际上不会进入该方法,也称为“跳过”。(`F6`)
![F7 toolbar menu](https://img.kancloud.cn/34/0f/340f7d67ca403760f70d432de4323dbb_33x41.jpg):完成当前方法的执行并跳回到该方法的调用者。(`F7`)
#### 调试视图
![Debug view](https://img.kancloud.cn/2a/8d/2a8d3fbb4dd5e26d756d045535d0c607_473x157.jpg)
#### 变量&表达式视图
![Variables view](https://img.kancloud.cn/d7/eb/d7ebb6720cc92f6510162562279abff0_500x504.jpg)
![Expression view](https://img.kancloud.cn/89/40/8940ea2985a2bb6bf0c70a1e7c77a27c_489x513.jpg)
这些视图提供了已声明变量及其关联值的展示。
#### 断点视图
![Breakpoints view](https://img.kancloud.cn/cb/84/cb849264002c674b4f19e289b97c6fa1_493x515.jpg)
它基本上执行其名称,即显示所有断点。 就我而言,我只有 1 个断点,恰好在第 6 行。
#### 控制台视图
![Console View](https://img.kancloud.cn/f0/33/f033780728c2c04729a22309180556a4_1372x236.jpg)
使用此视图,您可能已经很熟悉–这是程序的实际输出。
### 使用这些视图的简单示例
从上面的代码的第 6 行开始(从`for`循环开始),单击`F5`后,我们得到以下结果:
![Step 1](https://img.kancloud.cn/77/7b/777b7ff6337b5aeb9c7766ab1b52a714_1840x970.jpg)
因此,点击`F5`后,我们进入循环(第 7 行),如果您查看“变量”视图,则会看到`i`已初始化为 0(第 6 行)。
现在,让我们再次单击`F5`。
![Step 2 debugger process](https://img.kancloud.cn/05/ee/05ee52e024f23ed5268f1b608e0a633b_1839x952.jpg)
没什么变化,因为我们在`exampleVariable`中添加了 1,仅此而已。 现在我们在第 8 行,让我们单击`F5`看看会发生什么。
![Step 3 debugger process](https://img.kancloud.cn/dd/6a/dd6a3a606e1bd3181e33f8aab2064b60_1840x955.jpg)
我们得到了第一输出! 那是因为我们运行了`System.out.println()`语句。 当我按`F5`键时,您认为现在会发生什么?
![Step 4 debugger process](https://img.kancloud.cn/b4/58/b4585ea609072522ee486791d60fd0ce_1847x956.jpg)
如果您说`i`将更改为 1,那么您将是对的! 您可以在右侧看到`i`随着其值的变化而突出显示。
那是调试的基本过程。
让我们看一下 Eclipse 的调试器工具提供的更多功能。
## 观察点
与断点不同,观察点用于在文件字段的值发生更改(不指定要更改)时停止执行复制。
您可以通过在“断点属性”中指定监视点来轻松启用监视点。 要访问断点属性,请右键单击您在代码左侧放置的断点,然后选择“断点属性”,如下所示:
![Breakpoint properties](https://img.kancloud.cn/63/e6/63e683651c48259425378e39d4c8913e_783x430.jpg)
然后,您有两个选择。 您可以勾选“视情况而定”,然后选择“在‘true’时暂停”或“在值更改时暂停”。 甚至,您可以在下面的空间中指定一个条件,如果条件为`true`,它将终止终止。
![Suspend when 'true'](https://img.kancloud.cn/f5/32/f53290e16e53938f3a4ff5da8248db9d_709x786.jpg)
这些称为“条件断点”。
- JavaTutorialNetwork 中文系列教程
- Java 基础
- Java 概述
- 在 Ubuntu 上安装 Java 8 JDK
- Java Eclipse 教程
- Eclipse 快捷方式
- 简单的 Java 示例
- Java 基本类型
- Java 循环
- Java 数组
- Java 读取文件示例
- Java 对象和类教程
- 什么是面向对象编程(OOP)
- Java 封装示例
- Java 接口示例
- Java 继承示例
- Java 抽象示例
- Java 多态示例
- Java 中的方法重载与方法覆盖
- Java 控制流语句
- Java 核心
- 如何在 Windows,Linux 和 Mac 上安装 Maven
- 如何使用 Maven 配置文件
- 如何将自定义库包含到 Maven 本地存储库中
- 如何使用 JUnit 进行单元测试
- 如何使用 Maven 运行 JUnit 测试
- 如何在 Java 中使用 Maven 创建子模块
- 如何使用 Maven 创建 Java JAR 文件
- 如何使用 Maven 创建 Java WAR 文件
- JVM 解释
- Java 内存模型解释示例
- 捕获 Java 堆转储的前 3 种方法
- Java 垃圾收集
- Java 互斥量示例
- Java 信号量示例
- Java 并行流示例
- Java 线程同步
- Java 线程池示例
- Java ThreadLocal示例
- Java 中的活锁和死锁
- Java Future示例
- Java equals()方法示例
- Java Lambda 表达式教程
- Java Optional示例
- Java 11 HTTP 客户端示例
- Java 类加载器介绍
- Java 枚举示例
- Java hashCode()方法示例
- 如何测试独立的 Java 应用程序
- SWING JFrame基础知识,如何创建JFrame
- Java SWING JFrame布局示例
- 在JFrame上显示文本和图形
- 与JFrame交互 – 按钮,监听器和文本区域
- 如何使用 Maven 创建 Java JAR 文件
- Java Collection新手指南
- 选择合适的 Java 集合
- Java ArrayList示例
- Java LinkedList示例
- Java HashSet示例
- Java TreeSet示例
- Java LinkedHashSet示例
- Java EnumSet示例
- Java ConcurrentHashSet示例
- Java HashMap示例
- Java LinkedHashMap示例
- Java TreeMap示例
- Java EnumMap示例
- Java WeakHashMap示例
- Java IdentityHashMap示例
- Java SortedMap示例
- Java ConcurrentMap示例
- Java Hashtable示例
- Java 中ArrayList和LinkedList之间的区别
- Java HashMap迭代示例
- Java HashMap内联初始化
- Java 中HashMap和TreeMap之间的区别
- Java 图示例
- Java 深度优先搜索示例
- Java 广度优先搜索示例
- 不同的算法时间复杂度
- Java 序列化示例
- Java 反射示例
- Java 中的弱引用
- Java 8 日期时间 API
- Java 基本正则表达式
- 使用 Java 检索可用磁盘空间
- Java 生成 MD5 哈希和
- Java 增加内存
- Java 属性文件示例
- 如何在 Eclipse 上安装 Java 9 Beta
- Java 9 JShell 示例
- Java 9 不可变列表示例
- Java 9 不可变集示例
- Java 9 不可变映射示例
- Java 单例设计模式示例
- Java 代理设计模式示例
- Java 观察者设计模式示例
- Java 工厂设计模式
- Java 构建器设计模式
- Java 比较器示例
- Java 发送电子邮件示例
- Java volatile示例
- Java Docker 和 Docker 容器简介
- 安装和配置 MySQL 数据库和服务器以供 Spring 使用
- 如何在 Java 中使用 MySQL 连接器
- 如何使用 Eclipse 调试 Java
- Java EE
- 如何在 Windows 10 中设置JAVA_HOME
- JavaBeans 及其组件简介
- 如何安装和配置 Tomcat 8
- 如何在 Tomcat 中部署和取消部署应用程序
- 从 Eclipse 运行 Tomcat
- Java Servlet 示例
- Java Servlet POST 示例
- Servlet 请求信息示例
- Servlet 注解示例
- 使用初始化参数配置 Java Web 应用程序
- Java Servlet 文件上传
- Java JSP 示例
- Glassfish 启用安全管理
- 如何使用 MySQL 配置 Glassfish 4
- Java 文件上传 REST 服务
- Glassfish 和 Jetty 的 Java WebSockets 教程
- 基于 Glassfish 表单的身份验证示例
- 如何使用 Java EE 和 Angular 构建单页应用程序
- Spring
- 在 Eclipse 中安装 Spring STS
- 使用 STS 创建简单的 Spring Web App
- Spring Web Framework 简介
- Java Docker 和 Docker 容器简介
- 在 Spring 中实现控制器
- Spring 中的PathVariable注解
- Spring 中的RequestBody注解
- Spring 中的RequestParam注解
- Spring 拦截器
- Spring IOC
- Java Spring IoC 容器示例
- Spring 中的DispatcherServlet
- Spring 示例中的依赖注入
- 实现 Spring MVC 控制器
- Spring ORM 简介
- 什么是 DAO 以及如何使用它
- 如何对 DAO 组件进行单元测试
- 如何对控制器和服务执行单元测试
- 安装和配置 MySQL 数据库和服务器以供 Spring 使用
- 如何在 Spring 中处理登录身份验证
- Spring Security 简介及其设置
- 如何使用 Spring 创建 RESTful Web 服务
- Spring CSRF 保护
- Spring 中基于 OAuth2 的身份验证和授权
- Spring Boot 简介
- Spring MVC 框架介绍
- Spring JDBC 简介
- 如何 docker 化 Spring 应用程序
- Spring 的@Autowired注解
- Spring AOP 中的核心概念和建议类型
- Sping Bean 简介
- 如何在 Java 中使用 MySQL 连接器
- 安卓
- 安装和配置 Android Studio
- 将 Android 设备连接到 Android Studio
- Android 简介,活动,意图,服务,布局
- 创建一个简单的 Android 应用
- 运行和调试 Android 应用程序
- 在虚拟设备上运行 Android 应用程序
- Android 活动示例
- Android 意图示例
- Android 服务示例
- Android 线性布局示例
- Android 相对布局示例
- Android Web 视图示例
- Android 列表视图示例
- Android 网格视图示例
- 带有ListAdapter的 Android ListView示例
- Android SQLite 数据库介绍
- Android SQLite 数据库示例
- Android 动画教程
- Android 中的通知
- Android 中的事件处理
- 如何在 Android 中发送带有附件的电子邮件
- 杂项
- 选择您的 JAVA IDE:Eclipse,NetBeans 和 IntelliJ IDEA
- Java S3 示例
- 如何在 Ubuntu 上为多个站点配置 Apache
- 如何在 Liferay DXP 中替代现成的(OOTB)模块
- 简单的 Git 教程
- 使用 Java 捕获网络数据包
- Selenium Java 教程
- 使用特定工作区运行 Eclipse
- 在 Eclipse 中安装 SVN
- 如何运行 NodeJS 服务器
- SQL 内连接示例
- SQL 左连接示例
- SQL 右连接示例
- SQL 外连接示例
- 树莓派
- Raspberry Pi 3 规格
- 将 Raspbian 安装到 SD 卡
- Raspberry Pi 首次启动
- 远程连接到 Raspberry Pi
- 建立 Raspberry Pi 远程桌面连接
- Raspberry Pi Java 教程
- 使用 PWM 的 Raspberry Pi LED 亮度调节
- Raspberry Pi 控制电机速度
- Raspberry Pi 用 Java 控制直流电机的速度和方向