Java 调用自定义异常类

Java 调用自定义异常类,java,exception,Java,Exception,我目前正试图在BlueJ中完成一个项目。我有一个ReadWrite类和一个InvalidFileException类 我希望将InvalidFileException类中的toString()方法调用到writeToFile()方法中的ReadWrite类 readWrite只能处理以.txt结尾的文件。一旦布尔运算完成并找到一个不是以.txt结尾的文件,它应该返回我的自定义异常类 writeToFile方法检查布尔值是否存在文件类型;如果不是,它应该返回我创建的InvalidFileExcep

我目前正试图在BlueJ中完成一个项目。我有一个
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”。我希望这有点道理