1. 程式人生 > >java,某行程式碼不執行,也不報錯。JaxWsDynamicClientFactory.newInstance();

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,即沒辦法深入讀每一個原始碼。