2012-02-25 105 views
4

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

+4

谁说这是强制性的?如有必要,您也可以抓住它。 – BalusC 2012-02-25 04:03:48

+1

这不是“强制性”的。你可以捕捉它,你可以“发布”你不会捕捉它(因此你会传递它)。你*无法做的唯一事情就是默默地忽略它。 – paulsm4 2012-02-25 04:06:20

回答

2

AFAIK,它不是强制性的。

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

如果您确实处理异常,则需要输入try {...} catch(IOException e) {...},但如果不处理它,只需在当前方法中声明throws IOException即可。

18

这是不是在所有强制使用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()); 
    } 
} 
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(); 
     } 
16

它可能不是强制性的将抛出的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异常函数?正确的答案是,可能只是让异常冒出来,让运行时报告给正在尝试运行代码的可怜人。

谢谢,晚安。

+1

比我想象的更容易阅读。 :) – 2017-10-30 08:15:31

-1

它不是强制性的,但至少你需要 要么处理异常或者你没有 如果你这样做处理异常,那么你就需要把try {...} catch(IOException e) {...},但如果你不处理它,只需在当前方法中声明throws IOException即可。

相关问题