2

我正在尝试修改 java 代码以将某些内容写入 txt 文件。原始代码是:

try {
    out = new PrintStream(system.out, true, "UTF-8");
} catch (UnsupportedEncodingException e) {
    // TODO Auto-generated catch block
    e.printStackTrace();
}

我使用 FileOutputStream 来执行此操作,并将代码修改为:

try {
    FileOutputStream os = new FileOutputStream("wiki.txt", true);
    out = new PrintStream(os, true, "UTF-8");
} catch (UnsupportedEncodingException e) {
    // TODO Auto-generated catch block
    e.printStackTrace();
}

但它不起作用,错误是:

Wikipedia2Txt.java:56: unreported exception java.io.FileNotFoundException; must be caught or declared to be thrown
    FileOutputStream os = new FileOutputStream("wiki.txt");
                          ^
1 error

我尝试了两种方法: 1,我在磁盘上手动制作了一个 wiki.txt 文件;2、运行代码前不存在wiki.txt。但任何一个都不起作用。它只是在编译时停止。

那么发生了什么?谢谢。

4

4 回答 4

6

Java 并没有告诉您找不到该文件,只是告诉您它可能在运行时找不到,并且您的程序还没有准备好处理它。

这是解决此问题的一种方法:

try {
    FileOutputStream os = new FileOutputStream(file, true);
    out = new PrintStream(os, true, "UTF-8");
} catch (UnsupportedEncodingException e) {
    // TODO Auto-generated catch block
    e.printStackTrace();
} catch (FileNotFoundException fnf) {
    // TODO Auto-generated catch block
    fnf.printStackTrace();
}

这是另一种方式:

try {
    FileOutputStream os = new FileOutputStream(file, true);
    out = new PrintStream(os, true, "UTF-8");
} catch (IOException e) {
    // TODO Auto-generated catch block
    fnf.printStackTrace();
}

第一种方法确保编译器您的代码准备好分别处理这两个异常;第二种方法确保编译器您的代码准备好处理这两个异常的超类。这两种方式并不相同,因为第二种方式比第一种方式涵盖更多的异常。

最后,还有另一种方法可以通过使用throws块声明您的函数来使编译器静音(公共超类或两个单独的类都可以)。这是一种告诉编译器你的函数不知道如何处理这些异常的方法,它们应该由调用者处理。这种方法的结果是函数的每个调用者都必须在调用周围放置一个 try/catch,或者使用throws.

于 2012-08-15T18:54:59.913 回答
4

FileOutputStream您正在使用的构造函数的签名是public FileOutputStream(File file) throws FileNotFoundException. 这意味着它是您必须处理的已检查异常。因此,请确保您编写此代码的方法要么处理此异常(即将此异常指定为catch块的一部分),要么您专门抛出此异常。

因此,以下任何一项都适合您:

catch块中指定

try {
    FileOutputStream os = new FileOutputStream(file, true);
    out = new PrintStream(os, true, "UTF-8");
} catch (UnsupportedEncodingException e) {
    // TODO Auto-generated catch block
    e.printStackTrace();
}catch (FileNotFoundException e) {
    // TODO Auto-generated catch block
    e.printStackTrace();
}

或者让你的方法成为throw这个例外 - 所以你的方法签名就像return_type method_name (params_list) throws FileNotFoundException

于 2012-08-15T18:54:46.167 回答
2

您需要处理找不到文件时的情况。

试试这个:

try {
    File file = (..your code..)
    FileOutputStream os = new FileOutputStream(file, true);
     out = new PrintStream(os, true, "UTF-8");
} catch (UnsupportedEncodingException e) {
    // TODO Auto-generated catch block
    e.printStackTrace();
} catch (FileNotFoundException e) {
   // Handling a situation when file is not found.
   e.printStackTrace();
}

您的 IDE(例如 Eclipse、IDEA、NetBeans)应该在这种情况下提供额外的帮助。当您生成存根时,您可能已经在使用 IDE。你的代码不是有红色下划线吗?

于 2012-08-15T18:58:24.020 回答
1

您只是在践踏 Java 的痛处之一:检查异常。代码运行时可能会发生无数异常,但只有其中一部分必须提前声明。我处理你的代码的首选方法是将所有检查的异常包装RuntimeException到一个你可以在堆栈跟踪的其他地方处理的地方:

try {
  FileOutputStream os = new FileOutputStream(file, true);
  out = new PrintStream(os, true, "UTF-8");
} catch (RuntimeException e) { 
  throw e; 
} 
catch (Exception e) { 
  throw new RuntimeException(e); 
}

在大多数情况下,在异常发生的地方处理异常是错误的,会导致异常被吞下,并且通常是不可靠、难以调试的代码。

In a well-engineered application all exceptions that represent a failure—rather than an expected alternative situation—must be propagated up the stack frame towards the so-called exception barrier, where all failures are uniformly handled.

于 2012-08-15T18:59:34.523 回答