Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/design-patterns/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java错误处理_Java_Design Patterns_Error Handling - Fatal编程技术网

Java错误处理

Java错误处理,java,design-patterns,error-handling,Java,Design Patterns,Error Handling,我相信大家都知道,Java对错误处理实施了非常严格的模式,因此任何异常都必须通过try-catch块或通过使用throws关键字声明方法来处理。(我可以补充说,我真的很喜欢它的制作方式) 话虽如此,;我所要做的是决定如何正确处理各种方法中的错误。我来自C#/VB.NET的背景,以前一直严格坚持在堆栈的最底层处理错误(除了最具体的情况),但是我不相信这是Java中最好的方法 有人能提供有关这方面的信息吗?什么是最佳实践?如何决定是否应该在方法外部抛出异常,还是在内部处理异常(显然有些情况很明显,但

我相信大家都知道,Java对错误处理实施了非常严格的模式,因此任何异常都必须通过try-catch块或通过使用throws关键字声明方法来处理。(我可以补充说,我真的很喜欢它的制作方式)

话虽如此,;我所要做的是决定如何正确处理各种方法中的错误。我来自C#/VB.NET的背景,以前一直严格坚持在堆栈的最底层处理错误(除了最具体的情况),但是我不相信这是Java中最好的方法


有人能提供有关这方面的信息吗?什么是最佳实践?如何决定是否应该在方法外部抛出异常,还是在内部处理异常(显然有些情况很明显,但allot不是)?

这是一个老生常谈的答案,但是在您可以实际使用异常进行恢复的情况下捕获异常。不同的异常将意味着您可以在体系结构中的不同级别处理异常。

您希望在异常发生的地方处理异常,前提是,并且仅当您确实可以采取措施修复异常时

下面是一个常见的例子:

int foo(String userInput) {
    int i = Integer.parseInt(userInput);
    return i * 4;
}
这将抛出除非数字的字符串输入之外的字符串。但你对此无能为力,所以你就让它散播出去

这是另一个例子

class Communicator {

    private InputStream in;
    private OutputStream out;

    public Communicator(Socket socket) throws IOException {
        in = new ObjectInputStream(socket.getInputStream());
        out = new ObjectOutputStream(socket.getOutputStream());
    }

}
如果套接字抛出IOException,您是否可能期望恢复并使通信器仍然工作?我想不是。让它去吧,让它传播,让它找到一个能处理它的人


另外,您应该知道,对于所有异常,您不必
捕获
或声明
抛出
。如果是
运行时异常
,则不需要这样做。对于大多数部分,这些异常通常意味着错误(NullPointerException,有人吗?)或错误的用户输入(NumberFormatException)。

基于每个方法,我问自己:

  • 此方法是否有足够的信息来正确处理此异常?如果是,请处理它。否则
  • 调用方是否有足够的信息来正确处理此异常?如果是,请重新播放。否则
  • 调用方是否需要专门处理来自此组件的操作中的故障?如果是,则重新显示为嵌套在组件异常子类中。否则
  • 未经检查而改口

  • 这似乎是处理错误的一种很好的通用方法。谢谢大家!@b邮件能否请您在回答中再解释一下
    rethrow
    (2)?@JJD例如,SAXParser.parse方法可能会捕获IOException(例如,日志记录、清理等),但它们会重新显示异常,因为调用方有上下文来处理它(例如,FileNotFoundException,或最终用户可能知道如何解决的其他一些I/O问题)。