为什么必须使用“throws IOException”

时间:2012-02-25 04:01:33

标签: java ioexception

如果文件位于本地文件系统中,为什么在处理外部文件操作时必须在main方法中使用“throws IOException”。

5 个答案:

答案 0 :(得分:19)

可能没有必要将throws IOException添加到main函数中,但它必须对异常执行某些操作。当你在做文件io,网络io或其他(?)io时,可能会出现问题。该文件可能不存在,它可能位于磁盘的坏扇区,网络可能会中途崩溃(如果磁盘不是本地磁盘,这可能对网络或文件io很重要。)

您需要对IOException执行某些操作的原因是它是一个已检查的异常。如果您调用构造函数或抛出已检查异常的函数,则需要通过捕获它并采取适当的操作来处理它。或者你需要告诉编译器你知道异常,但是你不打算对它做任何事情,在这种情况下你必须在你的函数定义中声明throws IOException。 / p>

还有另一种类型的异常,即未经检查的异常(有时称为运行时异常,因为它们都扩展了RuntimeException)。未经检查的异常应该是潜在的运行时问题。例如NullPointerException(NPE),由运行时条件引起的NPE的一个示例是当您希望返回一个对象的某些东西返回NULL时,然后您尝试调用该方法。至少这是理论。

所以你可能会想,好吧,运行时异常是针对意外的运行时问题,那么为什么heck不是IOException运行时异常!它不像我计划让盘片失效,或者让斯克内克塔迪的反铲操作员取出一半的海岸线。 为了大声哭泣,我也想知道!有人给我一个哈利路亚,哦,我听到你了!

我已经在Java中完成了大量与IO相关的工作,并且键入throws IOException有点像我刚刚学会使用的眼睛,因为一般来说,尝试处理IOExceptions是一个坏主意一个低级别,因为低级代码根本不知道 你正在尝试做什么的上下文,它应该让这些异常冒泡到代码哪里有关于什么的上下文你想要完成。

哦,顺便说一下,我提到过我想知道为什么IOException不是运行时异常,而像NPE这样的东西呢?是的,这是一个运行时条件,但IO(磁盘,网络,等等)的可靠性远远低于您的想象。如果您确信磁盘是可靠的,请阅读Sun发明ZFS的一些原因。如果您认为网络是可靠的,请尝试确保您可以将营销内容可靠地下载到15,000个糟糕的基于Windows的信息亭,而不是糟糕的3D聚会网络,并确保客户永远不会看到因网络而损坏的垃圾图像问题。 (你能说sha-1哈希和孩子吗?我知道你可以)

我要去这个地方;我承诺。

我认为IOException是一个经过检查的异常的原因是IO不可靠(去看看Fallacies of Distributed Computing的谬误#1。)一般来说,你应该能够从你的NPE中获取NPE错误代码,但IO是一个不同的野兽,它不可靠,我认为他们的意图是强迫你去思考它。我是否提到Fallacies of Distributed Computing的作者之一是James Gosling。詹姆斯·戈斯林,同一个人被认为是Java的父亲?是的,这至少是我的理论。无论是那个还是只是一个巨大的愚蠢错误。早期的Java库中有很多这样的东西。

关于检查异常的有用性存在很多争论,随着时间的推移,我开始同意那些说他们不值得付出努力的人,如果有的话,那里有很多例子。恼人的无意义检查异常被声明,我将包装它们并重新抛出适当的运行时异常(向我的lil friend问好!)。尽管如此,我并没有搞乱IOException;明智的做法就是忍受痛苦。

哦,简单来说,一个代码都适合public static void main(String [])抛出IOException函数吗?正确的答案可能只是让异常泡沫消失,让运行时将其报告给试图运行代码的穷人。

谢谢,晚安。

答案 1 :(得分:18)

完全没有必要使用throws IOException.如果你调用一个可以抛出异常的方法,你需要

  1. 抓住它,或
  2. 声明你要重新抛出它。
  3. 第二个是你正在做的事情。另一个 - 通常是首选技术 - 是自己捕获和处理异常:

    public static void main(String[] argv) {
        try {
            FileReader f = new FileReader("foo.txt");
            // ... more
        } catch (IOException ioe) {
            System.out.println("Trouble reading from the file: " + ioe.getMessage());
        } 
    }
    

答案 2 :(得分:2)

AFAIK,并非强制性。

您要么处理异常,要么不处理异常。

如果您确实处理了异常,那么您需要设置try {...} catch(IOException e) {...},但如果您不处理它,只需在当前方法中声明throws IOException

答案 3 :(得分:1)

它根本不是强制抛出IOException ..... 但它抛出IOException或fileNotFoundException然后捕获它以便如果找不到你的文件然后程序不会爆炸并给你一个错误消息。

你需要使用Try和catch .... 这是一个可能有用的代码片段...........

Scanner fileScanner = null;
        try
        {
            fileScanner = new Scanner(new File("YOUR FILE PATH"));
            while(fileScanner .hasNextLine())
            {
                String eachLine= scanner.nextLine();
                String[] wordsFromFile = eachLine.split("\\W");
            }
        }
        catch(FileNotFoundException e)
        {
            System.err.println("Cannot find the file");
        }
        finally
        {
            if(scanner!= null)
                scanner.close();
        }

答案 4 :(得分:-1)

这不是强制性的,但至少你需要这样做 要么处理异常,要么不处理异常 如果您确实处理了异常,那么您需要设置try {...} catch(IOException e) {...},但如果您不处理它,只需在当前方法中声明throws IOException