【问题标题】:How to get the text of an exception stack trace in Java ME?如何在 Java ME 中获取异常堆栈跟踪的文本?
【发布时间】:2008-10-22 12:08:26
【问题描述】:

在常规 Java 中,您可以通过将 PrintWriter 传递给 printStackTrace 来获取堆栈跟踪的文本。我有一种感觉,我知道这个问题的答案(即“不”),但是,

有没有办法在 JavaME 中将堆栈跟踪的文本作为字符串获取?

更新:

我应该提到我仅限于 CLDC 1.0

【问题讨论】:

    标签: java java-me


    【解决方案1】:

    两种解决方案:

    • 在模拟器上重现异常。无线工具包和 Netbeans 将在您的计算机上打印堆栈跟踪。

    • 使用 Symbian 设备。

    在Series 60 第三版的Feature Pack 2 之前,Symbian 手机使用Sun Hotspot java 虚拟机。通过将其链接到 C 标准库的部分实现,它适用于 Symbian OS。

    这允许 Symbian 创建一个名为重定向器的 C++ 程序,该程序能够捕获 VM 标准输出和标准错误,包括 java 异常堆栈跟踪。

    C++ 重定向器从未升级到 Symbian OS 版本 9。而是在 VM 中引入了“redirect://”GCF 协议,

    从一个单独的 MIDlet,从 Connector.open("redirect://", Connector.READ); 返回的连接打开一个 InputStream;然后,您可以在 Symbian 手机上捕获异常堆栈跟踪。

    编辑:“redirect://”又回到了 Series60 第 5 版,而“redirect://test”应该可以在 Series60 第 3 版功能包 2 中使用

    【讨论】:

    • 不幸的是,我的问题仅限于一台设备(Moto V3xx)。幸运的是,它有一个等效的重定向器,可以让我看到控制台输出。
    • 有趣。您知道重定向器等效项是否适用于其他摩托罗拉手机?你能给我们解释一下如何使它工作吗?
    【解决方案2】:

    AFAIK 无法将堆栈跟踪作为字符串值获取,除非特定平台提供了覆盖默认 System.err 流的方法。在 BlackBerry 平台上,它会抛出 catch(Exception) 上的堆栈跟踪以节省内存,但它不会在 catch(Throwable) 上执行此操作,而是通过设备事件日志访问堆栈跟踪。

    我最终做的是在最后一刻捕获 Throwable 而不是 Exception 并从那里打印堆栈跟踪。这当然有危险,你也捕捉到java.lang.Error,这不是很好,特别是如果它的OutOfMemoryError,虽然在打印堆栈跟踪之前调用System.gc()似乎可以降低风险,我们没有'没有任何问题。

    我会查看您所针对的任何平台,看看他们是否允许在某处访问 System.err。您总是可以连接一个调试器,它应该出现在控制台输出中,尽管听起来您是在“现场”获取堆栈跟踪之后。

    【讨论】:

      【解决方案3】:

      我不认为在 CLDC 1.0 中有办法做到这一点。但是,在某些设备/操作系统上,底层 Exception 类可能提供了一种访问堆栈跟踪的方法(想想更新的 CLDC 版本)。只需在运行时使用反射检查异常实例,即可查看它在目标平台上公开了哪些成员。然后,您可以编写一些代码,以便在提供此类信息的平台上安全地提取堆栈跟踪。

      【讨论】:

        【解决方案4】:

        我创建了一个工具,该工具也可用于在 CLDC 中记录正确的堆栈跟踪。查看http://jarrut.sourceforge.net。它仍然很新,可能有一些粗糙的边缘,但它对我有用,我无法想象没有它来开发 MIDlet。使用它的最佳方式是与 microlog 结合使用。

        不幸的是,该工具目前需要 CLDC 1.1,因此它可能无法解决原始海报的问题。

        【讨论】:

          【解决方案5】:

          您可以让 PrintWriter 写入 ByteArrayOutputStream 并根据字节重构字符串。

          try{
              throw new Exception("Message");     
          } catch (Exception ex){
              ByteArrayOutputStream out = new ByteArrayOutputStream();
              ex.printStackTrace(new PrintStream(out));
              System.out.println(new String(out.toByteArray()));
          }
          

          它并不漂亮,但它应该几乎可以在任何地方工作。在您尝试上述方法之前,请确保您无权访问 [Throwable#getStackTrace](http://java.sun.com/j2se/1.4.2/docs/api/java/lang/Throwable.html#getStackTrace()),Eclipse 声称它在 CDC/Foundation 1.1 中可用,但这并没有说明其他配置文件。

          【讨论】:

          • 我在 CLDC 1.0 上,但根据我在这里的文档,在任一配置文件中都无法将 PrintWriter 传递给 printStackTrace。
          猜你喜欢
          • 1970-01-01
          • 2011-06-01
          • 1970-01-01
          • 2023-03-22
          • 1970-01-01
          • 2011-01-05
          • 2020-01-27
          • 2011-08-30
          • 1970-01-01
          相关资源
          最近更新 更多