2016-04-15 113 views
-1

我收到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

回答

0

這裏的問題是,的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} 
} 

}

0

問題

如果裏面的錯誤try塊,則b1將不會被初始化,並且將具有值null

如果發生這種情況,那麼就當你嘗試成爲一個問題,在下面的行打印出來b1的價值觀:

System.out.println(b1[i]); 

Java是謹慎,不會讓這種情況發生的可能性。


SOLUTIONS

  1. 初始化b1有默認值
    • 這將防止可能性b1未初始化(這是Java的擔心)
  2. for環路try塊內(如@SashaSalauyou在評論中說的)
    • 如果沒有與b1的inialization在try塊,則該塊將退出,而for迴路的誤差不會被運行。因此,將不會有使用未初始化變量的代碼,例如上述代碼行。
0

編譯器會抱怨,因爲如果b1是拋出一個錯誤沒有初始化,如果東西不好發生在try塊內部,它將被用在下面的塊System.out.println(b1[i]);,未初始化。

爲了編譯它,你應該至少用null初始化你的變量,因爲它是局部變量。