我在下面的代码片段中有点混乱。
try {
public static void showMyName(String str) throws IOException
{
if(str.equals("What is your Name?"))
throw new IOException;
}
}catch(IOException e)
{
System.out.println ("Exception occurs , catch block called")
}
现在,我的问题是 throws IOException && 抛出新IOException
为什么我们不需要使用catch,最后阻止抛出IOException ?
throws 如何处理异常。 ?
答案 0 :(得分:2)
生成Exception
时,有两种方法可以处理它。
catch
阻止throws
阻止因此,处理已生成的异常是由catch
或throws
完成的。
另一方面,throw
用于生成异常""。
通常,当您实例化Exception对象或将已生成的异常级联到调用者时,将使用throw
关键字。
例如,
public void doSomething(String name) throws SomeException { // Exception declared
if( name == null ){ // cause of the exception
throw new SomeException(); // actual NEW exception object instantiated and thrown
}
// Do something here
.
.
.
}
在调用方法中,
public static void main(String[] args) throws SomeException{ // Need to declare exception because you're "throwing" it from inside this method.
try { // try doing some thing that may possibly fail
doSomething(name);
} catch (SomeException e){
throw e;// throw the exception object generated in doSomething()
}
}
或者,你可以"处理" catch块中的异常:
public static void main(String[] args) { // No need to declare exception
try { // try doing some thing that may possibly fail
doSomething(name);
} catch (SomeException e){
System.out.println("Exception occurred " + e.getMessage()); // Handle the exception by notifying the user.
}
}
希望这有帮助。
附录 - 异常处理词汇表
try
- 用于调用可能导致异常的代码或使用文件/流/网络/数据库连接等资源。catch
- 在try
阻止后立即使用"处理"或"扔"例外。如果使用finally
,则可选。finally
- 在try
或catch
阻止后立即使用。可选的。用于执行"必须"被执行。即使finally
或try
有catch
声明,return
块总是内的代码也会被执行。throw
- 用于"推送"或"级联"通过调用方法的异常。始终在方法中使用。throws
- 用于"声明"如果出现问题,方法将抛出异常。始终用作方法签名的一部分。地方阅读
Here's an elaborate article帮助您理解java中的try-catch-finally语义。
<强>更新强>
要回答您的其他问题,
为什么我们不要使用catch,最后阻止抛出 IOException?
将catch
和throws
视为互斥结构。 (这并非总是如此,但为了您的理解,从这个想法开始是件好事。)
您声明了一个方法throws IOException
。这段代码是在您声明方法的位置编写的。而且,从语法上讲,你不能在try块中放置方法声明。
throws如何处理异常。 ?
就像我之前提到的那样,在异常处理期间使用了catch
和finally
。 throws
仅用于将异常级联回调用者。
答案 1 :(得分:1)
throw new IOException
表示您遇到了一些错误情况,并决定通过抛出异常来打破程序流。
如果该异常是一个已检查的异常(即不是Error或RuntimeException),则必须在catch块中捕获该异常,或者在方法的签名中声明该方法应该抛出该异常(或者超常的那种例外)。这就是throws IOException
的含义。
答案 2 :(得分:1)
你非常正确。除了一件事,我稍后会提到。
throws与方法API一样,也是名称和参数的一部分。客户端知道他们是否调用该方法,他们需要处理该异常 - 通过简单地抛出它或者通过捕获它并处理它(实际上可能需要抛出包装原始的另一个异常)。抛出在编译时解决。
扔掉是让运行时知道发生了不好事情的实际行为 - 我们担心的特殊情况实际上已经发生了。所以它需要在运行时处理。但是当你说“当你在方法中存在一个throw语句时,应该总是出现方法签名时,你就不太对了。”这通常是正确的,但并非总是如此。我还可以调用另一个在我的方法中抛出异常的方法,如果我没有捕获它,我的方法需要抛出它。在这种情况下,我没有明确抛出相同的例外。
最后一点是,当异常是一个经过检查的异常时,您只需要在throws中声明一个异常 - 这意味着它来自RuntimeException的Exception类层次结构的另一端。常见的已检查异常是IOException和SQLException。如果您不自行处理,则必须在方法签名的throws部分中列出已检查的异常。任何继承RuntimeException的东西 - 比如你的例子中的NoSuchElementException以及讨厌的NullPointerException - 是一个未经检查的异常,不必被捕获或抛出或任何东西。
通常,您使用已检查的异常来解决可恢复的问题(客户端知道会发生什么,可以优雅地处理问题并继续前进)和未经检查的灾难性异常(例如无法连接到数据库)。
如果您可以通过所有AOP内容,this就如何有效地使用已检查和未检查的异常进行了很好的讨论。
答案 3 :(得分:1)
第一个最大的区别是投掷可以像你在河里扔石头一样抛出异常, 并抛出这个方法有机会抛出异常,但可能也没有...这就是为什么抛出不需要尝试catch因为它已经表明它会抛出某种异常。
答案 4 :(得分:1)
throws
关键字表示此方法将抛出必须在更高级别处理的任何异常。
public static void showMyName(String str) throws IOException
如果另一个方法调用此方法,则必须捕获此异常或再次抛出它(通过在其签名中键入throws
)。
抓住异常或继续抛出异常,取决于您的业务逻辑。