【问题标题】:JSR-75 specific code on non JSR-75 devices?非 JSR-75 设备上的 JSR-75 特定代码?
【发布时间】:2010-03-22 14:34:06
【问题描述】:

我要做什么

我正在编写一个 J2ME midlet,我想使用 JSR-75 来编写文件。我还希望能够在不支持 JSR-75 的设备上运行我的应用程序。

我是怎么做的

我找到了一个解释如何执行此操作的网站(忘记网址,抱歉):

  • 创建一个公开所有功能的公共抽象类(“服务”)。
  • 创建一个包私有类(“ServiceImplementation”)扩展这个抽象类,实现所有功能。
  • 将两者放在一个单独的包中,将 Service 呈现为包的外观。

为了实例化这个类,使用了抽象类中的以下方法:

public static Service getInstance() {
    try {
        Class.forName("javax.microedition.io.file.FileConnection");
        Class c = Class.forName("my.package.Service");
        Service service = (Service) (c.newInstance());
        return service;
    } catch (Exception e) {
        return null;
    }
}

出了什么问题

当存在 JSR-75 时,这非常有效。问题是我希望这个 midlet 也能在非 JSR-75 设备上运行,并且当我尝试这样做时,这段代码会抛出 ClassNotFoundException: javax/microedition/io/file/FileConnection,即使我正在捕获所有异常.

我已经进行了项目范围的搜索,以确保我没有在其他任何地方使用 FileConnection,而是在 Service 和 ServiceImplementation 中使用。

有人知道我应该怎么做吗?

【问题讨论】:

  • 执行 Class.forName() 足以引发 ClassNotFoundException,因为它会尝试加载类以创建 Class 对象。
  • 当然可以,但是由于我捕获了所有异常,它不应该导致应用程序因该异常而停止。

标签: java-me classnotfound jsr75


【解决方案1】:

对你在做什么有点困惑,尤其是在不同包中的两个类都称为服务!但是我在编写代码以在有和没有某些 JSR 的手机上运行时遇到了这个问题。

您是否在 Service 类中引用了 JSR-75 类?我怀疑即使您没有实例化 Service 类,它仍在加载中。然后 JVM 会遇到这些不存在的类。

将所有对 JSR-75 类的引用移动到一个从 Service 类引用的类中。

【讨论】:

  • 我已经这样做了。我只有一个名为 Service 的类和一个名为 ServiceImplementation 的类,它们都在同一个包中。后者是包私有的,这是我引用 JSR-75 类的唯一类。不管怎样,现在已经解决了。我只是不明白为什么一个应该被捕获的异常仍然被抛出,导致应用程序停止。
  • Service(从所有手机访问)是否引用 ServiceImplementation(引用 JSR-75)?尝试将 JSR-75 引用移动到仅从 ServiceImplementation 引用的另一个类。
  • 没有直接引用 ServiceImplementation。唯一的“引用”在 Service 中,如下所示:Class.forName("my.package.ServiceImplementation").newInstance()。但正如您在我自己的答案中的 cmets 中看到的那样,它现在可以工作了。
【解决方案2】:

显然我可以使用这个:

System.getProperty("microedition.io.file.FileConnection.version");

如果返回 null,则不支持 JSR-75。如果它返回其他任何东西,它就是。

【讨论】:

  • 这两种方法都应该有效。如果你替换 try { Class.forName("javax.microedition.io.file.FileConnection"); ... 上面代码中的等 if (System.getProperty("microedition.io.file.FileConnection.version") != null) { ... 一切正常吗?
  • 是的,这种方法有效。我想接受我的答案作为已接受的答案,但我必须再等 5 个小时...
猜你喜欢
  • 2010-11-21
  • 2010-10-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-01-22
  • 1970-01-01
相关资源
最近更新 更多