有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

什么是好的“错误检查”模式(Java)?

我将解释输入错误检查的含义

假设你有一个函数doSomething(x)

如果函数成功完成doSomething,则执行一些操作,但不返回任何内容<但是,如果有错误,我希望得到通知<这就是我所说的错误检查

总的来说,我在寻找检查错误的最佳方法。我想到了以下解决方案,每个都有潜在的问题

  1. 标记错误检查如果doSomething(x)成功完成返回null。否则,它将返回布尔值或错误字符串问题:副作用

  2. 引发异常如果doSomething(x)遇到错误,则引发异常问题:如果只对参数执行错误检查,抛出IllegalArgumentException似乎不合适

  3. 在函数调用之前验证输入如果错误检查只针对函数的参数,那么可以在调用doSomething(x)函数之前调用验证器函数问题:如果类的客户机在调用doSomething(x)之前忘记调用验证器函数,该怎么办

我经常遇到这个问题,任何帮助或正确方向上的一点都将不胜感激


共 (3) 个答案

  1. # 1 楼答案

    1. Flag error checking

    这在某些情况下是合适的,这取决于你所说的“错误”是什么意思

    API中的一个示例:如果尝试向Set添加一个对象,该对象已经包含另一个equals对象,则add方法排序为“失败”,并通过返回false来指示这一点。(请注意,从技术上讲,这甚至不是一个“错误”!)

    2.Throwing an exception

    这是默认选项

    现在的问题是,您应该选择选中的异常(需要throws声明或try/catch子句)还是未选中的异常(扩展RuntimeException的异常)。这里有一些规则

    Java Practices -> Checked versus unchecked exceptions

    • 未检查的异常:表示程序中的缺陷(bug)——通常是传递给非私有方法的无效参数

    • 检查异常:表示程序无法直接控制的区域内的无效情况(无效用户输入、数据库问题、网络中断、缺少文件)

    请注意IllegalArgumentException是一个未检查的异常,非常适合在参数不正常时抛出

    如果你想抛出一个选中的异常,你可以a)通过扩展Exception来滚动你自己的异常,B)使用一些现有的选中异常,或者C)“链”一个运行时异常,例如,一个IOException:throw new IOException(new IllegalArgumentException("reason goes here..."));

    3.Validating input prior to function call

    在我看来,依靠客户应该在打电话之前净化/检查他的论点这一事实是个坏主意

  2. # 2 楼答案

    我决定在接口类型上通常使用哪种方法

    • 用户界面(GUI):我在调用业务方法之前进行验证,因为用户想知道哪里出了问题

    • 在组件或系统之间的技术接口上,接口应该已经过测试,并且工作正常。在这种情况下,我抛出异常

  3. # 3 楼答案

    抛出异常是最好的方法

    If you are performing error checking for parameters only, throwing an IllegalArgumentException seems inappropriate.

    为什么?这就是这个例外的目的