Java “编译器错误”的含义是什么;变量x可能尚未初始化";
我正在尝试编写一个Java Android程序,可以读写文件。不过我有一些问题。当最后一行运行时,Eclipse告诉我我的totalString变量可能尚未初始化。但是,我在try循环中为它指定了一个值。当我删除最后一行并运行我的程序时,我的控制台显示“成功读取文件”以及“java.io”。FileInputStream@d77ffd1". 这绝对不是我写入文件的值。我不知道我做错了什么,我有点失去理智了。另外,如果我试着用Java “编译器错误”的含义是什么;变量x可能尚未初始化";,java,android,Java,Android,我正在尝试编写一个Java Android程序,可以读写文件。不过我有一些问题。当最后一行运行时,Eclipse告诉我我的totalString变量可能尚未初始化。但是,我在try循环中为它指定了一个值。当我删除最后一行并运行我的程序时,我的控制台显示“成功读取文件”以及“java.io”。FileInputStream@d77ffd1". 这绝对不是我写入文件的值。我不知道我做错了什么,我有点失去理智了。另外,如果我试着用 totalString = "A Test Value" 在try块
totalString = "A Test Value"
在try块中,我仍然得到相同的错误。任何帮助都将不胜感激
//lets try WRITING the file
Context context = getApplicationContext();
String filename = "balance";
String balanceString = "0.00";
FileOutputStream outputStream;
try {
outputStream = openFileOutput(filename, Context.MODE_PRIVATE);
outputStream.write(balanceString.getBytes());
outputStream.close();
}
catch (Exception e) {
e.printStackTrace();
System.out.println("Error in Writing File.");
}
//lets try READING the file
String totalString;
FileInputStream inputStream;
try {
inputStream = openFileInput(filename);
inputStream.read();
inputStream.close();
totalString = inputStream.toString();
System.out.println("Read File Successfully");
System.out.println(totalString);
}
catch (Exception e) {
e.printStackTrace();
System.out.println("Error in Reading File.");
}
System.out.println(totalString);
inputStream.read()可能引发异常。在这种情况下,变量可能尚未初始化。只需将声明更改为
String totalString = null;
或者,您可以将System.out.println移动到try块的末尾,当由于没有引发异常而到达该块时,将初始化变量。此外,请阅读一些有关读取和写入文件的教程 read()将从流中读取一个字节。但如果不将该函数的返回值赋给变量,则该函数将被丢弃
inputStream.toString()执行它所说的操作。它试图描述对象,而不是流的内容。我会这样做
FileOutputStream outputStream=new FileOutputStream(filename);
ObjectOutputStream stringSaver = new ObjectOutputStream(outputStream);
stringSaver.writeObject(balanceString);
stringSaver.close();
outputStream.close();
所有这些都在一个try-catch中,用于将字符串保存到文件中,然后加载它
FileInputStream inputStream = new FileInputStream(filename);
ObjectInputStream objectStream = new ObjectInputStream(inputStream);
totalString = (String) objectStream.readObject();
objectStream.close();
inputStream.close();
这也是在试抓。。。
它应该会起作用。
该问题解决了一个变量可能尚未初始化的问题
当您不理解代码的某一部分时,可以自由提问:DinputStream.toString()
返回表示inputStream
对象的id的字符串。而不是文件中的数据
如果希望从InputStream
读取文件中的数据,则需要使用内置方法读取文件。最简单的方法是将InputStream
对象包装在BufferedReader
(或任何其他读取器
对象)中,然后使用.readLine()
(或等效)方法获取数据
例如:
String totalString;
BufferedReader in;
try {
in = new BufferedReader(new InputStreamReader(openFileInput(filename)));
totalString = in.readLine();
in.close();
System.out.println("Read File Successfully");
System.out.println(totalString);
}
catch (Exception e) {
e.printStackTrace();
System.out.println("Error in Reading File.");
}
现在输出: 您可以使用与以前完全相同的技术,只需将对象更改为其“Writer”等价物。例如:
PrintWriter out;
try {
out = new PrintWriter(new BufferedWriter(new OutputStreamWriter(penFileOutput(filename, Context.MODE_PRIVATE))));
out.println(balanceString);
out.flush();
out.close();
}
catch (Exception e) {
e.printStackTrace();
System.out.println("Error in Writing File.");
}
除了BufferedWriter之外,在这里使用PrintWriter的目的是因为它提供了非常易于使用的方法(即println()
)。此外,“flush()”方法用于确保流中的所有数据都写入文件,而不是“卡在”缓冲区中
编辑:忘记在上面的BufferedReader之前添加“new”。修复。良好的分析,但将变量初始化为垃圾值很少是解决此类问题的好方法。是的,这会使编译器沉默,但编译器提供了重要的信息,这些信息应该得到有意义的处理,而不是忽略。@John Bollinger:正确。但是必须赋值应该给程序员一个足够的提示,说明变量在程序流程中可能会有该值。如果赋值的是垃圾值,那么让编译器告诉您何时尝试不适当地使用它比让您自己编写代码来测试它更有用。通常可以避免分配虚拟值和使用未初始化的变量。这非常有效!唯一的问题是,它现在在写入文件时会引发异常…有什么建议吗?您也可以这样做,只需使用BufferedWriter+OutputStreamReader。我将在答案中添加一个示例,一秒钟后我了解flush()方法,以及使用PrintWriter和BufferedWriter。但是,您给我的代码给了我两个错误:“类型new View.OnClickListener(){}的方法BuffredWriter(OutputStreamWriter)未定义”,第二个错误相同,但penFileOutput(String,int)未定义。我犯了一个小错误。固定的。