繁体   English   中英

try catch语句的范围问题

[英]Scope issue on a try catch statement

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

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

myIni.get("toto");

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

尝试的范围仅限于尝试区域吗? 如何在以下代码中获取myIni的结果?

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

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

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

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

要解决您的问题, myIni使用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如果可能的话,适当。 您选择何种解决方案取决于您的其他要求和设计。

以你正确的方式做你想要的是把myIni.get("toto"); try块内:

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

不要做Ini myIni = null; 正如一些答案所示。 在这种情况下,如果在myIni初始化时抛出IOException ,则代码将抛出NullPointerException

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

试试这个:

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();
}

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

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

你有2个选择:

  1. myIni.get("toto"); try块内。
  2. 在定义它时为myIni分配初始null值,并在try块之外检查null

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

干杯! P

Ini myIni = null; 就是这样

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

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

myIni.get("toto");

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

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

你可以把它改成:

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

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

Ini myIni = null;

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM