[英]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个选择:
myIni.get("toto");
在try
块内。 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.