我有一个java函数。在第一个函数中,返回变量“ret”使用第二个函数中的声明进行初始化,并在需要时在try中初始化。你们认为哪一个更好?请将List视为一个示例,它可以是String和type。谢谢
第一个功能:
public List<String> getNames() {
List<String> ret = new ArrayList<String>();
try {
// use ret
} catch(Exception e){
}
}
第二功能:
public List<String> getNames() {
List<String> ret = null;
try {
// some more code
ret = new ArrayList<String>();
// use ret
} catch(Exception e){
}
}
答案 0 :(得分:2)
在第一种情况下,即使try块中发生异常,也可以确保发送空白ArrayList
,而在第二种情况下,如果异常发生在ArrayList
之前初始化后,将发送null
。第二种方法的好处还在于,数组列表仅在需要时创建,而不是之前不必要的。
这两种方法都没有问题,但最好采用第二种方法,因为特别返回null
意味着发生了一些问题,因此可以适当地处理和解释null
,而a空白Arraylist
可能无法始终区分异常和正确执行而不返回任何记录。
答案 1 :(得分:2)
两者之间的唯一区别是,如果try块未正常完成,则在第一种情况下将返回空白列表。在第二种情况下,将返回NULL。
哪种方法更好?
取决于您的要求。
我通常使用第二种方法,因为空白仍会占用记忆。
话虽如此,如果我假设列表不会填充getNames()
之外的元素,那么占用内存的空白列表就不好了。
但与此相反,如果列表中填充了getNames()
之外的元素,例如,在getNames()
的调用方法中,则返回空白列表也没问题。
答案 2 :(得分:1)
这取决于你的目标。好吧,如果您在创建ArrayList
实例之前必须满足某些依赖项或条件,那么您可以选择第二个选项。我建议使用第二个选项,因为它会在需要时立即创建实例。只有在我们在创建和使用ArrayList
实例之前看到代码时,才能完成整个决策。当任何内容在创建之前失败时,这会将List
引用保留为null。我们也可以在try catch block
之后进行初始化
public List<String> getNames() {
List<String> ret = null;
try {
// code which is prone to exception
} catch(Exception e){
}
ret = new ArrayList<>();
//set the values in ret and return it
}
}
最佳做法是在需要时始终初始化对象。
答案 3 :(得分:0)
第一个更好,因为ret
到new ArrayList<String>()
的分配不会失败。优良作法是将try
块的内容限制为可能引发异常的操作。
答案 4 :(得分:0)
这实际上取决于需要。
在第一种方法中,如果发生异常,您仍然可以控制ret
,而后者则不能。{/ p>
答案 5 :(得分:0)
这取决于你在做什么。如果您可以在try和catch中使用ret,请使用第一个表单。如果您只想在try块中使用ret,请将ret的delcaration放在try块中。
public List<String> getNames() {
try {
// some more code
List<String> ret = new ArrayList<String>();
// use ret
} catch(Exception e){
}
}
答案 6 :(得分:0)
依赖。如果没有什么可以抓住特定的操作。将它放在try-catch
中是没有意义的。
List<String> ret = new ArrayList<String>(); // here no exception will throw.
答案 7 :(得分:0)
我个人使用第一种方法。我不一定看到在try/catch
中初始化它的好处,尽管从技术上讲,您通过在null
之前的第二个代码块中将其设置为try/catch
来初始化它。要声明它使用List<String> ret;
。
答案 8 :(得分:0)
我和我的朋友已经看过这个并且我们认为:在try-catch中初始化List ret将确保捕获任何错误
不确定这是否足以满足您的期望:)