Java 在try-catch块中初始化变量

Java 在try-catch块中初始化变量,java,Java,我在Java中遇到错误: 线程“main”java.lang中出现异常。错误:未解决的编译问题 局部变量b1可能尚未在Test.main(Test.java:20)处初始化 这是我的密码: import java.lang.String; public class Test { /** * @param args */ public static void main(String[] args) { // TODO Auto-generate

我在Java中遇到错误:

线程“main”java.lang中出现异常。错误:未解决的编译问题
局部变量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]);
        }

    }
}
import java.lang.String;
公开课考试{
/**
*@param args
*/
公共静态void main(字符串[]args){
//TODO自动生成的方法存根
字符a[]={'s','k'};
字符串s0=新字符串(a);
字符串s1=新字符串(“AMR”);
字符串s2=“amarnath”;
字节[]b1;
试一试{
b1=s2.getBytes(“ASCII”);
}
捕获(例外e){}

对于(inti=0;i问题

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

如果发生这种情况,则在尝试打印下一行中的
b1
值时会出现问题:

System.out.println(b1[i]);
Java非常谨慎,不会让这种可能性发生


解决方案

  • 使用默认值初始化
    b1
    • 这将防止
      b1
      未初始化的可能性(这正是Java所担心的)
  • for
    循环放入
    try
    块中(如@SashaSalauyou在评论中所说)
    • 如果
      try
      块中的
      b1
      初始化有错误,则该块将退出,而
      for
      循环将不会运行。因此,不会有使用未初始化变量的代码,如前面代码行中所述

  • 这里的问题是getBytes(字符串编码)抛出不受支持的编码异常。如果在代码中发生这种异常(如果对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}
    }
    
    /**
    *@param args
    */
    公共静态void main(字符串[]args){
    //TODO自动生成的方法存根
    字符a[]={'s','k'};
    字符串s0=新字符串(a);
    字符串s1=新字符串(“AMR”);
    字符串s2=“amarnath”;
    字节[]b1;
    试一试{
    b1=s2.getBytes(“ASCII”);
    
    对于(int i=0;i编译器会抱怨,因为如果
    b1
    未初始化,并且如果
    try
    块内发生错误,那么它将在以下块中使用,
    System.out.println(b1[i]);
    ,未初始化


    为了使其可编译,您应该至少使用
    null
    初始化变量,因为它是局部变量。

    考虑将
    移动到(…)
    内部
    尝试在
    b1=…
    之后打印数组内容,前提是数组内容已成功初始化。现在,如果由于异常而未分配
    b1
    ,则在输入
    for()时,数组内容未初始化
    --因此您会遇到此错误。不要接受异常。这不仅是一个很好的一般性建议,我认为它还可以解决您的具体问题。@SashaSalauyou谢谢。它起作用了。但是您能告诉我的代码为什么会出现问题吗?这是因为try范围吗?