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

时间:2008-10-22 12:08:26

标签: java java-me

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

有没有办法在JavaME中以字符串形式获取堆栈跟踪的文本?

更新

我应该提一下,我只限于CLDC 1.0

5 个答案:

答案 0 :(得分:3)

两种解决方案:

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

  • 使用Symbian设备。

在Series 60 3rd Edition的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返回的连接中打开一个InputStream(“redirect://”,Connector.READ);然后,您可以在Symbian手机上捕获异常堆栈跟踪。

编辑:“redirect://”回到Series60第5版,“​​redirect:// test”应该在Series60第3版功能包2上运行

答案 1 :(得分:2)

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

我最终做的是在最后一刻抓住Throwable而不是Exception并从那里打印堆栈跟踪。这当然有一个危险,你也抓住java.lang.Error并不是很好,特别是如果它OutOfMemoryError,尽管在打印堆栈跟踪之前调用System.gc()似乎减少了风险,我们没有任何问题。

我会查看您所定位的平台,看看他们是否可以在某处访问System.err。你总是可以连接一个调试器,它应该出现在控制台输出上,虽然听起来就像你在字段中获得堆栈跟踪后的那样。

答案 2 :(得分:0)

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

答案 3 :(得分:0)

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

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

答案 4 :(得分:-2)

您可以让PrintWriter写入ByteArrayOutputStream并从字节重构String。

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