在try catch块
问题描述:
我收到Java中的错误初始化变量:在try catch块
Exception in thread "main" java.lang.Error: Unresolved compilation problem
The local variable b1 may not have been initialized at Test.main(Test.java:20)
这里是我的代码:
import java.lang.String;
public class Test {
/**
* @param args
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
char a[]={'s','k'};
String s0=new String(a);
String s1=new String("Amar");
String s2= "amarnath";
byte[] b1;
try{
b1=s2.getBytes("ASCII");
}
catch(Exception e){}
for(int i =0;i<s2.length();i++)
{
System.out.println(b1[i]);
}
}
}
答
这里的问题是,的getBytes(字符串编码)抛出UnsupportedEncodingException。如果代码发生了这种异常(如果您输入了错误的编码,例如getBytes(“foo”)),则您的字节数组将保持未初始化状态。catch块将处理异常,并继续尝试使用b1的for(;;)循环。编译器看到了这种可能性,为了防止未初始化变量的使用后
import java.lang.String;
公共类的测试{
/**
* @param args
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
char a[]={'s','k'};
String s0=new String(a);
String s1=new String("Amar");
String s2= "amarnath";
byte[] b1;
try{
b1=s2.getBytes("ASCII");
for(int i =0;i<s2.length();i++)
{
System.out.println(b1[i]);
}
}
catch(UnsupportedEncodingException uee){ //handle the excpetion or at least log it}
}
}
答
问题
如果里面的错误try
块,则b1
将不会被初始化,并且将具有值null
。
如果发生这种情况,那么就当你尝试成为一个问题,在下面的行打印出来b1
的价值观:
System.out.println(b1[i]);
Java是谨慎,不会让这种情况发生的可能性。
SOLUTIONS
- 初始化
b1
有默认值- 这将防止可能性
b1
未初始化(这是Java的担心)
- 这将防止可能性
- 把
for
环路try
块内(如@SashaSalauyou在评论中说的)- 如果没有与
b1
的inialization在try
块,则该块将退出,而for
回路的误差不会被运行。因此,将不会有使用未初始化变量的代码,例如上述代码行。
- 如果没有与
答
编译器会抱怨,因为如果b1
是抛出一个错误没有初始化,如果东西不好发生在try
块内部,它将被用在下面的块System.out.println(b1[i]);
,未初始化。
为了编译它,你应该至少用null
初始化你的变量,因为它是局部变量。
考虑在'b1 = ...'之后的'try'内移动'for(...)'以仅在成功初始化时打印数组内容。现在,如果'b1'由于异常而未被赋值,那么当进入'for()'时它不会被初始化, - 因此你会得到这个错误。 –
不要吞噬异常。这不仅是很好的一般建议,我认为它也将解决您的具体问题。 –
@SashaSalauyou谢谢..它的工作..但你能告诉我为什么我的代码有问题。这是由于尝试范围? – smasher