我有代码:
public class RssReader {
private File dataFile = new File("data.dat");
private FileInputStream dataStream = new FileInputStream("data.dat");
boolean fileExists;
public static void main(String[] args) {
}
}
我的问题是,我可以将FileInputStream或任何需要Try / catch的代码作为全局函数吗?
答案 0 :(得分:3)
是的,你可以。你可以声明main
方法抛出任何类型的Exception
,即
public static void main(String[] args) throws IOException {
}
您可以省略代码中的try-catch块。
但是,我强烈建议不要这样做。首先,try-catch块存在是有原因的。他们在这里捕获您可能预见但无法控制的异常(即错误的文件格式)。其次,即使异常发生,它们也会让你在finally
块中关闭流。
答案 1 :(得分:0)
是的,如果你让你的构造函数抛出异常,你可以这样做:
class RssReader {
private File dataFile = new File("data.dat");
private FileInputStream dataStream = new FileInputStream("data.dat");
boolean fileExists;
RssReader()throws IOException{}
}
然后每次构造一个新的RssReader
对象时,处理这种构造的方法也应抛出它(如darijan所说),或者你可以在这个方法中创建一个try-catch块:
public void someMethod() throws IOException {
RssReader r = new RssReader();
}
或:
public void someMethod() {
RssReader r;
try {
r = new RssReader();
} catch (IOException e) {
e.printStackTrace();
}
}
答案 2 :(得分:0)
您可以通过使用throws Exception对方法进行签名来添加该代码。但是当你有一个流阅读器或类似的东西时,不建议这样做,因为你经常需要关闭流或冲洗作者。
我认为您需要在需要打开或关闭流对象时考虑它。
答案 3 :(得分:0)
你可以做几件事,有几件你做不到:
您无法使用可以抛出已检查异常的代码初始化变量。编译器会抱怨。因此,以private FileInputStream ...
开头的行是非法的。
您不能在静态main()
方法中使用实例变量。将... dataStream ...
置于main()
内后,编译器会再次投诉。
您可以在主方法上添加throws IOException
。
处理这些事情的一种方式就是这样做:
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
,这样它就可以让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还决定如果失败该怎么办。
更改是将所有内容移动到实例范围并超出静态范围,除了捕获致命异常。您可以将变量保留在易于阅读的顶部。做这项工作的方法有一个名称来描述它的作用。