3

我很好奇关于在 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 变量似乎是不必要的,但由于某种原因,第一种方法对我来说似乎是错误的。有什么特别的理由偏爱其中一个吗?

4

5 回答 5

3

try块中返回值没有任何问题,如果IllegalArgumentException引发(或任何其他RuntimeException)你甚至不会从该方法返回任何东西,程序的正常执行流程将由于该异常而改变。

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

于 2013-04-03T16:33:27.490 回答
0

我喜欢第一个版本,因为它看起来更具可读性。此外,如果引发了异常,那也没关系,因为无论如何控制都会退出该方法。

我使用第二种模式的唯一原因是,如果我想在返回值之前对它做一些事情。

另一方面,如果您处理IllegalArgumentException. 应该有一种方法可以让您在调用方法之前验证参数。

于 2013-04-03T16:33:25.997 回答
0

两种方法都产生相同的结果,如果没有错误或抛出异常,两种情况都会返回一个值。

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

于 2013-04-03T16:34:23.690 回答
0

您应该避免的是在 finally 子句中使用 return。一般来说,两个块都应该声明一个退出。如果在尝试中你有返回,你也应该在 catch 中,在你的情况下,第二个返回被替换为 throw。

我也会选择第一个 snipest,因为它更具可读性。

于 2013-04-03T16:36:35.507 回答
0

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

在第二种方法中,返回计数;声明是必要的,否则编译器将抛出错误消息。这是因为,如果您的代码没有遇到任何异常,则它必须根据您的方法原型具有返回值。

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

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

于 2013-04-03T16:50:47.267 回答