Java:函数局部变量初始化

时间:2013-12-04 05:42:03

标签: java

我有一个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){

  }
}

9 个答案:

答案 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)

第一个更好,因为retnew 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将确保捕获任何错误

不确定这是否足以满足您的期望:)