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