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

如何在JavaME中获取异常堆栈跟踪的文本?,java,java-me,Java,Java Me,在常规Java中,可以通过将PrintWriter传递给printStackTrace来获取堆栈跟踪的文本。我觉得我知道这个问题的答案(即“否”),但是 在JavaME中,有没有办法将堆栈跟踪的文本作为字符串获取 更新: 我应该提到,我仅限于CLDC 1.0,您可以让PrintWriter写入ByteArrayOutputStream,并从字节中重建字符串 try{ throw new Exception("Message"); } catch (Exception ex){

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

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

更新:


我应该提到,我仅限于CLDC 1.0,您可以让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]的权限(,Eclipse声称它在CDC/Foundation 1.1中可用,但这并没有说明其他配置文件。

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

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

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

我会查看您针对的任何平台,看看它们是否在某个地方提供了对System.err的访问权限。您始终可以连接调试器,调试器应该显示在控制台输出上,尽管听起来好像是在“现场”获取堆栈跟踪。

两种解决方案:

  • 在emulator上复制异常。无线工具包和Netbeans将在您的计算机上打印堆栈跟踪

  • 使用Symbian设备

在60系列第3版的Feature Pack 2之前,Symbian手机使用Sun Hotspot java虚拟机。通过将其链接到C标准库的部分实现,它被改编为Symbian操作系统

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

C++的重定向器从未被升级为Symbian OS的9版本,而是在VM,

中引入了一个“重定向://GCF协议”。 从一个单独的MIDlet中,从Connector.open(“redirect://”,Connector.READ)返回的连接中打开一个InputStream;然后可以在Symbian手机上捕获异常堆栈跟踪


编辑:“重定向://”已返回系列60第5版和“redirect://test"应该可以在Series60第3版功能包2上使用。我已经创建了一个工具,可以用来在CLDC中记录正确的堆栈跟踪。请访问。它仍然非常新,可能有一些粗糙的边缘,但它对我很有效,我无法想象没有它开发MIDlet。使用它的最好方法是将它与microlog结合起来


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

我使用的是CLDC 1.0,但根据我这里的文档,无法在任何配置文件中将PrintWriter传递到printStackTrace。不幸的是,我的问题仅限于一台设备(Moto V3xx)。幸运的是,它有一个相当于重定向器的功能,可以让我看到控制台的输出。很有趣。你知道重定向器的功能是否适用于其他摩托罗拉手机吗?你能告诉我们如何使用它吗?