【问题标题】:Java: What is the scope of references inside a try/catch? [closed]Java:try/catch 中的引用范围是什么? [关闭]
【发布时间】:2013-06-03 03:19:52
【问题描述】:

try/catch 的范围是什么?本质上,我正在反序列化一些对象并创建新的引用来存储它们。加载它们后,我尝试在引用中使用一种方法,但出现以下编译错误。

        try{
        ObjectInputStream is = new ObjectInputStream(new FileInputStream("saveGame.ser"));
        gameCharacter oneRestore = (gameCharacter) is.readObject();
        gameCharacter twoRestore = (gameCharacter) is.readObject();
        gameCharacter threeRestore = (gameCharacter) is.readObject();
    } catch (Exception ex) {ex.printStackTrace();}

    System.out.println("One's type is: " + oneRestore.getType());
    System.out.println("Two's type is: " + twoRestore.getType());
    System.out.println("Three's type is: " + threeRestore.getType());

编译错误是:

Exception in thread "main" java.lang.Error: Unresolved compilation problems: 
oneRestore cannot be resolved
twoRestore cannot be resolved
threeRestore cannot be resolved

【问题讨论】:

  • 与任何其他代码块一样,它的范围从{ 大括号开始,到} 大括号结束(类似于if-else 或for 循环块)。请注意,编译器错误对此非常清楚。
  • 我知道错误是什么,以及如何解决它。但是,我没有意识到非常明显的范围 = {->

标签: java scope try-catch


【解决方案1】:

范围始终是封闭的{}。您需要在try 之前声明的变量。

【讨论】:

  • +1,但我要强调的是,它需要在try 之前声明并初始化,因为Java 不会让您读取可能的局部变量尚未初始化,即使它在范围内。
  • 有趣的事实:在 Java 中,您可以在任何地方开始一个新块 { }。它不一定是 if/while/do/try 或任何东西,你可以在任何地方开始一个,写一条语句就可以了。
  • 为什么引用创建时必须初始化?在我的解决方案中,我只是将它们初始化为指向空(null),但这有什么意义呢?对空引用的调用不会抛出 NullPointerException 吗?
  • @sherrellbc 见my post。
【解决方案2】:

范围在try 块内。在这种情况下,您需要在 try 块之前声明变量并使用标志来验证变量是否在访问它们之前被设置,如下所示:

gameCharacter oneRestore=null;
gameCharacter twoRestore=null;
gameCharacter threeRestore=null;
boolean wasRead = true;

try{
ObjectInputStream is = new ObjectInputStream(new FileInputStream("saveGame.ser"));
oneRestore = (gameCharacter) is.readObject();
twoRestore = (gameCharacter) is.readObject();
threeRestore = (gameCharacter) is.readObject();
} catch (Exception ex) {
wasRead=false;
ex.printStackTrace();
}

if (wasRead) {
System.out.println("One's type is: " + oneRestore.getType());
System.out.println("Two's type is: " + twoRestore.getType());
System.out.println("Three's type is: " + threeRestore.getType());
}

顺便说一句,建议类名以大写开头,因此gameCharacter -> GameCharacter 看起来更适合 Java 程序员。

【讨论】:

  • 这基本上就是我所做的,但是为什么必须初始化引用呢?我也使用了null,但目的是什么?调用空引用不会简单地抛出 NullPointerException 吗?
  • Java 期望引用被初始化。当您在 try 块之间声明引用时,其余代码将不知道该引用。此外,当您在 try 块之外声明它但在 try 块中对其进行初始化时,Java 无法确保它将被初始化,因为 try 块并不意味着完成;也就是说,执行可能会在块结束之前退出,从而使引用未初始化。
猜你喜欢
  • 1970-01-01
  • 2015-01-10
  • 2013-09-04
  • 1970-01-01
  • 2015-12-15
  • 2019-11-15
  • 1970-01-01
  • 1970-01-01
  • 2016-06-29
相关资源
最近更新 更多