为什么在 try/catch 块中创建的对象不在方法其余部分的范围内?
他们是。在块中声明的变量try/catch
不在包含块的范围内,原因与所有其他变量声明在它们发生的范围内都是本地的:这就是规范定义它的方式。:-)(更多下文,包括对您评论的回复。)
这是在 a中创建的对象try/catch
,可在其外部访问:
SomeObject someObject = null;
try
{
someObject = new SomeObject();
someObject.dangerousMethod();
}
catch(Exception e)
{
}
someObject.anotherMethod(); // This is fine -- unless the SomeObject
// constructor threw the exception, in which
// case someObject will be null
注意区别。声明变量的位置定义了它存在的范围,而不是创建对象的位置。
但是根据上面的方法名称等,更有用的结构是:
SomeObject someObject = new SomeObject();
try
{
someObject.dangerousMethod();
}
catch(Exception e)
{
}
someObject.anotherMethod();
回复您的评论:
我想我对为什么甚至为 try/catch 块创建另一个范围感到困惑。
在 Java 中,所有块都创建范围。an 的主体、an的主体、aif
的主体等——它们都创建了一个新的嵌套变量范围:else
while
if (foo) {
SomeObject bar = new SomeObject();
}
bar.doSomething(); // <== Compilation error, `bar` is not defined
(事实上,即使是没有任何控制结构的块也会创建一个。)
如果你仔细想想,它是有道理的:有些块是有条件的,比如定义if
or主体的块while
。在上面if
,bar
可能已经或可能没有被声明(取决于 的值foo
),这是没有意义的,因为编译器当然没有运行时值的概念foo
。所以可能是为了一致性,Java 的设计者让所有块创建一个新的嵌套范围。(JavaScript的设计者走了另一条路——根本没有块作用域,尽管它正在被添加——这种方法也让人们感到困惑。)