如何知道失败的原因?

How to know the cause of failure?

如何确定应用程序崩溃是响应某些用户输入还是由于某些内部错误?

从用户的角度来看,我如何确定处理这些异常的最佳方式?

尝试将您的代码放入 try-catch 块中。这将允许您捕获异常(错误),然后将堆栈跟踪写入控制台。从控制台的堆栈跟踪中,您将能够找到代码中的错误行....

try {
    your code here
} catch (Throwable t) {
    t.printStackTrace();
}

我们确定是在谈论 Java?从越界访问数组到溢出缓冲区,几乎所有的事情都会引发错误。

此处抛出的异常在一个名为 unchecked exceptions 的 class 中,它们甚至不一定要被捕获,因为它们是程序员错误(错误)而非用户输入的结果错误。

所以这是判断是否为输入错误的一种方法。如果抛出的异常是未经检查的异常,那么错误就在代码中。您可以在软件的入口点对未经检查的异常进行理智捕获,以尝试确定发生了什么作为最后的手段,可能会转储堆栈跟踪以帮助用户报告错误。

如果崩溃甚至没有抛出(例如:segfault),那么它发生在本机代码而不是 Java 代码中,并且仍然不是用户的错(尽管它可能是您正在使用的第三方库而不是您自己的库,例如,尽管开发人员有责任对其进行处理)。

如果您处理的是用户输入错误,那么您想抛出一个已检查的错误并捕获它。在这种情况下,用户甚至不会看到崩溃。

从用户的角度来看,任何未捕获的异常都是程序员的错误。如果软件不能从任何类型的异常中正常恢复,无论是否基于输入,那么从技术上讲,责任由开发人员承担。如果软件崩溃不是我的错,因为我不小心在需要正数的字段中输入了负数。即使尝试加载损坏的文件也不一定会使软件崩溃,所以也许您的面试官正在寻找负责任的开发人员的回答,他们从不认为任何崩溃都是用户的错。

当我们谈论崩溃时,它不属于用户输入与错误的范畴。它始终是生产质量商业软件中的错误。

如果它在代码域中,则有不同的 classes 基于异常但不是意外的用户输入错误(例如:文件 I/O 错误)的已检查异常,而不仅仅是完全无法预料的错误(未经检查的异常),当您控制代码和处理异常时,您可以区分这些错误。