我在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
答案 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();
}
说明:
System.console().printf()
可以在stdout上打印消息。可能首选System.out
是严格要求“控制台”。System.console()
进行控制台管理。更容易和更清晰。不要忘记分配控制台(即不要使用javaw
可执行文件)。printStackTrace()
在stderr call stack上打印,便于在代码中找到错误位置。建议:
printStackTrace()
的调用并不是很好,你应该快速引入一个日志系统来打印消息。答案 1 :(得分:0)
你说"自然"你把它放在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();
}
}
write
和close
仍然可以在技术上抛出错误(例如磁盘已满),我们允许级联并终止该程序。