在 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 中,编译错误是“ s”不能被解析; 在 C # 中,它是“ The name‘ s’does not been In The current context”。)
这个问题的一般解决方案似乎是在 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 # 和/或任何其他适用的语言中)背后的基本原理是什么?