没有Try和Catch的Java代码

时间:2013-06-14 15:48:25

标签: java global

我有代码:

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 个答案:

答案 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)

你可以做几件事,有几件你做不到:

  1. 您无法使用可以抛出已检查异常的代码初始化变量。编译器会抱怨。因此,以private FileInputStream ...开头的行是非法的。

  2. 您不能在静态main()方法中使用实例变量。将... dataStream ...置于main()内后,编译器会再次投诉。

  3. 您可以在主方法上添加throws IOException


  4. 处理这些事情的一种方式就是这样做:

    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还决定如果失败该怎么办。

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