try catch语句的范围问题

时间:2011-09-29 15:46:28

标签: java scope try-catch

我有一个关于java的try catch的n00b / basic问题。

Ini myIni;
try {
    myIni = new Ini(new FileReader(myFile));
} catch (IOException e) {
    e.printStackTrace();
}

myIni.get("toto");
  

以及后面的错误消息:   变量myIni可能尚未初始化

try的范围是否仅限于try区域? 如何在以下代码中获取myIni的结果?

10 个答案:

答案 0 :(得分:6)

要避免该消息,您需要在try语句之前设置默认值 或者您需要在try语句中调用get()方法。

答案 1 :(得分:4)

是的,尝试的范围仅限于此。事实上,范围以{和以}结尾,因此这也会创建一个子范围

void foo() {
  {
    Ini  myIni = new Ini(new FileReader(myFile));
  }

  myIni.get("toto"); //error here, since myIni is out of scope
}

要解决您的问题,请使用null初始化myIni,并注意如果尝试失败,myIni.get("toto");将导致NullPointerException。

所以你需要考虑到这个或者从你的catch块中抛出另一个异常。

检查是否为空:

 Ini myIni = null;
 try {
   myIni = new Ini(new FileReader(myFile));
 } catch (IOException e) {
   e.printStackTrace();
 }

 if( myIni != null ) {
   myIni.get("toto");
   //access the rest of myIni
 } else {
   //handle initialization error
 }

抛出异常:

 Ini myIni = null;
 try {
   myIni = new Ini(new FileReader(myFile));
 } catch (IOException e) {
   e.printStackTrace();
   throw new MyCustomInitFailedException(); //throw any exception that might be appropriate, possibly wrapping e
 }

 myIni.get("toto");

正如@khachik已经建议的那样,如果可行且恰当的话,你也可以将try块放在整个myIni的使用范围内。您选择何种解决方案取决于您的其他要求和设计。

答案 2 :(得分:2)

以正确的方式执行您想要的操作是将myIni.get("toto");放在try块中:

try {
    Ini myIni = new Ini(new FileReader(myFile));
    myIni.get("toto");
} catch (IOException e) {
    e.printStackTrace();
}

不建议{@ 1}} 。在这种情况下,如果在Ini myIni = null;的初始化时抛出NullPointerException,则代码将抛出IOException

答案 3 :(得分:1)

  

try的范围是否仅限于try区域?答案是肯定的。您遇到的问题是您忘记初始化对象。

试试这个:

Ini myIni=null;
try {
    myIni = new Ini(new FileReader(myFile));
} catch (IOException e) {
    e.printStackTrace();
}

为避免您的程序收到NullPointerException,请执行检查以确保try块中的被调用导致Object已使用某些数据构建。

if(myIni !=null) 
 {
   myIni.get("toto");
 }

如果您不想在try / catch块之外调用myIn,则替代,因为如果发生异常,该对象实际上将是null,那么您可以执行以下操作。

try {
    Ini myIni= new Ini(new FileReader(myFile));
    myIni.get("toto");
} catch (IOException e) {
    e.printStackTrace();
}

答案 4 :(得分:1)

这是编译器说myIni的初始化可能失败的方式。因为myIni = new Ini(new FileReader(myFile));行可能会抛出异常。

如果在到达myIni.get("toto"); myIni行时失败则不会被初始化。

您有两个选择:

  1. myIni.get("toto");放在try区块内。
  2. 在您定义null时将myIni初始值设置为null,并检查try块之外的{{1}}。

答案 5 :(得分:0)

只需将myIni.get(“toto”)放在try catch块中,或者写入Ini myIni = null;在第一行。请注意,如果您执行第二个变体,如果找不到文件,或者由于任何其他原因无法读取,则可能会出现NullPointerException ...

喝彩! P

答案 6 :(得分:0)

Ini myIni = null;,就是这样

答案 7 :(得分:0)

在catch语句中,您不定义变量的值。因此,如果捕获然后运行myIni.get("toto");,变量将没有值。你想做这样的事情:

Ini myIni = null;
try {
    myIni = new Ini(new FileReader(myFile));
} catch (IOException e) {
    e.printStackTrace();
}

myIni.get("toto");

即便如此,在运行get()时也会获得NPE。

答案 8 :(得分:0)

在您的代码中,如果发生异常,则无法实例化变量myIni,这就是编译器发出此类警告的原因。

您可以将其更改为:

Ini myIni = null;
try {
    myIni = new Ini(new FileReader(myFile));
} catch (IOException e) {
    e.printStackTrace();
}
if(myIni!=null){
myIni.get("toto");
}

答案 9 :(得分:0)

正如@khachik指出的那样,最好在try块本身内声明并初始化变量。只有当你感到极度自信而且与傲慢无法区分时,才会在下面进行初始化,只有在尝试博客之外。

Ini myIni = null;