我很想知道在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;
}
在第二种方法中,计数变量似乎没必要,但出于某种原因,第一种方法对我来说似乎不对。是否有任何特别的理由支持一方而不是另一方?
答案 0 :(得分:1)
在try
块中返回值没有错,如果IllegalArgumentException
被引发(或任何其他RuntimeException
)你甚至不能从该方法返回任何内容,正常执行由于该例程,程序的流程将会改变。
第二个示例中的模式用于需要关闭catch块中使用/实例化资源的情况,然后在finally
子句中正确处理此问题。
答案 1 :(得分:0)
我喜欢第一个版本,因为它看起来更具可读性。此外,如果引发异常,那么无关紧要,因为控制无论如何都将退出该方法。
我使用第二种模式的唯一原因是,如果我想在返回之前对返回值执行某些操作。
另外请注意,如果没有处理IllegalArgumentException
,您的代码可能会更好。应该有一种方法可以在调用方法之前验证参数。
答案 2 :(得分:0)
两种方法都产生相同的结果,在这两种情况下,如果不抛出任何错误或异常,将返回一个值。
但是persnnaly我更喜欢第一个,更容易阅读。
答案 3 :(得分:0)
你应该避免使用finally子句中的return。通常,两个块都应声明退出。如果在尝试你有回报你应该也有它在捕获,在你的情况下第二次返回被throw替换。
我也会先使用snipest,因为它更具可读性。
答案 4 :(得分:0)
两种方法最终都是一样的。您不能抛出异常以及从方法返回值。这两件事永远不会发生在一起。您可以返回一些值或抛出异常。
在第二种方法中,返回计数; 语句是必需的,否则编译器将抛出错误消息。这是因为,如果您的代码没有遇到任何异常,则必须根据您的方法原型返回值。
两个apprroach是相同的,除了第一个直接返回值,而第二个将它存储在一个变量中并返回变量的值,该变量最终与第一个相同。
还有一件事,你没有在方法定义中声明和抛出子句,这表明 RestException()是一个未经检查的异常。一般来说,这不是一个好习惯。抛出未经检查的异常,因为调用方法可能无法处理它。 我建议你改为抛出一个检查过的异常。