在try catch块中初始化变量

时间:2016-04-15 15:47:08

标签: java

我在Java中收到错误:

  

线程中的异常“main”java.lang.Error:未解决的编译问题
      局部变量b1可能尚未在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 个答案:

答案 0 :(得分:0)

<强>问题

如果try块中存在错误,则b1将不会被初始化,其值为null

如果发生这种情况,那么当您尝试在以下行中打印b1的值时会出现问题:

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

Java非常谨慎,不会让这种情况发生。

<强>解

  1. 使用默认值初始化b1
    • 这样可以防止b1未初始化的可能性(这是Java所担心的)
  2. for循环放在try块内(如@SashaSalauyou在评论中所述)
    • 如果b1块中try的初始化出错,则该块将退出,并且for循环将不会运行。因此,没有使用未初始化变量的代码,例如在前面提到的代码行中。

答案 1 :(得分:0)

这里的问题是getBytes(String encoding)抛出UnsupportedEncodingException。如果您的代码中出现此类异常 (如果您输入错误的编码,例如getBytes(&#34; foo&#34;),则会发生这种情况)您的字节数组将保留未初始化。 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}
}

}

答案 2 :(得分:0)

编译器会抱怨,因为如果b1未初始化,并且try块内发生错误,则会在以下块中使用System.out.println(b1[i]); null 1}},未初始化。

为了使其编译,您应该至少使用import processing.core.PApplet; public class Button extends PApplet{ float buttonX; float buttonY; float buttonWidth; float buttonHeight; boolean cliked; public Button(PApplet canvas, float buttonX, float buttonY, float buttonWidth, float buttonHeight) { this.buttonX = buttonX; this.buttonY = buttonY; this.buttonWidth = buttonWidth; this.buttonHeight = buttonHeight; } public void drawButton() { rect(200, 200, 200, 200); textSize(40); fill(200, 200, 200); text("Start Game", 300, 300); } } 初始化变量,因为它是局部变量。