我应该避免在java函数中返回null吗?

我应该避免在java函数中返回null吗?,java,null,Java,Null,我没有找到适合我问题的解决办法。据我所知,正如书中所说,返回null不是编写干净代码的好方法。然而,对于这种做法有许多不同的意见,我不确定哪一种适合我的功能 private EArea getSimilarExistingArea(EImportArea importedArea) { for (EArea existingArea : exsitingAreas) { EList<EPoint> importedAreaPoints = importedAr

我没有找到适合我问题的解决办法。据我所知,正如书中所说,返回null不是编写干净代码的好方法。然而,对于这种做法有许多不同的意见,我不确定哪一种适合我的功能

private EArea getSimilarExistingArea(EImportArea importedArea) {
    for (EArea existingArea : exsitingAreas) {
        EList<EPoint> importedAreaPoints = importedArea.getPoly().getPoints();
        EList<EPoint> existingAreaPoints = existingArea.getPoly().getPoints();
        for (EPoint importedAreaPoint : importedAreaPoints) {
            for (EPoint existingAreaPoint : existingAreaPoints) {
                if (importedAreaPoint.equals(existingAreaPoint))
                    return existingArea;
            }
        }
    }
    return null;
}
private EArea getSimilarExistingArea(EImportArea importedArea){
用于(EArea现有区域:现有区域){
EList importedAreaPoints=importedArea.getPoly().getPoints();
EList existingAreaPoints=existingArea.getPoly().getPoints();
对于(EPoint importedAreaPoint:importedAreaPoints){
对于(EPoint existingAreaPoint:existingAreaPoints){
if(导入的AreaPoint.equals(现有的AreaPoint))
返回现有区域;
}
}
}
返回null;
}
如果没有现有的类似区域,我应该返回什么


PD:为了优化我的代码,如果建立了一个现有区域,我将使用返回来打破循环。

您应该看看


使您的方法返回类型
可选
并简单地返回
可选。如果不可用(existingArea)
您将不得不稍微修改您的代码,但可选的好处确实值得

你应该看一看

使您的方法返回类型
可选
并简单地返回
可选。如果不可用(existingArea)
您将不得不稍微修改您的代码,但可选的好处确实值得

最后我解决了我的问题

代码如下:

private Optional<EArea> getSimilarExistingArea(EImportArea importedArea) {
    for (EArea existingArea : baseLineService.getBaseLine().getAreas()) {
        EList<EPoint> importedAreaPoints = importedArea.getPoly().getPoints();
        EList<EPoint> existingAreaPoints = existingArea.getPoly().getPoints();
        for (EPoint importedAreaPoint : importedAreaPoints) {
            for (EPoint existingAreaPoint : existingAreaPoints) {
                if (importedAreaPoint.equals(existingAreaPoint))
                    return Optional.of(existingArea);
            }
        }
    }
    return Optional.empty();
}
最后我解决了我的问题

代码如下:

private Optional<EArea> getSimilarExistingArea(EImportArea importedArea) {
    for (EArea existingArea : baseLineService.getBaseLine().getAreas()) {
        EList<EPoint> importedAreaPoints = importedArea.getPoly().getPoints();
        EList<EPoint> existingAreaPoints = existingArea.getPoly().getPoints();
        for (EPoint importedAreaPoint : importedAreaPoints) {
            for (EPoint existingAreaPoint : existingAreaPoints) {
                if (importedAreaPoint.equals(existingAreaPoint))
                    return Optional.of(existingArea);
            }
        }
    }
    return Optional.empty();
}


取决于,但如果返回null,代码也应该知道如何处理null。就像在您的例子中,如果
getSimilarExistingArea
函数返回null,那么您可以向用户打印一些奇特的消息
Exception
是一个不错的选择,但是在您的示例中,如果找不到,一个指向
null
的好javadoc也是可以接受的。请阅读以下问题:。在我看来(因为这个问题很大程度上是基于观点的),返回
null
是可以的,只要它有很好的文档记录。如果返回
null
意味着出现了严重错误,那么应该抛出异常。问问自己该方法的前置条件和后置条件是什么。对于私有方法,如果您在自己的类中处理过它,则由您自己返回任何内容。对于公共方法,您应该声明可能的返回值,包括NULL的原因,那么它应该是好的。查看这个答案可以让您考虑返回空是否是API用户的一个糟糕的设计:可能是depends的副本,但如果返回null,那么代码也应该知道如何处理null。就像在您的例子中,如果
getSimilarExistingArea
函数返回null,那么您可以向用户打印一些奇特的消息
Exception
是一个不错的选择,但是在您的示例中,如果找不到,一个指向
null
的好javadoc也是可以接受的。请阅读以下问题:。在我看来(因为这个问题很大程度上是基于观点的),返回
null
是可以的,只要它有很好的文档记录。如果返回
null
意味着出现了严重错误,那么应该抛出异常。问问自己该方法的前置条件和后置条件是什么。对于私有方法,如果您在自己的类中处理过它,则由您自己返回任何内容。对于公共方法,您应该声明可能的返回值,包括NULL的原因,那么它应该是好的。查看这个答案可以让您考虑返回空是否是API用户的一个糟糕的设计:查找(…)的
可选.empty()
、查找(…)的
可选.of时,可能是或的重复项,并且从Java 1开始就提供了可选项。8@JoopEggen这就是Optional#of nullable static Optional of nullable(T value)的目的。如果不为null,则返回一个描述指定值的Optional,否则返回一个空的可选值。@Dinh这只是一个附加注释,因为OP的代码有两个返回值:null和non-null。没有批评,甚至给+1。谢谢你们。我使用可选类来解决我的问题。或者,当没有找到
Optional.empty()
时,当找到
Optional.of(…)
时,Optional从Java 1开始就可用。8@JoopEggen这就是Optional#of nullable static Optional of nullable(T value)的目的。如果不为null,则返回一个描述指定值的Optional,否则返回一个空的可选值。@Dinh这只是一个附加注释,因为OP的代码有两个返回值:null和non-null。没有批评,甚至给+1。谢谢你们。我用选修课来解决我的问题。