如何在Java ME中获取异常堆栈跟踪的文本?

8
在常规的Java中,您可以通过将PrintWriter传递给printStackTrace来获取堆栈跟踪文本。我有一种感觉,我知道答案(即“否”),但是,
在JavaME中是否有任何方法可以将堆栈跟踪作为字符串获取?
更新:
我应该提到我受限于CLDC 1.0
5个回答

3

两种解决方案:

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

  • 使用Symbian设备。

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

这使得Symbian可以创建一个名为redirector的C++程序,该程序能够捕获VM标准输出和标准错误,包括Java异常堆栈跟踪。

c++ redirector从未升级到Symbian OS的第9版。相反,在VM中引入了“redirect://”GCF协议,

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

编辑:“redirect://”已经回到Series60第5版,“redirect://test”应该适用于Series60第3版功能包2


不幸的是,我的问题只限于特定的设备(Moto V3xx)。幸运的是,它最终有了一个重定向器等价物,让我能够查看控制台输出。 - izb
有意思。你知道重定向相当于在其他摩托罗拉手机上工作吗?能不能给我们指一下如何使它工作的解释? - michael aubert

2
据我所知,除非特定平台提供覆盖默认System.err流的方式,否则无法将堆栈跟踪作为字符串值获取。在黑莓平台上,在catch(Exception)时会丢弃堆栈跟踪以节省内存,但是在catch(Throwable)时不会这样做,并通过设备事件日志访问堆栈跟踪。
我最终所做的是,在最后可能的时刻捕获Throwable而不是Exception,并从那里打印堆栈跟踪。当然,这样做有一个危险,就是你也会捕获java.lang.Error,这并不好,特别是如果它是OutOfMemoryError,尽管在打印堆栈跟踪之前调用System.gc()似乎可以减少风险,我们没有遇到任何问题。
我建议查看您正在针对的平台,并查看它们是否在某个地方提供了对System.err的访问权限。您始终可以连接调试器,它应该出现在控制台输出中,尽管听起来像是您想要在“现场”获取堆栈跟踪。

0

我创建了一个工具,可以用于在CLDC中记录正确的堆栈跟踪。请访问http://jarrut.sourceforge.net查看。它仍然非常新,并且可能存在一些问题,但对我来说很有效,我无法想象在没有它的情况下开发MIDlets。最好的使用方法是与microlog结合使用。

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


0

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


-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中可用,但这并不能说明其他配置文件的情况。


我使用的是CLDC 1.0,但根据我这里的文档,无论是在哪个配置文件中都没有办法将PrintWriter传递给printStackTrace。 - izb

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接