java,某行程式碼不執行,也不報錯。JaxWsDynamicClientFactory.newInstance();
寫cxf介面的客戶端呼叫的時候,:
clientFactory = JaxWsDynamicClientFactory.newInstance();這一句,不執行。
即不輸出,System.out.println("##################clientFactory");也不報錯。
很奇怪,不知道什麼原因。
把JaxWsDynamicClientFactory的原始碼放入工程中,發現根本不執行newInstance()方法。
去網上找,還真找到有人有相同的問題:
http://pangsir.iteye.com/blog/1492515
最後,找大牛,想辦法捕獲到了異常。
捕獲異常方式:
在debug模式下,設定斷點,在某段程式碼上執行 execute(注意:①一定要在這一行程式碼上設定斷點 ②並執行到這一行的時候,滿足這兩個條件時,再右擊execute才行,才能正常的丟擲異常,不然可能也不丟擲異常):
就會報錯:
然後通過提示的錯誤,去找解決問題就行了。
缺少包,找不到XmlSchemaSerializer$XmlSchemaSerializerException.class,引入所在包:
引入了這個包之後,
=====總結:
JaxWsDynamicClientFactory.newInstance();這個即不執行,也不報錯,是什麼原因?
原因是,其實JaxWsDynamicClientFactory.newInstance();這句話執行了,但是報異常了,只是系統沒有捕獲到而已,因為缺少捕獲異常的包。
這裡就不得不說一下(或者說吐槽一下)java的報錯機制,即在執行的時候(即編譯的時候沒問題,執行的時候有問題):
String a=null;
a.toString();
如會報null pointer等,這就是java的報錯機制。
這裡之所以會丟擲異常是因為,String這個封裝類的toString()函式裡寫了異常捕獲的程式碼(即try catch)
可能的實現方式如下
class String{
public String toString(Object ob){
try {
String result=ob.zhuanhuanchengString();//將object轉換成String
} catch (Exception e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
}
return result;
}
}
這樣如果ob是null就會報空指標異常了。
所以這裡是我理解錯了,該吐槽的不是java的報錯機制,機制沒有問題,異常的捕獲都是程式設計師自己寫的,所以歸根究底,是程式設計師自身的異常捕獲機制。
=====總結,在某行程式碼不執行,也不報錯的時候,怎麼除錯?
在某行程式碼不執行,也不報錯的時候,怎麼除錯?
1給他加上異常,即try catch,異常型別要用Exception,因為你不清楚是什麼異常(RuntimeException、RemoteException等)。
try {
clientFactory = JaxWsDynamicClientFactory.newInstance();
} catch (Exception e1) {
System.out.println(e1.toString());
// TODO Auto-generated catch block
e1.printStackTrace();
}
如果還是不報異常。請看步驟2
2在debug模式下,右擊“execute”這行程式碼,看報什麼錯。
----------總結:
有這種疑惑,不知所措的原因是,class被封裝在jar中,即class中,沒辦法去逐步去看原始碼。
封裝,即將class檔案放入jar,供java檔案呼叫,是java的特點,是java的優勢。
同時,卻也是java的劣勢,封裝不利於深入除錯、debug,即沒辦法深入讀每一個原始碼。