有几件事可以做,也有几件事不能做:
您不能使用可以引发已检查异常的代码来初始化变量。编译器会抱怨。所以你的行首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()
方法的范围内。然后我添加了throws
on 方法,这样它就可以让 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 还决定如果它失败了怎么办。
更改是将所有内容移至实例范围并移出静态范围,但捕获致命异常除外。您可以将变量放在易于阅读的顶部。完成这项工作的方法有一个名称来描述它的作用。