我目前正在尝试在BlueJ完成一个项目。我有ReadWrite
班和InvalidFileException
班。
我希望将toString()
类中的InvalidFileException
方法调用ReadWrite
方法中的writeToFile()
类。
readWrite只能处理以.txt
结尾的文件。一旦布尔值完成并找到一个不以.txt
结尾的文件,它应该返回我的自定义异常类。
如果文件类型存在,writeToFile
方法检查布尔值;如果没有,它应该返回我创建的InvalidFileException
。
我相信我需要在else语句之后调用它,但我没有运气搞清楚。
这是我的代码。
ReadWrite类:
public boolean writeToFile() {
boolean ok;
try {
FileWriter writer = new FileWriter(file);
{
if (file.toLowerCase().endsWith(".txt")) {
ok = true;
write();
} else {
ok = false;
}
}
} catch (IOException e) {
ok = false;
}
}
InvalidFileExceptionClass *****
import java.io.FileNotFoundException;
public class InvalidFileException extends Exception {
/**
* Constructor for objects of class InvalidFileException
*/
public InvalidFileException(String message) {
super(message);
}
public String toString() {
return ("Sorry but this system only accepts .txt files");
}
}
答案 0 :(得分:3)
这里有几个问题。
首先,你不要“召唤”一个例外;你抛出一个。使用throw
关键字可轻松完成此操作。布尔值在这里完全无关紧要。
接下来,您的自定义异常会扩展Exception
,这意味着它已经过检查。你要么必须亲自抓住它,要么宣布它被扔掉。你不想在这里抓住它,但是你希望调用者来处理它。使用throws
关键字也可以轻松完成。
最后,你不想完全覆盖toString
,完全忽略你传递的信息。除了你的信息之外,加入提供的信息是一个更好的设计,但是我把这个决定留给了你。
这可能看起来像这样:
public boolean writeToFile() throws InvalidFileException {
try {
FileWriter writer = new FileWriter(file);
if (file.toLowerCase().endsWith(".txt")) {
write();
} else {
throw new InvalidFileException("this message is completely ignored");
}
} catch (IOException e) {
throw e; // something bad has happened and the exception should propagate
}
}
无论调用什么,这种方法都必须将其包装在自己的try...catch
:
try {
readWriteInstance.writeToFile();
} catch (InvalidFileException e) {
System.out.println(e.toString());
}
答案 1 :(得分:1)
当您检测到错误时,需要调用throw new InvalidFileException()
,然后捕获该异常。扔掉之后立即捕捉它是没有意义的,你也可以在那里打印错误字符串。您应该在writeToFile
方法之外捕获它,这允许您在调用writeToFile
的方法中处理异常。