代码中java空/空列表返回vs抛出异常反思rest世界中的最佳实践

代码中java空/空列表返回vs抛出异常反思rest世界中的最佳实践,java,design-patterns,junit,nullpointerexception,Java,Design Patterns,Junit,Nullpointerexception,重新思考空/空处理场景下的设计模式 下面的函数 function(customerid){ customer=findcustomerbyId(customerid)-->findcustomer list<Transactions> accounts=getNewTransactions(customer)-->findtransactions foreach{if(transaction.isGasTransaction()){

重新思考空/空处理场景下的设计模式

下面的函数

  function(customerid){
      customer=findcustomerbyId(customerid)-->findcustomer
      list<Transactions> accounts=getNewTransactions(customer)-->findtransactions
      foreach{if(transaction.isGasTransaction()){send(event)..if()sendevent()}}-->send events
    }
函数(customerid){
customer=findcustomerbyId(customerid)-->findcustomer
列表帐户=getNewTransactions(客户)-->findtransactions
foreach{if(transaction.isgatransaction()){send(event)…if()sendevent()}}-->发送事件
}
现在的问题是,每当我们期望函数返回值时,它应该是空值吗?或者,如果数据库找不到值,它应该抛出异常

抛出null值会迫使您编写代码来处理null值/空列表。如果else阻塞,junit案例也会增加(成正比)。抛出异常将迫使您使用不同的编程风格,而且您需要一些预期异常的测试用例

就像SpringJDBC模板一样,如果db中没有值,queryForObject会抛出异常。(预期为-1,但得到0)

这里的正确方向是什么。还有例外吗?或者像其他空选项一样使用选项LJava-8,或者使用空选项

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

因此,对于rest api项目,我认为抛出异常将是一件好事,如果您有一个全局excpetion处理程序(如控制器建议),那么您可以在代码中处理异常,而不必担心方法堆栈来处理空检查/空检查,因为异常是在建议级别捕获并相应传播的

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

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

如果要向用户显示消息,可以抛出已处理的
异常
,通知上一级出现问题,从而允许您在
捕获
块中显示某种错误消息

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


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

如果数据库找不到值-这是灾难还是正常情况?考虑这两种情况:

public void createUser(String userName){
boolean thisUsernameIsUsed = checkIfUsernameAlreadyExistsSQLRequest(userName);
    if(!thisUsernameIsUsed){
        //create a new user
    }
}


在第一种情况下,在数据库中没有用户名是可以的。所以,使用null。在第二种情况下,我们希望获得最后一个编辑人员的姓名,因此使用null实际上是一个例外

你的问题似乎是一个风格或最佳实践问题。设计模式是一个完全不同和更具体的东西。是的,我同意风格与最佳实践,我在这个项目中选择了例外风格,但新ppl加入,这是一个最佳实践,让ppl很容易理解吗。在我的场景中不需要try-catch,因为我解释说我有一个全局异常处理程序来返回定制的e.message作为服务的响应。对于以后的调试,我认为您似乎希望使用异常进行流控制/信令。但是,依我看,例外应该按照它们的本来面目使用:例外,表示出了问题。如果测试过程中缺少数据意味着确实有问题,那么抛出异常对我来说似乎没问题。但一般来说,您应该重新审视您的设计,考虑在什么情况下应该返回什么方法,尤其是null值对您意味着什么。空对象在某些情况下也可以。想一想什么污染你的代码少。使用全局异常处理程序看起来也是一种设计,这是一项严肃的基础工作,需要一些思考:P在我的工作场所,我们也在努力解决这个问题,因为人们对此有不同的看法。如果你在一个团队中编程:与他们交谈,并就每种方法的优缺点进行辩论。做出决定并坚持下去!如果您认为在任何地方都使用异常都可以,只要您不中途改变主意,开始使用null对象就可以了。我明白了这一点,这在我的团队中是一个长期的争论。我倾向于使用异常,因为我的这种场景没有任何意义。如果存在null,则将null数据作为逻辑中的下一步将不会执行。(90%的ppl不希望出现空值,例如:-获取具有id的客户,验证信用卡pin等)。任何空检查都很好,但不是必需的,因为这只是为了增加junit覆盖率,如果某些值为空,服务调用将不会达到此级别。返回一个值如何?是的,这就是为什么我有一个自定义的异常处理程序tht捕捉这些值并将其转换为对用户有意义的内容。空是一个不好的选项:)optional并不能简单地解决问题,因为这样就会遇到null处理场景的另一面。但yes optional仍然比null@dnault
可选
如果他想在不可用的情况下创建缺少的数据,则将非常有用。向用户显示错误消息不应该是数据处理程序的责任-它应该是负责数据处理程序的对象的责任(它可能会被进一步提升到链的上游),或者是错误处理程序的责任。在我看来,
Optional
损害了模块化。在这种情况下,最好的做法是抛出某种异常,让更高层知道有问题,这样它可以添加数据、显示数据或将其发送给某个错误处理程序。是的,谢谢
public String whoMessedUpTheDatabase(database database){
    return database.getLastEditedBySQLRequest();
}