调试技巧
1.可以用下面的方法打印或记录任意变量的值
System.out.print("x="+x)
或者
Logger.getGlobal().info("x="+x)
2.为每个类添加 main 方法,后期要删除
3.单元测试
4.日志代理是一个子类对象,他可以截获方法调用,并进行日志记录,然后调用超类中的方法,例如:
如果在调用Random类的nextDouble方法时出现了问题,就可以按照下面的方式,以匿名子类实例的形式创建一个代理对象。
Random 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 上。也可以利用 printStackTrace(PrintWriter s) 方法将它发送到一个文件。
另外,如果要记录或显示堆栈轨迹,就可以采用下面的方式,将它捕获到一个字符串:
StringWriter out = new StringWriter(); new Throwable().printStackTrace(new PrintWriter(out)); String description = out.toString();
7.要想观察类的加载过程,可以用 -verbose 标志启动Java 虚拟机,这种方法有助于诊断由于类路径引发的问题。
8.-Xlint 选项告诉编译器对一些普通容易出啊先的代码问题进行检查。例如,如果使用下面这条命令编译:
javac -Xlint:fallthrough
当switch语句中缺少break语句时,编译器就会给出报告。
9.Java虚拟机增加了对Java应用程序进行监控和管理的支持。它允许利用虚拟机中的代理装置跟踪内存消耗,线程使用,类加载等情况。这个功能对于
像应用程序服务器这样大型的、长时间运行的Java程序来说特别重要。
找出运行虚拟机的炒作系统进程的ID。在UNIX/Linux环境中,运行ps实例工具,在Windows环境中,使用任务管理器,然后运行jconsole 程序:
jconsole processID
10.可以使用 jmap 实用工具获得一个堆的转储,其中显示了堆的转储,其中显示了堆中的每个对象。使用命令如下:
jmap -dump:format=b,file=dumpFileName processID
然后,通过浏览器进入 localhost:7000,将会运行一个网络应用程序,借此可以探查转储对象时堆的内容。