2011-09-29 247 views
5

我有一个关于java的try catch的n00b/basic问题。try catch语句的作用域问题

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

myIni.get("toto"); 

和下面的错误消息: 变量myIni可能尚未初始化

是的尝试仅限于试区域范围有多大? 如何在下面的代码中获取myIni的结果?

+0

不要做'e.printStackTrace()'。只是'抛e'。 – BalusC

回答

6

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

+0

hoho,这真的是一个n00b问题,然后:) thanx。 – Cornelius

+1

@Cornelius - 即使是n00b问题也很有用;) – 2011-09-29 15:56:41

+0

没有noob问题。 – Simeon

0

只要在try catch块内放入myIni.get(“toto”),或写入Ini myIni = null;在第一行。请注意,如果您执行第二个变体,您可能会收到一个空指针异常(NullPointerException),如果该文件未找到,或者由于任何其他原因而无法读取...

干杯! P

0

Ini myIni = null;,这就是它

1

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

试试这个:

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

为了避免recieving NullPointerException,进行检查,以确保被调用try块中的程序导致了建设有一些数据的对象。

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

选择,如果你不想叫myIni的try/catch块之外,因为如果发生异常,该对象,实际上将null,那么你可以做如下。

try { 
    Ini myIni= new Ini(new FileReader(myFile)); 
    myIni.get("toto"); 
} catch (IOException e) { 
    e.printStackTrace(); 
} 
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。

2

在你正确的方式做你想做的就是把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

+0

如果你在'myIni.get(“toto”);'line – Simeon

4

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

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

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

要解决你的问题,与空初始化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您的整个使用,如果这是可能和适当的建议。您选择的解决方案取决于您的其他要求和设计。

1

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

如果在到达线路时出现故障myIni.get("toto");myIni不会被初始化。

你有两个选择:

  1. myIni.get("toto");try块内。
  2. 当您定义它并在try块之外检查null块时,将初始值null的值指定为myIni
0

在您的代码中,如果发生异常,变量myIni无法实例化,这就是为什么编译器会出现这样的警告。

,你可以把它改成:

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

由于@khachik指出,最好是声明和初始化try块本身内部的变量。如果你觉得自信与傲慢无法区分,那么就在下面进行初始化。

Ini myIni = null;