何时在Java方法声明中使用投掷?
-
10-10-2019 - |
题
因此,我认为我对Java中的异常处理有很好的基本了解,但是最近我正在阅读一些使我感到困惑和怀疑的代码。我想在这里解决我的主要疑问是,当一个人应该在Java方法声明中使用以下几点:
public void method() throws SomeException
{
// method body here
}
从阅读一些类似的帖子,我收集到 扔 被用作一种声明 某些感觉 可以在执行方法期间抛出。
我的混乱来自一些看起来像这样的代码:
public void method() throws IOException
{
try
{
BufferedReader br = new BufferedReader(new FileReader("file.txt"));
}
catch(IOException e)
{
System.out.println(e.getMessage());
}
}
有什么原因您想使用 扔 在这个示例中?看来,如果您只是对诸如IOException之类的基本异常处理,那么您只需要尝试/捕获块就可以了。
解决方案
如果您要捕获异常类型,则不需要扔它,除非您要重新抛弃它。在您发布的示例中,开发人员应该做一个或另一个,而不是两者兼而有之。
通常,如果您不打算做任何例外,则不应抓住它。
您可以做的最危险的事情是抓住例外,不要对此做任何事情。
很好地讨论何时适当地抛出例外情况
其他提示
如果该方法抛出检查的异常,则只需要在方法上包含一个throw子句。如果该方法引发了运行时异常,则无需这样做。
有关检查与未选中的例外的一些背景,请参见此处: http://download.oracle.com/javase/tutorial/essential/exceptions/runtime.html
如果该方法捕获了异常并在内部进行处理(如第二个示例中),则无需包含throw子句。
您查看的代码不是理想的。您应该:
捕获例外并处理它;在这种情况下
throws
是不必要的。去除
try/catch
;在这种情况下,例外将通过呼叫方法来处理。捕获例外,可能会执行一些动作,然后重新恢复异常(不仅仅是消息)
你是正确的,在那个示例中 throws
是多余的。它可能从以前的某些实现中留在那里 - 也许最初是抛出的例外,而不是陷入困境。
在您给出的示例中,该方法永远不会抛出ioexception,因此声明是错误的(但有效)。我的猜测是原始方法抛出了IOException,但随后已更新以处理内部的异常,但声明没有更改。
您发布的代码是错误的,如果要捕获特定的异常以处理ioException,但抛出没有捕获的例外,则应抛出异常。
就像是:
public void method() throws Exception{
try{
BufferedReader br = new BufferedReader(new FileReader("file.txt"));
}catch(IOException e){
System.out.println(e.getMessage());
}
}
或者
public void method(){
try{
BufferedReader br = new BufferedReader(new FileReader("file.txt"));
}catch(IOException e){
System.out.println("Catching IOException");
System.out.println(e.getMessage());
}catch(Exception e){
System.out.println("Catching any other Exceptions like NullPontException, FileNotFoundExceptioon, etc.");
System.out.println(e.getMessage());
}
}
这不是答案,而是评论,但我无法用格式的代码写评论,因此这是评论。
假设有
public static void main(String[] args) {
try {
// do nothing or throw a RuntimeException
throw new RuntimeException("test");
} catch (Exception e) {
System.out.println(e.getMessage());
throw e;
}
}
输出是
test
Exception in thread "main" java.lang.RuntimeException: test
at MyClass.main(MyClass.java:10)
该方法不会声明任何“抛出”异常,而是抛出它们!诀窍是,抛出的异常是RuntimeExceptions(未检查),不需要在该方法上声明。对于该方法的读者来说,这有点具有误导性,因为她所看到的只是“投掷e”;声明,但没有声明抛出异常
现在,如果我们有
public static void main(String[] args) throws Exception {
try {
throw new Exception("test");
} catch (Exception e) {
System.out.println(e.getMessage());
throw e;
}
}
我们必须在该方法中声明“抛出”异常,否则我们会收到编译器错误。