我有一个关于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的结果?
答案 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
行时失败则不会被初始化。
您有两个选择:
myIni.get("toto");
放在try
区块内。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;