为什么我会收到“局部变量可能尚未初始化”错误?

时间:2015-07-11 10:58:45

标签: java

package io;

import java.io.*;

public class UserIO {

    public static void main(String[] args) {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        char c;
        try {
            c = (char)br.read(); //Input a character from user
        } catch (IOException e) {
            e.printStackTrace();
        }
        System.out.println("c: " + c);
    }
}

程序无法编译。

  

错误:局部变量c可能尚未初始化

3 个答案:

答案 0 :(得分:1)

初始化char c = '';

如果您的try阻止失败,则您的角色c将没有任何价值。

  try {
    c = (char)br.read(); //Input a character from user
  } catch (IOException e) {
    e.printStackTrace();
  }

如果在c内投放了Exception,则上述代码可能不会为br.read()分配任何值。因此,当执行System.out.println("c: " + c);时,编译器不知道要打印什么。为了避免这种情况,Java会强制您初始化局部变量。

如果使用c初始化char c = '';,即使您的try块失败,编译器也至少可以打印``。

您应该可以执行以下操作:

 char c;
 c = 'a';
 System.out.println("c:" + c);

在这种情况下,它将成功编译,因为当您打印值时,编译器知道它肯定会有一些值,而try块不是这种情况(它可能有也可能没有任何值)。

答案 1 :(得分:0)

考虑一下:如果try阻止失败,System.out.println("c: " + c)会打印出什么?好吧,无论c块之前有什么值try。在{try}之前c最后持有什么价值?没有,你没有指定任何先前的值,该值未初始化。因此,错误消息。

解决方案:在声明时(或在c块中)为finally提供默认值。可以在try-block失败的情况下使用。

答案 2 :(得分:0)

您需要在完成后实际阅读用户输入的内容

        while ((c = (char) br.read()) != -1) {
               System.out.println("c: " + c);
        }
    }
}