FileWriter问题 - 必须捕获的未报告的IOEXception

时间:2015-10-01 23:37:56

标签: java exception java-io filewriter

我在Java中遇到了一个尝试使用FileWriter写入文件的问题。简单地声明FileWriter writer = new FileWriter("filelocation");会产生一个必须捕获的未报告的IOException。

为了解决这个问题,我自然会将我的FileWriter放在try-catch块中,但这会导致范围问题。为了解决这个问题,我尝试在try catch块之前声明FileWriter并在try catch中分配位置。在我想使用FileWriter的try catch块之后,它告诉我它可能没有被初始化。我不确定如何处理这个问题,并且从未在Java 1.7或类似问题中遇到过这个问题。

这是我最后情况的一个例子,以防我不清楚;

Scanner userInput = new Scanner(System.in);
FileWriter writer;
try {
    System.out.println("Enter the file directory you would like to store in");
    String fileLocation = userInput.nextLine();
    writer = new FileWriter(fileLocation);
} catch(java.io.IOException e) {
    System.out.println("Error message");
}
writer.write("Stuff"); //writer may not have been initialized

2 个答案:

答案 0 :(得分:0)

好方法:

System.console().printf("Enter the file directory you would like to store in");
String location = System.console().readLine();
try (FileWriter writer = new FileWriter (location)) {
  writer.write("Stuff");
} catch (IOException e) {
  new RuntimeException("Error message", e).printStackTrace();
}

说明:

  1. System.console().printf()可以在stdout上打印消息。可能首选System.out是严格要求“控制台”。
  2. 使用System.console()进行控制台管理。更容易和更清晰。不要忘记分配控制台(即不要使用javaw可执行文件)。
  3. 使用try-with-resources statement
  4. 打开流
  5. printStackTrace()stderr call stack上打印,便于在代码中找到错误位置。
  6. 我已经构建了一个新的Exception来附加您的错误消息,堆栈跟踪会在堆栈中添加“catch”位置。
  7. 建议:

    1. 使用字节流进行文件访问(即FileOutputStream)。它可以强制执行charset(即OutputStreamWriter)和缓冲(即BufferedOutputStreamBufferedWriter)。
    2. 使用字节流也可以切换到NIO Channel API
    3. 使用StandardCharsets访问默认(并且很常用)charset(所有JVM实现必须支持的字符集)
    4. 阅读The Absolute Minimum Every Software Developer Absolutely, Positively Must Know About Unicode and Character Sets (No Excuses!)
    5. printStackTrace()的调用并不是很好,你应该快速引入一个日志系统来打印消息。
    6. 如果是CLI,在使用日志记录系统时要特别注意不要让用户混淆系统交互(即提示用户输入)和反馈(即进度信息)

答案 1 :(得分:0)

你说"自然"你把它放在try-catch块中。这有什么不自然的,因为有两种方法可以处理它,另一种方式更常见:

  • 处理try-catch块中的异常。
  • 不要处理异常,但声明您的方法抛出异常,并允许它级联调用堆栈。

您的代码在main方法中看起来很像,因此您可以添加throws IOException

public static void main(String[] args) throws IOException {

但是,在您的特定情况下,您从用户提示符处获取文件位置,因此,不是让程序因错误而死,而是告诉用户错误并提示一个新名字。

另外,请记得关闭资源。

public static void main(String[] args) throws IOException {
    Scanner userInput = new Scanner(System.in);
    FileWriter writer;
    do {
        System.out.println("Enter the file name you would like to store in");
        String fileLocation = userInput.nextLine();
        if (fileLocation.trim().isEmpty())
            return; // Exit program when user pressed enter with a name
        try {
            writer = new FileWriter(fileLocation);
        } catch(java.io.IOException e) {
            System.out.println("Cannot write to file: " + e);
            writer = null;
        }
    } while (writer == null);
    try {
        writer.write("Stuff"); //writer may not have been initialized
    } finally {
        writer.close();
    }
}

writeclose仍然可以在技术上抛出错误(例如磁盘已满),我们允许级联并终止该程序。