Java异常处理
2017-07-28 14:02
363 查看
Java的异常处理有两种方式:
- 默默解决。使用
try...catch。
- 甩锅。使用
throw和
throws。
通常,我们喜欢用
try/catch捕获异常,然后对异常进行处理。但是有时候,我们也会不予理会,直接将异常扔出去,让调用者自己去处理异常。当然对调用者来说,它也有两种同样的选择:自己处理掉,或者再往外扔,交给自己的调用者,由新的调用者继续背锅。
以下是几种正常与不正常的异常处理方式示例,从中可以看出异常处理的流程:
测试类一
正常抛出异常。声明throws且
throw:
package Exception; public class ExceptionThrow { public static void foo() throws Exception { throw new Exception("throw my exception."); } }
测试类二
声明throws,但是不
throw(不抛出异常):
package Exception; public class ExceptionNotThrow { public static void bar() throws Exception { ; } }
测试类三
异常已经由本方法已处理,但是仍声明throws:
package Exception; public class ExceptionHandledButThrow { public static void foobar() throws Exception { try { ExceptionThrow.foo(); } catch (Exception e) { System.out.println("Catch an exception: " + e.getMessage()); } } }
测试类四、五:
package Exception; import java.util.concurrent.TimeoutException; public class InnerException { public static void foo() throws TimeoutException { throw new TimeoutException("inner timeout exception"); } } package Exception; public class OuterException { public static void bar() throws Exception { try { InnerException.foo(); } catch (NullPointerException e) { e.getMessage(); System.out.println("Only catch NullPointerException."); } } }
测试类:
package Exception; public class Main { public static void main(String[] args) { System.out.println("=========Case 1========="); try { ExceptionThrow.foo(); System.out.println("=>1: Should never be printed!!!"); } catch (Exception e) { if (e.getMessage().contains("my")) { System.out.println("Exception happens: " + e.getMessage()); // e.printStackTrace(); } else { System.out.println("=>2: Should never be printed!!!"); } } finally { System.out.println("=>3: Should always be printed!!!"); } System.out.println("=========Case 2========="); try { ExceptionNotThrow.bar(); System.out.println("=>1: Should be printed!!!"); } catch (Exception e) { e.printStackTrace(); System.out.println("=>2: Should never be printed!!!"); } finally { System.out.println("=>3: Should always be printed!!!"); } System.out.println("=========Case 3========="); try { ExceptionHandledButThrow.foobar(); System.out.println("=>1: Should be printed!!!"); } catch (Exception e) { System.out.println("=>2: Should never be printed!!!"); } System.out.println("=========Case 4========="); try { OuterException.bar(); } catch (Exception e) { System.out.println("In main: " + e.getMessage()); } }
结果
=========Case 1========= Exception happens: throw my exception. =>3: Should always be printed!!! =========Case 2========= =>1: Should be printed!!! =>3: Should always be printed!!! =========Case 3========= Catch an exception: throw my exception. =>1: Should be printed!!! =========Case 4========= In main: inner timeout exception
分析
Case1:try在捕获到异常之后,直接进入
catch,运行
catch之内的部分。
catch可以根据异常的情况,进行不同的处理逻辑。
Case2:如果
try捕获不到异常,将继续执行
try后面的部分,
catch部分则直接跳过。(eg:
ExceptionNotThrow.bar(),只声明
throws却不
throw,相当于方法永不会抛出异常,则处理这个方法异常的
try永远都不会捕获到异常)
Case3:如果本方法(eg:
ExceptionHandledButThrow.foobar())已经处理了异常,还声明
throws,则调用者同样在
try块里永远都不会捕获到异常(因为异常已经被处理了),但是调用者必须有
try/catch,因为所调用的方法(
foobar())虽然不抛异常,但是坑爹地声明了
throws。
Case4:如果本方法没有
catch住被调用者抛出的异常,则必须将异常继续
throws出去,否则会报错。
相关文章推荐
- java异常处理
- java异常和日志处理规范
- JAVA-异常的捕获及处理
- java异常处理的throw和throws
- 详谈Java 异常处理的误区和经验总结(分享)
- Java 中常见的异常及处理
- Java程序员从笨鸟到菜鸟之(十二)java异常处理机制
- java异常的学习和理解(包含异常的处理方式,异常的分类,运行时异常和编译时异常,自定义异常)
- Java语言中进行异常处理的关键字具体含义:throws、throw、try、catch、finally
- java异常处理之自定义异常类(转)
- 【Java中级】(五)异常处理
- java语言---异常处理要点(1)
- java.lang.ClassNotFoundException: package com.xiangang.qq_client.Prototal 常见异常处理方法
- JAVA中的异常及处理
- java异常处理
- java.io.IOException:stream closed 异常的原因及处理
- 黑马程序员-----------java异常处理
- Java 异常处理学习总结
- java编程思想阅读笔记(六)异常处理
- Java-异常处理