为什么必须使用"throws IOException"

May*_*tel 8 java ioexception

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

Ern*_*ill 19

完全没有必要使用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());
    } 
}
Run Code Online (Sandbox Code Playgroud)


Bil*_*ill 18

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

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

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

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

我已经在Java中完成了大量与IO相关的工作,打字throws IOException有点像我刚刚学会使用的那种眼睛,因为一般来说,尝试在低级别处理IOExceptions是一个坏主意,因为低级代码不知道在所有的方面是你想要做什么什么,应该让那些异常冒泡对代码,其中有背景上你要完成的任务.

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

我带着这个去了某个地方; 我承诺.

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

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

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

谢谢,晚安.


Gab*_*res 3

AFAIK,这不是强制性的。

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

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