gpt4 book ai didi

java - 为什么 Try/Catch block 会创建新的变量范围?

转载 作者:IT老高 更新时间:2023-10-28 20:41:23 26 4
gpt4 key购买 nike

例如:

try
{
SomeObject someObject = new SomeObject();
someObject.dangerousMethod();
}
catch(Exception e)
{
}
someObject.anotherMethod(); //can't access someObject!

但是你可以在 try/catch block 之前声明它,然后它就可以正常工作了:

SomeObject someObject;
try
{
someObject = new SomeObject();
someObject.dangerousMethod();
}
catch(Exception e)
{
}
someObject.anotherMethod(); //works fine

我只是想知道这样做的设计原因。为什么在 try/catch block 中创建的对象不在方法其余部分的范围内?除了观察抛出的 Exceptions 之外,我可能并没有深入了解 try/catch 的工作原理。

最佳答案

Why are Objects created within the try/catch block not in scope with the rest of the method?

他们是。 try/catch block 中声明的 变量不在包含 block 的范围内,原因与所有其他变量声明都是本地的相同它们发生的范围:规范是这样定义的。 :-)(更多内容如下,包括对您评论的回复。)

这是一个 createdtry/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

注意区别。 变量在哪里声明定义了它存在的范围,而不是对象在哪里创建。 p>

但是根据上面的方法名称等,更有用的结构是:

SomeObject someObject = new SomeObject();
try
{
someObject.dangerousMethod();
}
catch(Exception e)
{
}
someObject.anotherMethod();

你的评论:

I guess I'm confused as to why another scope has even been created for a try/catch block.

在 Java 中,所有 block 都创建范围。 if 的主体、else 的主体、while 的主体等——它们都创建了一个新的嵌套变量范围:

if (foo) {
SomeObject bar = new SomeObject();
}
bar.doSomething(); // <== Compilation error, `bar` is not defined

(事实上,即使是没有任何控制结构的 block 也会创建一个。)

如果你仔细想想,它是有道理的:有些 block 是有条件的,比如定义 ifwhile 主体的 block 。在上面的 if 中,bar 可能已经声明也可能没有声明(取决于 foo 的值),这当然没有意义编译器没有 foo 的运行时值的概念。所以可能是为了一致性,Java 的设计者使用 all block 创建一个新的嵌套范围。 (JavaScript 的设计者走了另一条路——根本没有 block 作用域,尽管它正在被添加——而且这种方法让人们感到困惑。)

关于java - 为什么 Try/Catch block 会创建新的变量范围?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11655020/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com