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)
将打印出什么?不管c
在try
块之前的值是多少。在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);
}