java null/empty-list 返回与代码中抛出异常重新思考其余世界的最佳实践

标签 java design-patterns junit nullpointerexception

重新思考具有 null/empty 处理场景的设计模式

像下面这样的函数

  function(customerid){
      customer=findcustomerbyId(customerid)-->findcustomer
      list<Transactions> accounts=getNewTransactions(customer)-->findtransactions
      foreach{if(transaction.isGasTransaction()){send(event)..if()sendevent()}}-->send events
    }

现在的问题是,每当我们期望函数返回值时,它应该是空值吗?或者如果数据库找不到值,它应该抛出异常。

抛出空值会迫使您编写代码来处理空值/空列表。这将增加 if-else block ,并且您的 junit 案例也会增加(成正比)。抛出异常将迫使您采用不同的编程风格,并且您再次需要一些期待异常的测试用例。

像 spring-jdbc 模板一样,如果 db 中没有值,queryForObject 会抛出异常。(expected-1 但得到 0)

这里的正确方向是什么?更多异常(exception)?或者像其他 null 替代品一样使用 Optionsl<>java-8 或使用 null?

我们可以在不同的场景中平衡这些风格:)

所以对于rest-api项目我认为抛出异常会很好,如果你有全局异常处理程序(如 Controller 建议)原因,你可以处理代码中的异常而不用担心方法堆栈处理空检查/空检查,因为在建议级别捕获异常并相应地传播。

***这是朝着一个方向思考而不是讨论哪个最好*****

最佳答案

问问自己“当有人尝试访问不存在的条目时我希望发生什么?”

如果您想向用户显示消息,您可以抛出一个已处理的Exception来通知上一级发生了问题,从而允许您显示catch block 中的某种错误消息。

如果您不想发生任何事情,请使用 null 对象,这样您的线程就不会崩溃。用户不会被告知为什么没有发生任何事情,这被认为是不好的做法。

如果缺少条目导致程序无法正常运行,则会使用运行时异常。 NullPointerException 未详细说明。 NPE 可能是由于忘记初始化变量(在现代语言中通常在编译时捕获)而不是访问某种不存在的数据结构中的元素(通常导致 NoSuchElementException现代语言),因此最好将 NPE 包装在另一个异常中,其中包含有关问题的更多信息。

关于java null/empty-list 返回与代码中抛出异常重新思考其余世界的最佳实践,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37755663/

相关文章:

java - 如何测试一个方法内部调用了不同的方法?

java - 如何改善应用程序的 ActivityManager 加载时间?

java - 获取 org.hibernate.MappingException : No Dialect mapping for JDBC type:

java - 如何限制构建 xml 文件的测试时间执行

java - Android Clean 架构中的登录流程

java - 我可以并且应该将 Context 传递给 UI 外部的静态方法吗?

java - 将vertx TestSuite与junit一起使用

java - 是什么决定了 eclipselink 在哪里寻找 @Column、@Temporal 和 @Id 注释?

java - 如何在 XML 中指定复杂类型的列表?

java - 如何通知正在运行的线程发生更改