Java 调用自定义异常类
我目前正试图在BlueJ中完成一个项目。我有一个Java 调用自定义异常类,java,exception,Java,Exception,我目前正试图在BlueJ中完成一个项目。我有一个ReadWrite类和一个InvalidFileException类 我希望将InvalidFileException类中的toString()方法调用到writeToFile()方法中的ReadWrite类 readWrite只能处理以.txt结尾的文件。一旦布尔运算完成并找到一个不是以.txt结尾的文件,它应该返回我的自定义异常类 writeToFile方法检查布尔值是否存在文件类型;如果不是,它应该返回我创建的InvalidFileExcep
ReadWrite
类和一个InvalidFileException
类
我希望将InvalidFileException
类中的toString()
方法调用到writeToFile()方法中的ReadWrite
类
readWrite只能处理以.txt
结尾的文件。一旦布尔运算完成并找到一个不是以.txt
结尾的文件,它应该返回我的自定义异常类
writeToFile
方法检查布尔值是否存在文件类型;如果不是,它应该返回我创建的InvalidFileException
我相信我需要在else声明之后再打电话给它,但我没有运气弄明白
这是我的密码
读写类:
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");
}
}
这里有几个问题
首先,不要“调用”异常;你扔一个。使用throw
关键字可以轻松实现这一点。布尔值在这里是完全无关紧要的
接下来,您的自定义异常扩展了异常
,这意味着它已被选中。你要么亲自抓住它,要么宣布要扔掉它。你不想在这里抓住它,但你想让打电话的人来处理它。使用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());
}
这里有几个问题
首先,不要“调用”异常;你扔一个。使用throw
关键字可以轻松实现这一点。布尔值在这里是完全无关紧要的
接下来,您的自定义异常扩展了异常
,这意味着它已被选中。你要么亲自抓住它,要么宣布要扔掉它。你不想在这里抓住它,但你想让打电话的人来处理它。使用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());
}
检测到错误时,需要调用抛出新的InvalidFileException()
,然后捕获该异常。在抛出它之后立即捕获它是没有意义的,您也可以在那里打印错误字符串。您应该在writeToFile
方法之外捕获它,这允许您在调用writeToFile
的方法中处理异常。当您检测到错误时,您需要调用throw new InvalidFileException()
,然后捕获该异常。在抛出它之后立即捕获它是没有意义的,您也可以在那里打印错误字符串。您应该在writeToFile
方法之外捕获它,这允许您在调用writeToFile
的方法中处理异常。请编辑您的问题。我不知道你在问什么。将first ok=false替换为throw new YourException(“你的消息”);无需定义toString(),您可以使用捕获到的异常的getMessage函数抱歉,Spectabularb,我已编辑了我的问题,该方法应确保要写入的文件以文件扩展名“.txt”结尾。如果不是,则应抛出我的“InvalidFileException”。我希望这会有意义。请编辑你的问题。我不知道你在问什么。将first ok=false替换为throw new YourException(“你的消息”);无需定义toString(),您可以使用捕获到的异常的getMessage函数抱歉,Spectabularb,我已编辑了我的问题,该方法应确保要写入的文件以文件扩展名“.txt”结尾。如果不是,则应抛出我的“InvalidFileException”。我希望这有点道理