Java 调试未分配给命名变量的堆栈数据

Java 调试未分配给命名变量的堆栈数据,java,debugging,Java,Debugging,是否有一种方法可以查看堆栈元素,如未分配的返回值或未分配给局部变量的异常?(例如,抛出新的…) 例如,假设我有如下代码: public String foo(InputStream in) throws IOException { NastyObj obj = null; try { obj = new NastyObj(in); return (obj.read()); } finally { if (obj !=

是否有一种方法可以查看堆栈元素,如未分配的返回值或未分配给局部变量的异常?(例如,抛出新的…)

例如,假设我有如下代码:

public String foo(InputStream in) throws IOException {    
    NastyObj obj = null;
    try {
        obj = new NastyObj(in);
        return (obj.read());
    } finally {
        if (obj != null) obj.close();
    }
}
是否有任何方法可以查看返回值或异常值,而无需转到指定返回值或异常值的更高级别帧?这与异常尤其相关,因为您经常需要通过许多帧来查找实际的处理程序


我通常使用Eclipse调试环境,但任何答案都值得赞赏。另外,如果不能做到这一点,你能解释一下原因吗?(JVM、JPDA限制?

您难道不能捕获IOException(并命名它)然后重新播放它吗?(不知道java,但我在C++和Python中会这样做)当然,如果你不能编辑给定的代码或者正在检查状态,需要知道它看起来是什么样子,这个答案是无效的…但是,如果您可以编辑代码,那么这似乎是一条路。

答案似乎是JPDA/JDI和Eclipse都有缺陷。 我已经验证了以下内容,但我不会费心发布代码,除非有人真的需要它

JDI在很大程度上反映了代码的结构。给定范围的命名局部变量可以通过调试对象线程的当前。未作用域的局部变量和方法参数可以通过调试对象线程的当前参数获得。但是,一般来说,当文档引用LocalVariable时,它是一个命名的local变量

如果函数正常返回并且您使用的是1.6调试设置(),则可以获取函数的返回值。如果调试器侦听,则event.returnValue()将在所有方法执行完毕后获取返回的值。根据文档,当方法通过抛出的异常终止时,不会生成此事件


结论是,如果直接在Java1.6下使用JDI,如果函数返回正常,则可以在将其分配给本地函数之前获得函数的返回值。Eclipse和Netbeans UI不支持这一点。您无法获得有关已抛出但尚未捕获的异常的信息。

您的意思是这样的:多次思考相同的问题。Eclipse不能,AFAIK.@Justin Nelson--No。目标是在调试器中查看异常或返回值。e、 g.如果我在finally块中的断点处停止。获取堆栈跟踪只会显示到foo的调用路径,而不会显示结果。谢谢,但不,我不想编辑代码。通常当这是一个问题时,我正在调试第三方代码,不想深入(或重新编译)NastyObj,因为它很讨厌。