2012-04-19 145 views
4

我使用的是專有的API開發Java程序在Eclipse和它拋出在運行時出現以下異常:API拋出java.io.UnsupportedEncodingException

java.io.UnsupportedEncodingException: 
    at java.lang.StringCoding.encode(StringCoding.java:287) 
    at java.lang.String.getBytes(String.java:954)... 

我的代碼:

private static String SERVER = "localhost"; 
private static int PORT = 80; 
private static String DFT=""; 
private static String USER = "xx"; 
private static String pwd = "xx"; 


public static void main(String[] args) { 

    LLValue entInfo = new LLValue(); 
    LLSession session = new LLSession(SERVER, PORT, DFT, USER, pwd); 

    try { 
     LAPI_DOCUMENTS doc = new LAPI_DOCUMENTS(session); 
     doc.AccessPersonalWS(entInfo); 
    } catch (Exception e) { 
     e.printStackTrace(); 
    } 
} 

會話似乎打開沒有錯誤,但編碼異常拋出在doc.AccessEnterpriseWS(entInfo)

通過研究此錯誤,我嘗試使用-encoding選項的編譯器,改變了我的編輯器的編碼等

我的問題是:

  1. 我怎麼能找到.class文件我想使用的編碼?
  2. 我應該將我的新程序的編碼與API的編碼相匹配嗎?
  3. 如果java是機器獨立的,爲什麼不存在標準編碼?

我已閱讀this堆棧跟蹤和this指南已經 -

任何建議將不勝感激!

乾杯與String.getBytes()StringCoding.encode()斷點調試器

回答

2

運行它。兩者都是JDK中的類,因此您可以訪問它們,並且應該能夠看到第三方通過的內容。

character encoding用於指定如何解釋原始二進制文件。 CP1252中英文Windows系統的默認編碼。其他語言和系統可能使用不同的默認編碼。作爲一個快速測試,您可以嘗試指定UTF-8來查看問題是否奇蹟般消失。

this question所述,JVM使用OS的默認編碼,但您可以覆蓋此默認值。

不知道更多關於您嘗試使用的第三方API,很難說他們可能會使用什麼編碼。不幸的是,從執行StringCoding.encode()看來,有幾種不同的方法可以獲得UnsupportedEncodingException。通過調試器進行調試應該有助於縮小範圍。

+0

感謝您的徹底解答 - 我沒有意識到我可以在導入的類中創建斷點! – keighty 2012-04-20 13:15:13

+0

我應該提到的一個缺點是,你很可能會在'String'或'StringCoding'中的方法中找到斷點,這些斷點會被觸發一噸(這些是經常使用的類)。爲了避免逐句通過每個實例,可以嘗試在不常用的方法中暫時放置*在感興趣的方法之前,然後在該斷點觸發器將實際想要檢查的方法添加一個時。或者如果您的IDE支持它,請添加一個條件斷點,以便它只觸發您感興趣的實例。祝您好運! – 2012-04-20 14:07:03

0

它在我看來好像專有API中的某些內容使用字符集的空字符串調用String.getBytes

我整理了以下類

public class Test2 { 
    public static void main(String[] args) throws Exception { 
     "test".getBytes(""); 
    } 
} 

,當我跑了,我得到了下面的堆棧跟蹤:

 
Exception in thread "main" java.io.UnsupportedEncodingException: 
     at java.lang.StringCoding.encode(StringCoding.java:286) 
     at java.lang.String.getBytes(String.java:954) 
     at Test2.main(Test2.java:3) 

我會感到驚訝,如果這是什麼做的編碼,其中類文件被寫入。在我看來,這是代碼問題,而不是通過更改文件編碼或編譯器/ JVM開關可解決的問題。

我不知道這個專有API應該做什麼或它是如何工作的。也許它期望在Java EE或Web應用程序容器中運行?也許它有一個錯誤?也許它需要更多配置才能運行,而不會拋出異常?鑑於它是專有的,你能得到供應商的任何支持嗎?

+0

我喜歡它可能希望在網絡應用程序容器中運行的建議 - 不幸的是,我們從第三方獲得了該程序的許可,並且他們不願意支持該API,這表明他們更願意自己進行開發。感謝您的回答 - 這非常有幫助! – keighty 2012-04-20 13:12:08

+0

您的代碼存在問題: 「test」.getBytes(「」); 是您爲「getBytes」方法提供了空字符串參數。根據API,它應該是一個有效的字符集,這就是「UnsupportedEncodingException」被拋出的原因。您可以省略此參數,並且將應用默認的OS編碼或使用有效的編碼。 – vs777 2016-06-04 15:04:17

+0

@ vs777:我的代碼沒有問題,它應該會引發異常。重點是演示如何重現異常信息和出現在問題中的堆棧跟蹤的前幾行,並且它能夠成功地執行或拒絕行號。 – 2016-06-04 18:40:00

相關問題