Java PrintStream问题

时间:2012-08-15 18:52:59

标签: java io

我正在尝试修改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 个答案:

答案 0 :(得分: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声明异常。

答案 1 :(得分: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

答案 2 :(得分: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了。你的代码不是用红色加下划线的吗?

答案 3 :(得分: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); 
}

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

在一个设计良好的应用程序中,所有表示失败的异常 - 而不是预期的替代情况 - 必须沿着堆栈帧向上传播到所谓的异常障碍,所有失败都是统一处理的。