API抛出java.io.UnsupportedEncodingException

时间:2012-04-19 20:56:09

标签: java

我正在使用专有API在eclipse中开发一个Java程序,它在运行时抛出以下异常:

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与机器无关,为什么没有标准编码?
  4. 我已经阅读了this堆栈跟踪和this指南 -

    任何建议都将不胜感激!

    干杯

2 个答案:

答案 0 :(得分:3)

在调试器中使用String.getBytes()StringCoding.encode()上的断点运行它。两者都是JDK中的类,因此您可以访问它们,并且应该能够看到第三方传入的内容。

character encoding用于指定如何解释原始二进制文件。 CP1252中英文Windows系统的默认编码。其他语言和系统可以使用不同的默认编码。作为快速测试,您可以尝试指定UTF-8以查看问题是否神奇地消失。

this question所述,JVM使用操作系统的默认编码,但您可以覆盖此默认编码。

在不了解您尝试使用的第三方API的情况下,很难说他们可能使用的是哪种编码。不幸的是,通过查看StringCoding.encode()的实现情况,您可以通过几种不同的方式获得UnsupportedEncodingException。单步执行调试器应该有助于缩小范围。

答案 1 :(得分:0)

在我看来,好像专有API中的某些东西正在使用字符集的空字符串调用String.getBytes

我编译了以下类

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

当我运行它时,我得到了以下stacktrace:

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应用程序容器中运行?也许它有一个bug?也许它需要更多配置才能运行而不抛出异常?鉴于它是专有的,你能得到供应商的任何支持吗?