【问题标题】:Scope issue on a try catch statementtry catch 语句的范围问题
【发布时间】:2011-09-29 15:46:28
【问题描述】:

我有一个关于 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 的结果?

【问题讨论】:

  • 不要做e.printStackTrace()。只需throw e

标签: java scope try-catch


【解决方案1】:

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

【讨论】:

  • 嗬嗬,那真的是一个 n00b 问题 :)thanx。
  • @Cornelius - 即使是 n00b 问题也很有用 ;)
  • 那个菜鸟问题拯救了我的一天
【解决方案2】:

是的,try 的范围仅限于此。实际上范围以 { 开始并以 } 结束,因此这也会创建一个子范围

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

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

要解决您的问题,请将 myIni 初始化为 null,并注意如果尝试失败,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 的整个使用中。您选择哪种解决方案取决于您的其他要求和您的设计。

【讨论】:

    【解决方案3】:

    正确的做法是将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

    【讨论】:

    • 如果您在 myIni.get("toto"); 行之前检查 null 则不会
    【解决方案4】:

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

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

    你有两个选择:

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

    【讨论】:

      【解决方案5】:

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

      试试这个:

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

      为避免您的程序接收到NullPointerException,请执行检查以确保在 try 块中调用导致使用一些数据构建对象。

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

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

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

      【讨论】:

        【解决方案6】:

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

        干杯! P

        【讨论】:

          【解决方案7】:

          Ini myIni = null;就这样

          【讨论】:

            【解决方案8】:

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

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

            即便如此,在运行get() 时,你会得到一个 NPE。

            【讨论】:

              【解决方案9】:

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

              你可以改成:

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

              【讨论】:

                【解决方案10】:

                正如@khachik 指出的那样,最好在 try 块本身内声明和初始化变量。像下面这样初始化,只有当你感到非常自信时才在尝试之外进行初始化,这与傲慢没有区别。

                Ini myIni = null;
                

                【讨论】:

                  猜你喜欢
                  • 1970-01-01
                  • 1970-01-01
                  • 1970-01-01
                  • 2020-02-20
                  • 2011-02-20
                  • 1970-01-01
                  • 1970-01-01
                  • 1970-01-01
                  • 2010-09-29
                  相关资源
                  最近更新 更多