Java 在哪里处理异常

Java 在哪里处理异常,java,exception,exception-handling,Java,Exception,Exception Handling,我目前正在做一个项目,我遇到了一点麻烦。我已经用Java编程大约两年了,我讨论过异常,但从未正确理解它们 在我目前的情况下,我有一个初始化类的main方法 WikiGraph wiki = wiki = new WikiGraph(getFile()); Wikigraph构造函数采用我通过getFile()方法中的对话框获得的文件名 wikigraph的构造函数然后调用名为loadfile(filename)的方法,该方法尝试加载和解析给定的文件 loadfile()方法是抛出不正确的Fil

我目前正在做一个项目,我遇到了一点麻烦。我已经用Java编程大约两年了,我讨论过异常,但从未正确理解它们

在我目前的情况下,我有一个初始化类的main方法

WikiGraph wiki = wiki = new WikiGraph(getFile());
Wikigraph构造函数采用我通过
getFile()
方法中的对话框获得的文件名

wikigraph的构造函数然后调用名为
loadfile(filename)
的方法,该方法尝试加载和解析给定的文件

loadfile()
方法是抛出不正确的FileTypeError的地方

我的问题是,我应该在哪里处理

目前,我在
loadfile()
方法中捕捉到了它

try {
    //load file
} catch (IncorrectFileTypeError e){
    System.out.println("Incorrect file type: "+filename+": "+e.getMessage());
    throw new IncorrectFileTypeError();
}
但我在WikiGraph初始化时也发现了它,如下所示:

while(wiki==null){                          //While There is no valid file to add to the wikigraph
    try {
        wiki = new WikiGraph(getFile());    //Try to load file  
    } catch (IncorrectFileTypeError e) {    //If file cannot be loaded
        JOptionPane.showMessageDialog(null, "Incorrect File Type Given. Please Choose another file."); //Display error message
        getFile();                          //Prompt user for another file
    }
}
现在我处理错误的方法是正确的/最好的方法吗?或者应该在其他地方处理它,比如在
getFile()
方法中

编辑:我想我应该把文件问题弄清楚一点。 文件扩展名不是IncorrestFileTypeError所基于的,因此它可能是一个误导性的错误名称。
给定的文件可能几乎有任何扩展名,其内容必须格式正确。

我认为在
加载文件中捕获它是没有意义的。您仍然可以编写日志消息(使用
System.err
),只需在引发异常之前编写即可。捕捉异常的方法是正确的(在这种情况下会再次提示用户)。

异常的主要好处之一是,它们为您提供了方便的方法来处理远离异常发生位置的异常。在不支持它的语言中,必须让路径上的每个调用检查返回值、break和return,以便手动传播

在您认为可以从异常中恢复或最好地报告异常并取消操作的情况下,处理异常是有意义的

我的理解是,交互从UI输入开始,如果文件类型不合适,就无法真正恢复。因此,我将让启动文件打开的任何UI任务捕获异常,向用户报告发生了错误,并取消或请求其他输入


在第二次阅读时,似乎您已经开始尝试创建图形,然后正在打开对话框。我个人喜欢隔离UI交互。因此,我个人会首先处理所有UI输入,获取预期的文件名,验证它是否满足我的需要,如果不满足,则向用户报告,如果文件正常,则继续操作,然后仅报告关键和意外错误

在这种情况下,我将避免使用异常作为处理错误文件类型的主要方法。如果用户输入可以定期触发异常,则不应将其视为异常。以下是我将采取的方法:

  • 检查文件类型,如果文件类型无效,则通过标准控制流提醒用户。您可以在WiTrach上考虑静态方法,如IsFileValid(文件名)
  • 在WikiGraph初始化中,如果文件类型无效,则引发异常

  • 这种方法提供了两全其美的效果——当提供无效数据时,您有机会提醒用户,同时从WikiGraphs的角度确保提供的信息是准确的。它为开发人员提供了一种方法来确保他们的输入是有效的,而不必进行异常处理。

    如果问题是用户选择了错误类型的文件,那么我认为您根本不应该让代码继续进行那么久。这看起来根本不应该是一个例外,更应该是程序中的一条路径。如果用户选择了不正确的文件类型,则应向其提供再次选择文件的选项。显然,如果只需查看扩展名就可以了,那么您应该将JFileChooser中的选择限制为正确类型的文件。

    我认为这就是选中的异常设计用于的情况类型(无论您是否同意)。我假设
    不正确的FileTypeError
    扩展了
    Error
    ?扩展
    RuntimeException
    会更合适,而扩展
    IOException
    会更好,因为这种错误可以由有效的用户输入触发(即键入存在但类型错误的文件名)。

    我相信这类错误(IncorrectFileTypeError)可以在用户输入表单中解决,避免不必要的往返文件系统服务层。

    这是人们处理异常处理方式的主观观点。我会把它放在社区WikiAh是的,但我的文件扩展名没有设置。我得到了一个要处理的示例.idx文件。它可以是.txt,或者任何东西,所以我不能根据文件扩展名进行检查,只能根据文件的内容进行检查。isFileValid()方法随后必须解析该文件以检查其有效性,因此既然loadfile()方法中已经发生了这种情况,我就不应该在那里捕捉到它。是的,不幸的是,这些问题可能会出现。如果可以对文件进行相对简单的检查(即检查标题),我仍然建议在UI级别无例外地失败,但对于更复杂的检查,您可能需要签入loadfile()。@Chris:我不同意。如果文件无效,显然他试图创建的WikiGraph实例无法正确初始化。允许部分初始化的实例是非常危险的。所以我只需要让构造函数声明异常,然后在构造函数周围放置一个try-catch。试一试当然仍然会提示用户。@sleske:实际上这是一个很好的观点。我没有考虑过。因此,我会在loadFile()方法中抛出错误,但在