我已经尽我所能在互联网上找到的所有内容,但似乎没有任何解决方法。我恳求帮助,告诉我我做错了什么。我是Java的新手。谢谢!
import java.util.Scanner;
class File_Scanner {
public static void read() {
File credentials_file = new File("credentials.txt");
Scanner file_reader = new Scanner(credentials_file);
String[] users = new String[6];
int index_counter = 0;
try {
while (file_reader.hasNextLine()) {
users[index_counter] = file_reader.nextLine();
}
file_reader.close();
} catch (Exception e) {
System.out.println(e.getClass());
}
}
}
这显示了以下错误
Unreported exception FileNotFoundException; must be caught or declared to be thrown
答案 0 :(得分:2)
我建议使用main
块将整个read
函数包围起来,如下所示。
try/catch
import java.util.Scanner;
class File_Scanner{
public static void read(){
try {
File credentials_file = new File("credentials.txt");
Scanner file_reader = new Scanner(credentials_file);
String[] users = new String[6];
int index_counter = 0;
while (file_reader.hasNextLine()) {
users[index_counter] = file_reader.nextLine();
}
file_reader.close();
} catch (Exception e) {
System.out.println(e.getClass());
}
}
}
的想法是避免在运行程序时可能发生的任何错误。对于您而言,如果未找到或删除try/catch
,Scanner file_reader = new Scanner(credentials_file);
可能会引发错误。因此,您需要在credentials_file
块周围进行覆盖,这将为您提供一个异常,可以对其进行处理以在try
块中显示正确的响应消息。
希望有帮助!
答案 1 :(得分:2)
对于该问题,我也同意其他答案(Scanner
找不到文件时会抛出异常)。我还没有看到我认为正确的解决方案。
String[] users = new String[6];
int index_counter = 0;
File credentials_file = new File("credentials.txt");
try (Scanner file_reader = new Scanner(credentials_file)) {
while (file_reader.hasNextLine()) {
users[index_counter] = file_reader.nextLine();
index_counter++;
}
} catch (FileNotFoundException e) {
// handle exception
} catch (NoSuchElementException e) {
// handle exception
} catch (IllegalStateException e) {
// handle exception
}
try-with-resources语句将自动为您关闭Scanner
。这将与实现AutoCloseable
接口的任何类一起使用。
在这种情况下,它将语句放在try
的范围内,因此将捕获异常。
您的异常处理是有问题的,因此未包括在内。但这不是重点。您可以阅读有关Best Practices to Handle Exceptions in Java或How to Specify and Handle Exceptions in Java的更多信息。
有一个论点,您应该让异常冒泡给调用者。 This answer描述了如何做到这一点。但是在这种情况下,调用者实际上并不知道如何处理FileNotFoundException
,因为它对文件一无所知。该文件在此方法中定义。
您可以抛出一个不同的,更具解释性的异常。或者,您可以在这里通过解释credentials.txt
是什么来处理异常。或故障转移到默认值。或者只是记录异常,尽管这是有问题的。如果这样做,则应解释(在评论中)为什么足够。
我添加了一行以递增index_counter
,只是因为它似乎丢失了。
另请参见
答案 2 :(得分:1)
Java已检查异常。这意味着,如果您方法中的代码声明它可能会抛出特定异常,则您的方法要么需要执行以下操作之一:
任何(1)处理该异常:
if statements
或(2)声明它可能会抛出该异常:
public static void read() {
try {
// your method code
} catch (FileNotFoundException ex) {
// handle the exception
}
}
答案 3 :(得分:1)
只需将其添加到您的方法声明中即可:
public static void read() throws FileNotFoundException
有关处理Java中检查的异常的方法,请检查this(Oracle Docs Java Tutorials):
通过提供一个或一个,将异常处理程序与try块相关联 在try块之后直接有更多catch块。两者之间不能有代码 try块的结尾和第一个catch块的开始。
尝试{
} catch(ExceptionType名称){
} catch(ExceptionType名称){
}
还有this:
有时候 适用于代码捕获其中可能发生的异常。在 但是,在其他情况下,最好让方法进一步调用 堆栈处理异常
公共无效writeList()引发IOException {
P.S。另外,它已经是discussed on stackoverflow,因此也许应该标记为重复。
答案 4 :(得分:0)
您应该阅读Java检查的异常
public static void read() {
try {
File credentials_file = new File("credentials.txt");
Scanner file_reader;
file_reader = new Scanner(credentials_file);
String[] users = new String[6];
int index_counter = 0;
while (file_reader.hasNextLine()) {
users[index_counter] = file_reader.nextLine();
}
file_reader.close();
} catch (FileNotFoundException e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
} catch (Exception e) {
System.out.println(e.getClass());
}
}