1

我有代码:

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 的代码作为全局函数吗?

4

4 回答 4

3

是的你可以。您可以声明该main方法抛出Exception任何类型的,即

public static void main(String[] args) throws IOException {
}

您可以省略代码中的 try-catch 块。

不过,我强烈建议不要这样做。首先,try-catch 块的存在是有原因的。它们在这里捕获您可能预见但无法控制的异常(即错误的文件格式)。finally其次,即使发生异常,它们也会让您以块的形式关闭流。

于 2013-06-14T15:49:42.780 回答
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();
    }
} 
于 2013-06-14T15:58:33.567 回答
0

您可以通过使用 throws Exception 对方法进行签名来添加该代码。但是当你有一个流阅读器或类似的东西时不建议这样做,因为你经常需要关闭流或刷新作者。

我认为当您需要打开或关闭流对象时应该考虑一下。

于 2013-06-14T16:01:26.437 回答
0

有几件事可以做,也有几件事不能做:

  1. 您不能使用可以引发已检查异常的代码来初始化变量。编译器会抱怨。所以你的行首private FileInputStream ...是非法的。

  2. 您不能在静态main()方法中使用实例变量。... dataStream ...一旦你把它放进去,编译器会再次抱怨main()

  3. 您可以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 还决定如果它失败了怎么办。

更改是将所有内容移至实例范围并移出静态范围,但捕获致命异常除外。您可以将变量放在易于阅读的顶部。完成这项工作的方法有一个名称来描述它的作用。

于 2013-06-14T16:10:36.743 回答