在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]); 
     } 

    } 
} 
+3

考虑在'b1 = ...'之后的'try'内移动'for(...)'以仅在成功初始化时打印数组内容。现在,如果'b1'由于异常而未被赋值,那么当进入'for()'时它不会被初始化, - 因此你会得到这个错误。 –

+0

不要吞噬异常。这不仅是很好的一般建议,我认为它也将解决您的具体问题。 –

+0

@SashaSalauyou谢谢..它的工作..但你能告诉我为什么我的代码有问题。这是由于尝试范围? – smasher

这里的问题是,的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

  1. 初始化b1有默认值
    • 这将防止可能性b1未初始化(这是Java的担心)
  2. for环路try块内(如@SashaSalauyou在评论中说的)
    • 如果没有与b1的inialization在try块,则该块将退出,而for回路的误差不会被运行。因此,将不会有使用未初始化变量的代码,例如上述代码行。

编译器会抱怨,因为如果b1是抛出一个错误没有初始化,如果东西不好发生在try块内部,它将被用在下面的块System.out.println(b1[i]);,未初始化。

为了编译它,你应该至少用null初始化你的变量,因为它是局部变量。