【发布时间】:2012-02-25 04:01:32
【问题描述】:
如果文件位于本地文件系统中,为什么在处理外部文件操作时必须在 main 方法中使用“抛出 IOException”。
【问题讨论】:
-
谁说它是强制性的?如有必要,您也可以抓住它。
-
这不是“强制性的”。你可以抓住它,你可以“发布”你不会抓住它(因此你会传递它)。你唯一不能做的就是默默地忽略它。
标签: java ioexception
如果文件位于本地文件系统中,为什么在处理外部文件操作时必须在 main 方法中使用“抛出 IOException”。
【问题讨论】:
标签: java ioexception
将 throws IOException 添加到您的 main 函数可能不是强制性的,但必须对异常执行一些操作。当您在执行文件 io、网络 io 或其他 (?) io 时,可能会出现问题。该文件可能不存在,它可能位于磁盘的坏扇区,网络可能在中途崩溃(如果磁盘不是本地磁盘,这可能对网络或文件 io 很重要)。
您需要对 IOException 进行处理的原因是它是一个已检查的异常。如果您调用构造函数或抛出已检查异常的函数,那么您需要通过捕获它并采取适当的措施来处理它。或者你需要告诉编译器你知道这个异常,但是你不打算对它做任何事情,在这种情况下你必须在你的函数定义中声明throws IOException。
还有另一种类型的异常,未经检查的异常(有时称为运行时异常,因为它们都扩展了 RuntimeException)。未经检查的异常应该是潜在的运行时问题。例如NullPointerException (NPE),一个由运行时条件引起的 NPE 示例是,当您希望返回对象的某些内容返回 NULL,然后您尝试对其调用方法时。至少理论上是这样的。
所以您可能会想,好吧,运行时异常是针对未预料到的运行时问题,那么为什么 IOException 不是运行时异常!这不像我计划让压裂盘发生故障,或者让斯克内克塔迪的反铲操作员挖出半个海岸。 为了大声哭泣,我也想知道!有人给我一个哈利路亚,哦,我听到了!
我已经在 Java 中完成了大量与 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 函数?正确的答案可能是让异常冒出来,让运行时将其报告给试图运行您的代码的可怜人。
谢谢,晚安。
【讨论】:
使用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());
}
}
【讨论】:
AFAIK,这不是强制性的。
您要么处理异常,要么不处理。
如果你确实处理了异常,那么你需要放置一个try {...} catch(IOException e) {...},但如果你不处理它,只需在当前方法中声明throws IOException即可。
【讨论】:
抛出 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();
}
【讨论】:
这不是强制性的,但至少你需要
要么处理异常,要么不处理
如果你确实处理了异常,那么你需要放置一个try {...} catch(IOException e) {...},但如果你不处理它,只需在当前方法中声明throws IOException即可。
【讨论】: