使用Eclipse开发和调试java程序

来源:互联网 发布:python if else 简写 编辑:程序博客网 时间:2024/05/17 10:53

刚刚学习Java不久,从C#Java的语言跨度倒是没有多大,但是编译器从VS2013换成Eclipse,最开始还是有些许的不适应。因此做个笔记跟和我一样的初学者分享一下经验。

下面简单介绍一下Eclipse开发环境,并通过一个小例子简单介绍一下Eclipse下调试Java程序的一些方法。

 

Eclipse是一款非常优秀的开源IDE(集成开发环境),基于Java的可扩展开发平台。除了可作为 Java 的集成开发环境外,还可以作为编写其他语言(如 C++ Ruby)的集成开发环境。

整个 Eclipse 体系结构就像一个大拼图,可以不断地往其中添加插件,同时,现有插件上还可以再增加插件。可以说,在Eclipse平台中,几乎一切都是插件。从架构上来讲,Eclipse基本采用的是“内核+核心插件+定制插件”的结构体系,除了内核部分外,其余部分均为插件,其体系结构如下图所示:


 

各组成部分功能为:

·     PlatformRuntime(平台运行库)是Eclipse平台核心,它是一个微内核,负责管理插件注册表和插件,其他所有的功能如 WorkSpace  WorkBench 等都是以插件的形式提供。Eclipse启动时,平台运行库需要完成2个简单的动作:一是启动平台;二是查找系统的功能插件,并在内存中构建一个插件注册表。

·     WorkSpace(工作空间)是负责管理用户资源的插件。用户资源包括用户创建的项目和项目中的文件等。WorkSpace相当于 Model-View-Controller结构中的Model

·     WorkBench(工作台)插件为Eclipse提供用户界面。它为添加用户界面(UI)组件(例如视图、菜单)定义了扩展点(ExtensionPoints),同时也提供了附加工具集(SWTJFace)用于建造用户界面。工作台是在JFace/SWT和平台运行库的基础上构建。 WorkBench 相当于 Model-View-Controller 结构中的ViewWorkBench  WorkSpace  Eclipse 平台的 2 个必备插件,它们提供了大多数插件使用的扩展点。

·     SWTStandardWidget Toolkit,标准小窗口工具箱)是Eclipse平台自己开发的图形API包,作用和JavaAWT/SwingGUI API一样,用来构建图形界面。

·     JFace是使用SWT来实现的一个用户界面工具包,用于处理常见的用户界面编程任务,使工具开发者专注于实现插件的功能,而不必在界面设计上花过多的精力。

·     Help(帮助系统)定义了插件扩展点,提供一个附加的导航结构,允许工具以HTML文件的形式添加文档。

·     Team(团队)插件负责提供版本控制和配置管理支持。

(上面内容摘自《Eclipse 3.0 程序开发技术详解》)

 

Eclipse的安装过程比较简单,在安装Eclipse之前首先需要安装JDK,最新版本的JDK可以到http://www.oracle.com上面下载,安装完成后不要忘记配置环境变量。

接着可以到http://www.eclipse.org上面下载Eclipse安装包进行安装。

 

安装完成后,打开Eclipse界面如下(第一次打开会提示配置Workspace的路径,配好就行):


MacWindows下界面大体相同,菜单栏位置不同)

除了我们看到的这些,还有一些视图默认不显示,可以通过菜单栏中的“窗口(Window)”—“显示视图(Show View)”来控制视图的显示,对于界面中的视图,可以通过拖拽标题栏(带圆角的矩形标签)来重新布局。

上面的界面中,资源管理器列出了项目以及项目中的文件,编辑器用来编辑我们打开的文件中的代码,大纲视图列出了程序主要结构,控制台,任务,错误信息,变量等等视图用来辅助开发。

在工具栏最左侧带加号的按钮()用来创建新的工程、类、接口等等。点击按钮右侧的黑色箭头,在弹出菜单中选择“其他”,我们可以在弹出的Wizard中选择我们要创建的东西:


我们选择Java Project创建一个Java工程,在点击“下一步(Next)”后,将项目命名为“HelloWorld”,勾选生成main方法的复选框(publicstatic void main),然后点击“完成(Finish)”。

接着我们再用创建按钮创建两个类ClassAClassBClassB继承ClassA,向其中添加一些属性和方法用来做调试。

Eclipse在创建项目的时候会自动将系统库导入到项目中,如果需要在项目中导入其他JAR包的类,可以再菜单中选择“项目(Project)”—“属性(Properties)”,在弹出对话框的左侧列表中选择“Java构建路径(Java Build Path)”,然后在右侧选择“库(Libraries)”选项卡进行编辑:


 

在编辑代码的时候,有一些快捷键可以帮助我们加快开发速度:

注:对于Mac系统,下面的Ctrl键对应Command键。

格式化代码的快捷键:Ctrl+Shift+F,如果没有选中代码,则会将整个文件中的代码进行格式修正。

注释和取消注释:Ctrl+/ 

关于注释多说一点,为了生成 JavaDoc 文件,通常会在注释中添加代码标记,例如:

/**

 * @authorsomeone

 */

在“/**…*/”中添加@标记时,Eclipse会有相关的提示。

查找内容(替换):Ctrl+F

转到定义:F3

添加/删除断点:Ctrl+Shift+B(也可以通过双击行头来添加删除断点)

执行:Ctrl+Shift+F11

调试:Ctrl+F11

单步调试(Step Over):F6

(调试)进入方法内(Step Into):F5

(调试)跳出方法(Step Return):F7

(调试)继续到下一个断点:F8

这里只是一些常用的快捷键,除此之外,我们可以通过Ctrl+Shift+L快捷键来查看所有快捷键及其说明:


 

下面我们来看一下Eclipse中调试的一些技巧。

首先我们在测试程序中添加下面的代码:

public classHelloWorld {

 

     public static void main(String[] args) {

          fun1();

     }

 

     private static void fun1() {

          System.out.println("fun1 called");

          fun2();

     }

 

     private static void fun2() {

           System.out.println("fun2 called");

          fun3();

     }

      

     private static void fun3() {

          System.out.println("fun3 called");

     }

}

我们在fun3中添加一个断点:


然后我们开始调试(Ctrl+F11),F8执行到我们添加的这个断点,这时我们看一下Debug视图:


可以看到,函数的执行堆栈被打印了出来,点击栈中的调用方法可以迅速的切换到对应的方法定义中。

我们再切换到Breakpoints视图中可以查看和管理所有的断点:


 

接着我们修改fun3,在其中添加下面的代码:

int m = 1;

int n = 2;

{

     int k = 3;

     int j = 4;

     m = k + j;

     n = k - j;

}

int t = m + n;

在“int m=1;”所在行添加断点,然后调试,我们看到,在调试的过程中,当前作用域中所有可见的变量以及变量的值都显示在Variables视图中:


我们可以双击右侧Value下面的值来编辑变量的值。

 

除此之外,我们还可以在Expressions视图中跟踪表达式的值:


除了这些基本的值类型的加减,expressions中也可以包含函数。表达式计算的前提是表达式中出现的变量或者函数都在当前作用域中可见,否则窗口中会提示下面的错误信息:


 

接着我们说说断点。

条件断点:

按住Ctrl键双击我们添加的断点(或者在右键菜单中选择断点属性),打开断点属性对话框:


Hit count用来设置当当前断点命中次数达到指定次数时,断点生效,生效有两个选择,一个是挂起当前线程,另一个是挂起虚拟机(额,这个不知道是干神马用的,不解释,有兴趣的朋友研究下吧)。例如我们写一个循环:

int m = 1;

for (int i = 0; i< 100; i++) {

     m += i;

}

我们希望仅仅在第20次循环的时候查看一下m的值,我们设置条件断点:


设置完成后,发现原来蓝色的断点变为白色的,并且鼠标放上去会显示出我们设置的条件:


执行结果也和我们预想的一样,只有在i=19的时候断点才生效。

Hit count下面还有一个Conditional选项,我们勾选Conditional,发现后面有两个选项,当我们选中“Suspend when ‘true’”的时候,在下方的文本框中输入一个返回值是boolean的表达式,当这个表达式为真的时候,断点生效。例如我们希望在m大于200的时候查看i的值,可以这样设置断点:


如果我们选择“Suspend when value changes”,那么我们在下面的文本框中输入一个变量的名称即可,当变量的值发生变换的时候,断点就会生效。

 

监视断点(Watchpoint):

用来跟中成员变量的值的变化(和上面的“Suspend when value changes”类似,但是“Suspend when value changes”选项对于作用域之外的调用就无能为力了)。添加监视断点的方法和添加其他断点的方法相同,在成员变量的声明语句所在行正常添加断点就可以了:


可以看到,监视断点的标识由一个眼镜符号和一只铅笔符号组成,添加好监视断点后,每当程序试图修改变量s的值(包括初始化)或者程序访问s的值时,程序就会在所在行中断。

我们也可以编辑监视断点的属性,Access表示程序访问变量的时候会中断,Modification表示程序试图修改变量的值的时候会中断,这两个属性也就对应了监视断点图标中的眼镜和铅笔,如果修改属性,断点的图标也会变化。


 

方法断点:

我们在方法的定义所在行添加的断点为方法断点,添加方法和之前相同,编辑方法断点的属性,我们看到多了“Entry”和“Exit”选项:


Entry”表示在进入方法时会中断,“Exit”表示退出方法时中断,效果与在方法的开头和结尾添加断点相同。

 

异常断点:

我们希望当程序抛出某个异常时中断,这是就要用到异常断点。设置异常断点的方法和之前的方法有所不同,我们在Breakpoints视图中点击“Add Java Exception Breakpoint”按钮来添加:


在弹出的菜单中我们可以在列表中选择异常类型,也可以自己输入,例如我们这里添加下面的代码:

try {

     int[] arr = { 1, 2, 3 };

     int el = arr[3];

} catch(ArrayIndexOutOfBoundsException e) {

} finally {

}

这段代码在执行的时候会抛出下面的异常:

java.lang.ArrayIndexOutOfBoundsException,但是由于我们添加了try-catch,所以在调试的时候程序不会在抛异常中断,这时我们就可以通过添加异常断点来捕获这个异常的位置。

 

类载入断点(Class Load Breakpoint):

这种断点不常用到,当某个类被加载的时候,会中断程序,添加方法为在类的定义的第一行(例如:public class SomeClass)添加断点。

 

当我们调试的时候一不小心过头了怎么办?这个时候“回退”可以帮我们解决问题。回退只能在当前线程的堆栈中进行,例如我们最开始的例子,假设我们调试到fun3了,我们在Debug视图中选择fun1的堆栈行,在右键菜单中选择“Drop To Frame”:


 

就可以重新退回到fun1去重新调试。

 

上面就是Eclipse开发和调试过程中的一些心得和技巧,如果有不清楚的地方欢迎留言讨论。

83 0
原创粉丝点击