6

我正在使用专有 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

2 回答 2

3

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

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

本问题所述,JVM 使用操作系统的默认编码,尽管您可以覆盖此默认值。

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

于 2012-04-19T21:04:34.820 回答
0

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

我编译了以下类

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

当我运行它时,我得到了以下堆栈跟踪:

线程“主”java.io.UnsupportedEncodingException 中的异常:
        在 java.lang.StringCoding.encode(StringCoding.java:286)
        在 java.lang.String.getBytes(String.java:954)
        在 Test2.main(Test2.java:3)

如果这与编写类文件的编码有关,我会感到惊讶。在我看来,这是代码的问题,而不是您可以通过更改文件编码或编译器/JVM 开关来解决的问题。

我不知道这个专有 API 应该做什么或它是如何工作的。也许它期望在 Java EE 或 Web 应用程序容器中运行?也许它有一个错误?也许它需要更多配置才能运行而不会引发异常?鉴于它是专有的,您可以从供应商那里获得任何支持吗?

于 2012-04-19T21:30:49.000 回答