8

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

有什么方法可以将 JavaME 中的堆栈跟踪文本作为字符串获取?

更新:

我应该提到我仅限于 CLDC 1.0

4

5 回答 5

3

两种解决方案:

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

  • 使用 Symbian 设备。

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

这使得 Symbian 可以创建一个名为 redirector 的 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 上工作

于 2008-10-22T15:18:47.360 回答
2

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

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

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

于 2008-10-22T14:00:18.203 回答
0

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

于 2008-10-22T13:40:24.937 回答
0

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

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

于 2010-07-06T14:09:28.360 回答
-2

您可以让 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 中可用,但这并没有说明其他配置文件。

于 2008-10-22T12:21:45.673 回答