编译器错误的含义是什么“变量x可能尚未初始化”

时间:2015-11-25 21:44:18

标签: java android

我正在尝试编写一个可以读写文件的Java Android程序。我有一些问题。当运行最后一行时,Eclipse告诉我,我的totalString变量可能尚未初始化。但是,我在try循环中为它赋值。当我删除最后一行并运行我的程序时,我的控制台显示“Read Filefully Successfully”,以及“java.io.FileInputStream@d77ffd1”。这绝对不是我写给文件的价值。我不知道我在这里做错了什么,我有点失去理智。另外,如果我尝试添加像

这样的行
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);

4 个答案:

答案 0 :(得分:1)

inputStream.read()MIGHT抛出异常。在这种情况下,变量MIGHT不能被初始化。只需将声明更改为

即可
String totalString = null;

或者,您可以将System.out.println移动到try-block的末尾,其中,当到达时因为没有抛出异常,该变量被初始化。

答案 1 :(得分:1)

inputStream.toString()返回字符串,表示InputStream对象的ID 。不是文件中的数据。

如果您想要从InputStream读取文件中的数据,则需要使用内置方法来读取文件。最简单的方法是将InputStream对象包装在BufferedReader(或任何其他Reader对象)中,然后使用.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.");
    }

现在输出:

您可以使用与以前完全相同的技术,只需将对象更改为他们的作家'等价物。例如:

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之前。固定的。

答案 2 :(得分:0)

另外,阅读一些有关读取和写入文件的教程。

inputStream.read()将从流中读取一个字节。但是,如果您不将该函数的返回值赋给变量,则将其丢弃。

inputStream.toString()完成它所说的。它试图描述对象,而不是流的内容。

答案 3 :(得分:0)

我会这样做

  FileOutputStream outputStream=new FileOutputStream(filename);

    ObjectOutputStream stringSaver = new ObjectOutputStream(outputStream);   

   stringSaver.writeObject(balanceString); 
   stringSaver.close();   
    outputStream.close();

所有这一切都在try中保存文件中的String然后用

加载它
         FileInputStream inputStream = new FileInputStream(filename);  
         ObjectInputStream objectStream = new ObjectInputStream(inputStream);   
         totalString = (String) objectStream.readObject();
         objectStream.close();
        inputStream.close();

这也是试试抓... 它应该工作。 该问题解决了一个变量可能尚未初始化。

当你不明白代码的一部分可以自由地问:D