Java 在试块中返回是一种好的做法吗?

Java 在试块中返回是一种好的做法吗?,java,Java,我很好奇在try块中使用return语句的最佳实践 我有一个方法调用一个服务方法,该方法返回一个整数并可能抛出一个IllegalArgumentException。有两种方法可以做到这一点 第一: public int getLookupStatus(String lookupType) { try { return this.lookupService.getCountOfLookupRecords(lookupType); } catch(Il

我很好奇在try块中使用return语句的最佳实践

我有一个方法调用一个服务方法,该方法返回一个整数并可能抛出一个IllegalArgumentException。有两种方法可以做到这一点

第一:

public int getLookupStatus(String lookupType)
{
    try
    {
        return this.lookupService.getCountOfLookupRecords(lookupType);
    }
    catch(IllegalArgumentException ex)
    {
        throw new RestException();
    }
}
第二:

public int getLookupStatus(String lookupType)
{
    int count;

    try
    {
        count = this.lookupService.getCountOfLookupRecords(lookupType);
    }
    catch(IllegalArgumentException ex)
    {
        throw new RestException();
    }

    return count;
}

在第二种方法中,count变量似乎不必要,但出于某种原因,第一种方法对我来说似乎是错误的。有什么特别的原因让我喜欢其中一个而不是另一个吗?

我喜欢第一个版本,因为它看起来更可读。此外,如果引发了异常,那么这也无关紧要,因为控件无论如何都将退出该方法

我使用第二种模式的唯一原因是,如果我想在返回返回值之前对其进行处理


另一方面,如果不处理
IllegalArgumentException
,代码可能会更好。在调用方法之前,应该有一种方法让您验证参数。

try
块中返回值没有错误,如果引发了
IllegalArgumentException
(或任何其他
RuntimeException
),您甚至不会从该方法返回任何内容,程序的正常执行流将因该例外而改变


第二个示例中的模式用于需要关闭catch块中使用/实例化的资源的情况,然后在
finally
子句中正确处理此问题。

两种方法都产生相同的结果,并且在这两种情况下,如果没有错误或抛出异常,将返回一个值


但我个人更喜欢第一个,更容易阅读。

你应该避免在finally子句中使用return。通常,两个块都应该声明一个出口。如果在试飞中你有回击,你应该在接球中也有回击,在你的情况下,第二次回击被投掷代替


我还将使用first snipest,因为它更具可读性

这两种方法最终都是相同的。不能抛出异常,也不能从方法返回值。这两件事永远不会同时发生。您可以返回一些值,也可以引发异常

在第二种方法中,返回计数语句是必需的,否则编译器将抛出错误消息。这是因为,如果您的代码没有遇到任何异常,那么它必须具有与您的方法原型相同的返回值

这两种方法都是相同的,只是第一种方法直接返回值,而第二种方法将其存储在变量中并返回最终与第一种方法相同的变量值


还有一件事,您没有在方法定义中声明和抛出子句,这表明RestException()是未检查的异常。通常抛出未检查的异常不是一个好的做法,因为调用方法可能无法处理它我建议您改为抛出一个选中的异常。

第一个代码可读性更好,第二个可能无法编译。@assylias:第二个代码应该编译-
count
仍然被明确分配。不过我也更喜欢第一个。@assylias第二个应该编译,因为
count
是一个原语。如果它是类似于
String
,则不会。正如Jon指出的,它与确定赋值有关,代码也会使用对象或字符串编译。@VivinPaliath为什么会这样?该值在成功完成
count=
行时初始化,无论它是对象还是原语。如果这一行没有完成,那么编译器知道将发生
抛出新的RestException()
,从而防止
返回计数
。关于未检查异常的部分肯定是主观的、特定于上下文的,远未达成共识。