使用FileInputStream编译错误表示变量未初始化

时间:2015-12-17 15:00:49

标签: java

有人能告诉我在下面的java代码中我做错了什么吗?它不编译并给我编译错误。

import java.io.*;

public class ShowFile {

    public static void main(String[] args) {
        int i;
        FileInputStream Fin;

        try {
            Fin = new FileInputStream("C:\\Users\\cbr\\Desktop\\test.txt");
        } catch (FileNotFoundException exp) {
            System.out.println("exception caught" + exp);
        }
        try {

            do {
                i = Fin.read();
                System.out.print((char) i);
            } while (i != -1);
        } catch (IOException exp) {
            System.out.println("Exception caught" + exp);

        }
        finally {
            try {
                Fin.close();
            } catch (IOException exp) {
                System.out.println("Exception caught" + exp);
            }
        }
    }
}

而下面的代码编译。您可以看到两个初始化都在try块中。

import java.io.*;

class ShowFile2 {

    public static void main(String args[]) {
        int i;
        FileInputStream fin;
// First make sure that a file has been specified.

        try {
            fin = new FileInputStream("C:\\Users\\cbr\\Desktop\\test.txt");
        } catch (FileNotFoundException exc) {
            System.out.println("File Not Found");
            return;
        }
        try {
// read bytes until EOF is encountered
            do {
                i = fin.read();
                if (i != -1) {
                    System.out.print((char) i);
                }
            } while (i != -1);
        } catch (IOException exc) {
            System.out.println("Error reading file.");
        }
        try {
            fin.close();
        } catch (IOException exc) {
            System.out.println("Error closing file.");
        }
    }
}

2 个答案:

答案 0 :(得分:2)

问题是,如果new FileInputStream("C:\\Users\\cbr\\Desktop\\test.txt");抛出异常,则不会在方法的第二部分初始化变量。这是不允许的。创建对象时,对象成员将初始化为null,但局部变量不是这种情况:必须明确初始化它们。

快速修复(但请继续阅读以获得更好的修复)是在定义变量时将其初始化为null

FileInputStream fin = null;

这将解决您的编译错误,但是,当第一个catch块中抛出异常时,您将获得NullPointerException

更好的解决方案是将错误处理逻辑放在同一位置:如果创建FileInputStream失败,则无论如何都不想从中读取字节。所以你可以使用一个try-catch块:

try {
    fin = new FileInputStream("C:\\Users\\cbr\\Desktop\\test.txt");
    // Read bytes from fin.
    ...
} catch (IOException e) {
    // handle exception
    ...
}

最终建议:为确保您的输入流在所有情况下都已关闭,您可以使用try-with-resources块:

try (fin = new FileInputStream("C:\\Users\\cbr\\Desktop\\test.txt")) {
    // Read bytes from fin.
    ...
} catch (IOException e) {
    // handle exception
    ...
}

答案 1 :(得分:1)

它确实编译,因为ShowFile2类在catch块中包含return:这将确保变量fin将始终初始化。

在第一堂课中,你遇到了异常并继续执行你的程序。