在JavaME中是否有任何方法可以将堆栈跟踪作为字符串获取?
更新:
我应该提到我受限于CLDC 1.0
两种解决方案:
在模拟器上重现异常。无线工具包和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
catch(Exception)
时会丢弃堆栈跟踪以节省内存,但是在catch(Throwable)
时不会这样做,并通过设备事件日志访问堆栈跟踪。我创建了一个工具,可以用于在CLDC中记录正确的堆栈跟踪。请访问http://jarrut.sourceforge.net查看。它仍然非常新,并且可能存在一些问题,但对我来说很有效,我无法想象在没有它的情况下开发MIDlets。最好的使用方法是与microlog结合使用。
不幸的是,该工具目前需要CLDC 1.1,因此可能无法解决原始帖子的问题。
我不认为在CLDC 1.0中有办法做到这一点。然而,在某些设备/操作系统上,底层的异常类可能提供了一种访问堆栈跟踪的方式(考虑较新的CLDC版本)。只需在运行时使用反射检查异常实例,看看它在目标平台上公开了哪些成员。然后,您可以编写一些代码,在提供此类信息的平台上安全地提取堆栈跟踪。
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中可用,但这并不能说明其他配置文件的情况。