为什么没有在Java中初始化局部变量?

为什么没有在Java中初始化局部变量?

为什么Java的设计者认为不应该给局部变量一个默认值?说真的,如果实例变量可以被赋予一个默认值,那么为什么我们不能对局部变量做同样的事情呢?

它也会导致问题,正如在这条评论是写在博客上的:

当试图关闭最终块中的资源时,这个规则是最令人沮丧的。如果我在TRY中实例化资源,但试图在Final中关闭它,我就会得到这个错误。如果我将实例化移到TRY之外,则会得到另一个错误,说明它必须在TRY中。

非常令人沮丧。


ibeautiful
浏览 849回答 3
3回答

桃花长相依

声明局部变量主要是为了做一些计算。因此,程序员决定设置变量的值,而不应该采用默认值。如果程序员错误地没有初始化局部变量并取默认值,那么输出可能是一些意想不到的值。因此,对于局部变量,编译器将要求程序员在访问变量之前使用某个值进行初始化,以避免使用未定义的值。

Helenr

你链接到的“问题”似乎是在描述这种情况:SomeObject so;try {   // Do some work here ...   so = new SomeObject();   so.DoUsefulThings();} finally {   so.CleanUp(); // Compiler error here}注释者的抱怨是编译器在finally一节,声称so可能是未初始化的。然后,注释提到了另一种编写代码的方法,可能如下所示:// Do some work here ...SomeObject so = new SomeObject();try {   so.DoUsefulThings();} finally {   so.CleanUp();}注释者对该解决方案不满意,因为编译器随后说代码“必须在尝试中”。我猜这意味着一些代码可能会引发一个不再被处理的异常。我没有把握。我的代码的两个版本都不处理任何异常,因此第一个版本中任何与异常相关的操作在第二个版本中都应该是相同的。无论如何,第二个版本的代码是对,是这样写它的方法。在第一个版本中,编译器的错误消息是正确的。这个so变量可能未初始化。特别是,如果SomeObject构造器失败,so将不会被初始化,因此尝试调用它将是一个错误。so.CleanUp..始终输入try剖面后您已经获得了finally部分最后确定。这个try-finally块之后的so初始化只来保护SomeObject例如,不管发生什么事情,都要把它清理干净。如果有其他需要运行的东西,但它们与SomeObject实例被分配了属性,那么它们应该进入另一个 try-finally布洛克,可能是我展示的那个。在使用前需要手动分配变量并不会导致真正的问题。这只会导致一些小麻烦,但是您的代码会更好。您将拥有范围更有限的变量,并且try-finally不试图保护太多的障碍。如果局部变量具有默认值,则so在第一个例子中null..那根本解决不了任何问题。而不是在finally布洛克,你会有一个NullPointerException潜伏在那里藏无论在代码的“在这里做一些工作”部分可能发生什么其他异常。(或在finally节自动链接到以前的异常?我不记得了。即使如此,你也会有一个额外的例外,就像真正的例外。)

大话西游666

此外,在下面的示例中,可能在SomeObject构造中抛出了一个异常,在这种情况下,‘so’变量将为NULL,而对清理的调用将抛出NullPointerException。SomeObject so;try {   // Do some work here ...   so = new SomeObject();   so.DoUsefulThings();} finally {   so.CleanUp(); // Compiler error here}我倾向于这样做:SomeObject so = null;try {   // Do some work here ...   so = new SomeObject();   so.DoUsefulThings();} finally {   if (so != null) {      so.CleanUp(); // safe   }}
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Java