有几件事可以做,也有几件事不能做:
- 您不能使用可以引发已检查异常的代码来初始化变量。编译器会抱怨。所以你的行首- private FileInputStream ...是非法的。
 
- 您不能在静态- main()方法中使用实例变量。- ... dataStream ...一旦你把它放进去,编译器会再次抱怨- main()。
 
- 您可以- throws IOException在 main 方法上放置一个。
 
处理这些事情的一种方法是这样做:
public class RssReader {
    public static void main(String[] args) throws IOException {
        File dataFile = new File("data.dat");
        FileInputStream dataStream = new FileInputStream("data.dat");
        boolean fileExists;
        ... use the variables here ...
    }
}
如果您运行程序并且例如文件不存在,它将把您扔到命令行。如果发生这种情况,将打印错误消息和堆栈跟踪。
我在那里所做的是将所有变量移动到main()方法的范围内。然后我添加了throwson 方法,这样它就可以让 Java 调用的任何基本部分main()处理异常。
或者你可以做一些像这样的另一种方式:
public class RssReader {
    private static File dataFile = new File("data.dat");
    private static FileInputStream dataStream;
    static {
        try {
            dataStream = new FileInputStream("data.dat");
        } catch (IOException e) {
            throw new RuntimeException(e); // this isn't a best practice
        }
    }
    static boolean fileExists;
    public static void main(String[] args) {
        ... use the variables here ...
    }
}
如果查找文件有问题,它会做同样的事情。输出到命令行并打印消息。
这将可能的已检查异常隐藏在静态初始化程序块内,并在其周围带有 try-catch。经过检查的异常变成了未经检查的异常。它还使所有变量静态,因此它们可以在静态方法中使用main()
另一种可能的解决方案是一种更好的方法:
public class RssReader {
    private File dataFile = new File("data.dat");
    private FileInputStream dataStream;
    boolean fileExists;
    public RssReader() throws IOException {
        dataStream = new FileInputStream("data.dat");
    }
    public void doTheWork() {
        ... use all the variables here ...
    }
    public static void main(String[] args) {
        try {
           reader = new RssReader();
           reader.doTheWork();
        } catch (IOException e) {
            System.out.printf("File 'data.dat' not found. Exiting ...");
        }
    }
}
这是我最喜欢的一个。它使您可以控制发生异常时会发生什么,因此我们会打印一条信息性消息并告诉他们程序已完成。所有变量都是方法中创建的对象实例内的实例变量main()。Main 几乎什么都不做,只是创建实例并告诉它开始工作。Main 还决定如果它失败了怎么办。
更改是将所有内容移至实例范围并移出静态范围,但捕获致命异常除外。您可以将变量放在易于阅读的顶部。完成这项工作的方法有一个名称来描述它的作用。