在没有调试器的情况下调试/识别Java问题

在没有调试器的情况下调试/识别Java问题,java,debugging,Java,Debugging,我希望能够在运行的Java代码中识别异常,而无需附加调试器。举个简单的例子,如果我有以下代码: int i = 0; Random rand = new Random(); while (true) { i++; int number = rand.nextInt(1000); if (number == 20) throw new Exception("Error!!!"); }

我希望能够在运行的Java代码中识别异常,而无需附加调试器。举个简单的例子,如果我有以下代码:

    int i = 0;
    Random rand = new Random();
    while (true)
    {
        i++;
        int number = rand.nextInt(1000);
        if (number == 20)
            throw new Exception("Error!!!");
    }
在抛出异常时,我如何知道“I”的值?(无需附加任何调试器或添加日志/打印条目)

我的动机是希望能够在客户站点识别问题,而无需将任何调试器附加到生产站点

如果某人使用.NET或C++来问同一个问题,我可以使用WEBBG和相关的PDBS

来获得“i”的值。
谢谢

将相关信息添加到
异常
对象中

if (number == 20)
    throw new Exception("Error!!! i = " + i);

您可以在
catch
块中使用
Exception.getMessage()
(在本例中,还可以使用一些字符串解析;或者,只需
抛出新的异常(“+i”)

您的问题不清楚

如果您实际询问如何在不附加调试器或修改程序以添加日志记录/跟踪/任何可以提供该信息的内容的情况下查找有关程序执行状态的信息。。。。然后答案是“你做不到”

在这种情况下,您唯一的选择是尝试对程序的行为进行推理


在您的示例中,随机数生成器返回(出于所有实际目的)不可预测的数字,因此无法进行推理。通常情况下,这就是结局

然而,@Thomas Jungblut的评论指出,这无关紧要,答案是零。。。因为在初始化后,程序中的任何内容都不会更改
i
的值

但这并没有改变“一般”答案:

  • 如果你不能跟踪它/调试它,你必须对它进行推理
  • 如果你不能推理,你就被卡住了

我有一台电视,我想看一部连续剧而不打开它。祝我好运!嗯,你说没有调试器也没有日志记录。祝您好运,在RAM中找到“i”的值:P
i
可能为0。你应该从一开始就这么说。你的问题含糊不清,因此投了反对票。您编写了“无调试器”,但现在您说您可以使用它们(是的,windbg是一个调试器)。这就是这些评论的原因。我不明白这个问题。要么记录日志,要么向异常消息中添加更多信息,要么进行调试。您不清楚这其中的哪一部分?+1虽然我不确定这是否违反了给定的限制(没有日志记录)。我也不确定,希望Omri能够澄清这一点。这也不能回答我的问题。我的动机是希望能够在客户站点识别问题,而无需将任何调试器附加到生产站点。