为什么必须使用“throws IOException”
AFAIK,它不是强制性的。
您要么处理异常,要么不要。
如果您确实处理异常,则需要输入try {...} catch(IOException e) {...}
,但如果不处理它,只需在当前方法中声明throws IOException
即可。
这是不是在所有强制使用throws IOException.
如果调用可以抛出异常,不过,你需要要么
- 抓住它的方法,或
- 声明你我们将重新推出它。
第二个是你在做什么。另一种 - 这往往是首选的技术 - 是自己捕捉和处理异常:
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());
}
}
它并不强制抛出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();
}
它可能不是强制性的将抛出的IOException添加到你的主函数中,但是它强制性地处理异常。当你在做文件io,网络io或其他(?)io时,可能会出错。该文件可能不存在,它可能位于磁盘的坏扇区中,网络可能在中途崩溃(如果磁盘不是本地磁盘,则可能对网络或文件io很重要)。
你需要做IOException的原因是它是一个检查异常。如果调用构造函数或引发检查异常的函数,则需要通过捕获并采取适当的操作来处理它。或者你需要告诉编译器你知道这个异常,但是你不打算做任何事情,在这种情况下,你必须在中声明throws IOException
你的函数定义。
还有另一种类型的异常,未经检查的异常(有时称为运行时异常,因为它们都会延长RuntimeException)。未检查的异常应该是潜在的运行时问题。例如NullPointerException(NPE)是由于运行时条件导致的NPE的一个示例,当您希望返回对象的内容返回NULL时,然后尝试调用该方法。至少这是理论。
因此,您可能会想,运行时异常是针对意料之外的运行时问题,那么为什么heck不是IOException运行时异常!它不像我计划让摩擦盘发生故障,或者在斯克内克塔迪的反铲运营商拿走半个海岸。 为了大声哭泣,我也想知道!有人给我一个哈利路亚,哦,我听到你!
我已经在Java中完成了大量的IO相关工作,并且打字throws IOException
就像我刚刚学过的那种旁观者,因为一般来说,尝试在低级别处理IOExceptions是个坏主意,因为低级代码根本就不知道上下文是什么你想要做什么,它应该让这些异常冒泡到你想要完成的上下文的代码。
哦,顺便说一句,我提到,我想知道为什么IOException不是运行时异常,而像NPE是什么?是的,这是一个运行时间条件,但IO(磁盘,网络,无论什么)比你想象的要可靠得多。如果您确信磁盘是可靠的,请阅读Sun发明ZFS的一些原因。如果您认为该网络是可靠的,请尝试确保您的营销内容可靠地下载到糟糕的基于Windows的15,000个亭子而不是恶劣的3D聚会网络上,并确保客户永远不会看到因网络而断开的垃圾图像问题。 (你可以说sha-1哈希和孩子?我知道你可以)。
我正在某处与此;我承诺。
我认为IOException是一个检查异常的原因是IO不可靠(请看Fallacies of Distributed Computing的谬误#1)。通常,您应该能够从代码中获取NPE错误,但IO是一个不同的野兽,它不可靠,我认为他们的意图是强迫你去思考它。我有没有提到Fallacies of Distributed Computing的作者之一是James Gosling。詹姆斯高斯林,这个人是Java的父亲?是的,那至少是我的理论。无论是这个,还是这只是一个巨大的愚蠢的错误。早期的Java库中有很多。
关于检查异常的用处,我们有很多争论,随着时间的推移,我认同那些认为他们不值得付出努力的人,并且如果存在很多情况烦人的毫无意义的检查异常被宣布,我会包装它们并重新抛出一个适当的运行时异常(对我的lil friend打个招呼!)。尽管如此,我不会惹恼IOException;明智的做法是忍受痛苦。
呵呵,简单来说,一个代码是否都适合公共静态void main(String [])抛出IOException异常函数?正确的答案是,可能只是让异常冒出来,让运行时报告给正在尝试运行代码的可怜人。
谢谢,晚安。
比我想象的更容易阅读。 :) – 2017-10-30 08:15:31
它不是强制性的,但至少你需要 要么处理异常或者你没有 如果你这样做处理异常,那么你就需要把try {...} catch(IOException e) {...}
,但如果你不处理它,只需在当前方法中声明throws IOException
即可。
谁说这是强制性的?如有必要,您也可以抓住它。 – BalusC 2012-02-25 04:03:48
这不是“强制性”的。你可以捕捉它,你可以“发布”你不会捕捉它(因此你会传递它)。你*无法做的唯一事情就是默默地忽略它。 – paulsm4 2012-02-25 04:06:20