Java基礎(chǔ)之異常機(jī)制學(xué)習(xí)&分析--(二)
調(diào)試技巧
可以用下面的方法打印或記錄任意變量的值
System.out.print("x="+x)
或者
Logger.getGlobal().info("x="+x)
為每個(gè)類添加 main 方法,后期要?jiǎng)h除
單元測(cè)試
日志代理是一個(gè)子類對(duì)象,他可以截獲方法調(diào)用,并進(jìn)行日志記錄,然后調(diào)用超類中的方法,例如:
如果在調(diào)用Random類的nextDouble方法時(shí)出現(xiàn)了問(wèn)題,就可以按照下面的方式,以匿名子類實(shí)例的形式創(chuàng)建一個(gè)代理對(duì)象。
Random generator=new Random(){
public double nextDouble(){
double result=super.nextDouble();
Logger.getGlobal().info("nextDouble:"+result);
return result;
}
};
當(dāng)調(diào)用 nextDouble 方法時(shí),就會(huì)產(chǎn)生一個(gè)日志消息。要想知道誰(shuí)調(diào)用了這個(gè)方法,就要生成一個(gè)堆棧軌跡。
利用 Throwable 類提供的 printStackTrace方法,可以從任何一個(gè)異常對(duì)象中獲得堆棧情況。下面的代碼將捕獲任何異常,打印異常
對(duì)象和堆棧軌跡,然后重新拋出異常,以便能夠找到相應(yīng)的處理器。
try{
...
}catch(Throwable t){
t.printStackTrace;
throw t;
}
不一定要通過(guò)捕獲異常類生成堆棧軌跡,只要在代碼的任何位置插入下面這條語(yǔ)句就可以獲得堆棧軌跡;
Thread.dumpStack()
一般來(lái)說(shuō),堆棧軌跡顯示在 System.err 上。也可以利用 printStackTrace(PrintWriter s) 方法將它發(fā)送到一個(gè)文件。
另外,如果要記錄或顯示堆棧軌跡,就可以采用下面的方式,將它捕獲到一個(gè)字符串:
StringWriter out = new StringWriter();
new Throwable().printStackTrace(new PrintWriter(out));
String description = out.toString();
要想觀察類的加載過(guò)程,可以用 -verbose 標(biāo)志啟動(dòng)Java 虛擬機(jī),這種方法有助于診斷由于類路徑引發(fā)的問(wèn)題。
-Xlint 選項(xiàng)告訴編譯器對(duì)一些普通容易出啊先的代碼問(wèn)題進(jìn)行檢查。例如,如果使用下面這條命令編譯:
javac -Xlint:fallthrough
當(dāng)switch語(yǔ)句中缺少break語(yǔ)句時(shí),編譯器就會(huì)給出報(bào)告。
Java虛擬機(jī)增加了對(duì)Java應(yīng)用程序進(jìn)行監(jiān)控和管理的支持。它允許利用虛擬機(jī)中的代理裝置跟蹤內(nèi)存消耗,線程使用,類加載等情況。這個(gè)功能對(duì)于
像應(yīng)用程序服務(wù)器這樣大型的、長(zhǎng)時(shí)間運(yùn)行的Java程序來(lái)說(shuō)特別重要。
找出運(yùn)行虛擬機(jī)的炒作系統(tǒng)進(jìn)程的ID。在UNIX/Linux環(huán)境中,運(yùn)行ps實(shí)例工具,在Windows環(huán)境中,使用任務(wù)管理器,然后運(yùn)行jconsole 程序:
jconsole processID
可以使用 jmap 實(shí)用工具獲得一個(gè)堆的轉(zhuǎn)儲(chǔ),其中顯示了堆的轉(zhuǎn)儲(chǔ),其中顯示了堆中的每個(gè)對(duì)象。使用命令如下:
jmap -dump:format=b,file=dumpFileName processID
然后,通過(guò)瀏覽器進(jìn)入 localhost:7000,將會(huì)運(yùn)行一個(gè)網(wǎng)絡(luò)應(yīng)用程序,借此可以探查轉(zhuǎn)儲(chǔ)對(duì)象時(shí)堆的內(nèi)容。
作者:碼農(nóng)飛哥
微信公眾號(hào):碼農(nóng)飛哥