在C#和Java语言中(可能还有其他语言),在"try“块中声明的变量不在相应的"catch”或"finally“块的作用域中。例如,以下代码无法编译:
try {
String s = "test";
// (more code...)
}
catch {
Console.Out.WriteLine(s); //Java fans: think "System.out.println" here instead
}
在此代码中,catch块中对s的引用发生编译时错误,因为s仅在try块的作用域中。(在Java语言中,编译错误是“无法解析”;在C#中,错误是“名称"s”在当前上下文中不存在“)。
这个问题的一般解决方案似乎是在try块之前声明变量,而不是在try块内:
String s;
try {
s = "test";
// (more code...)
}
catch {
Console.Out.WriteLine(s); //Java fans: think "System.out.println" here instead
}
然而,至少对我来说,(1)这感觉像是一个笨拙的解决方案,(2)它导致变量的作用域比程序员预期的更大(整个方法的其余部分,而不仅仅是try-catch-finally的上下文)。
我的问题是,这个语言设计决策背后的理由是什么(在Java、C#和/或任何其他适用的语言中)?
https://stackoverflow.com/questions/94977
复制相似问题