为什么我会收到"The local variable may not have been initialized"错误?


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可能还没有初始化

初始化char c = '';

如果你的try块失败,你的字符c将没有任何值。

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

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

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

你应该能够做这样的事情:

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

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

考虑一下:如果try块失败,System.out.println("c: " + c)将打印出什么?不管ctry块之前的值是多少。在try块之前,c最后保存的值是多少?没有,你没有指定任何先验值,值没有初始化。因此,出现了错误消息。

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

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

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

我不知道你还需要这个解决方案,但我想回答你的问题。在catch exception之后,可以使用&;return;&;要背,为了不破"c"

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();
`       return;
    }
    System.out.println("c: " + c);
}

相关内容

最新更新