【问题标题】:Why it is mandatory to use "throws IOException"为什么必须使用“抛出 IOException”
【发布时间】:2012-02-25 04:01:32
【问题描述】:

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

【问题讨论】:

  • 谁说它是强制性的?如有必要,您也可以抓住它。
  • 这不是“强制性的”。你可以抓住它,你可以“发布”你不会抓住它(因此你会传递它)。你唯一不能做的就是默默地忽略它。

标签: java ioexception


【解决方案1】:

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

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

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

所以您可能会想,好吧,运行时异常是针对未预料到的运行时问题,那么为什么 IOException 不是运行时异常!这不像我计划让压裂盘发生故障,或者让斯克内克塔迪的反铲操作员挖出半个海岸。 为了大声哭泣,我也想知道!有人给我一个哈利路亚,哦,我听到了!

我已经在 J​​ava 中完成了大量与 IO 相关的工作,输入 throws IOException 有点像我刚刚学会忍受的这种令人讨厌的东西,因为一般来说,尝试以较低的速度处理 IOExceptions 是个坏主意级别,因为低级代码根本不知道你正在尝试做什么的上下文是什么,它应该让这些异常冒泡到你的上下文有上下文的代码'重新尝试完成。

哦,顺便说一句,我提到我想知道为什么 IOException 不是运行时异常,而像 NPE 这样的东西是?是的,这是一个运行时条件,但是 IO(磁盘、网络等)远没有您想象的那么可靠。如果您确信磁盘是可靠的,请阅读有关 Sun 发明 ZFS 的一些原因。如果您认为该网络是可靠的,请尝试确保您已通过糟糕的 3d 派对网络将营销内容可靠地下载到 15,000 个基于 Windows 的蹩脚信息亭,并确保客户永远不会看到由于网络而损坏的垃圾图像问题。 (你能说 sha-1 hash sum children 吗?我知道你可以)。

我要带着这个去某个地方;我保证。

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

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

哦,简单来说,一件事代码是否都适合 public static void main(String[]) throws IOException 函数?正确的答案可能是让异常冒出来,让运行时将其报告给试图运行您的代码的可怜人。

谢谢,晚安。

【讨论】:

    【解决方案2】:

    使用throws IOException. 完全不是强制性的

    1. 抓住它,或者
    2. 声明你将重新抛出它。

    第二个是你正在做的事情。另一种——通常是首选技术——是自己捕获和处理异常:

    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());
        } 
    }
    

    【讨论】:

      【解决方案3】:

      AFAIK,这不是强制性的。

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

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

      【讨论】:

        【解决方案4】:

        抛出 IOException 完全不是强制性的..... 但是抛出 IOException 或 fileNotFoundException 然后捕获它是一个好习惯,这样如果找不到你的文件,那么程序就不会崩溃并给你一个错误消息。

        您将需要使用 Try and catch.... 这是一个可能有用的代码sn-p............

        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();
                }
        

        【讨论】:

          【解决方案5】:

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

          【讨论】:

            猜你喜欢
            • 2021-03-05
            • 2012-01-13
            • 2012-09-21
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2013-04-26
            • 1970-01-01
            相关资源
            最近更新 更多