Think in Java 笔记_Chapter12_1_Exception基础_异常处理3_自定义异常以及抛出多个异常的处理
-
自定义异常
package cn.seven.shengsiyuan.exception; public class MyException extends Exception{//非运行时异常,因为只是继承了Exception并非RuntimeException public MyException() { // TODO Auto-generated constructor stub } public MyException(String message){ super(message);//查看源代码发现不停调用父类的super()方法,直到Throwable } }
-
一个方法抛出多个自定义的异常的处理
package cn.seven.shengsiyuan.exception; public class MyExceptionTest { public void method(String str) throws MyException,MyException2{ if(null==str){ throw new MyException("传入的字符串不能为null"); } else if("hehe".equals(str)){//这样写比较好,就不不会出现NullPointerException,因为要是str写前面可能会出现str=null的情况 throw new MyException2("传入的字符串不能为hello"); } } public static void main(String[] args) {//对非运行时的异常的处理方法1:我声明了异常,谁调用我就要处理这个异常,要是不处理就继续抛出 MyExceptionTest exceptionTest = new MyExceptionTest(); try { exceptionTest.method("hehe"); } catch (MyException e) { // TODO Auto-generated catch block System.out.println("MyException"); e.printStackTrace(); } catch (MyException2 e) { System.out.println("MyException2"); e.printStackTrace(); } } } -
一个方法抛出多个自定义异常 时 catch Exception和catch 自定义异常 位置的摆放
package cn.seven.shengsiyuan.exception; public class MyExceptionTest { public void method(String str) throws Exception { if (null == str) { throw new MyException("传入的字符串不能为null"); } else if ("hehe".equals(str)) {// 这样写比较好,就不不会出现NullPointerException,因为要是str写前面可能会出现str=null的情况 throw new MyException2("传入的字符串不能为hello"); } } public static void main(String[] args) {// 对非运行时的异常的处理方法1:我声明了异常,谁调用我就要处理这个异常,要是不处理就继续抛出 MyExceptionTest exceptionTest = new MyExceptionTest(); try { exceptionTest.method("hehe"); } // 对非运行时的异常的处理方法1:我声明了异常,谁调用我就要处理这个异常,要是不处理就继续抛出 catch (MyException e) { // Unreachable catch block for MyException. It is already handled by // the catch block for Exception // TODO Auto-generated catch block System.out.println("MyException"); e.printStackTrace(); } catch (MyException2 e) { System.out.println("MyException2"); e.printStackTrace(); } catch (Exception e) { /* * * method()若抛出的是 MyException和Myexception2的父类Exception对象, * 那么下面的异常捕获的时候就需要写catch Exception语句块了, 若是catch Exception语句块 * 写在所有的catch语句块 * 最前面,那么所有的异常都将又这个语句块进行捕获,其他的方法会出现错误:不可达的方法,也就是你写的这个方法是不可能被执行的 * Unreachable catch block for MyException2. It is already handled * by the catch block for Exception 若是catch Exception语句块 * 写在所有的catch语句块 最后面,那么只会捕获method方法抛出的对应的异常,不会执行catch Exceptio语句块 * (这里是指method分别抛出 MyException和Myexception2的父类Exception对象) */ // TODO Auto-generated catch block System.out.println("Exception"); e.printStackTrace(); }} }
-
用自定义的异常封装java api的异常
- 非运行时异常,jdk中方法抛出为非运行时异常
- 将JDK中的异常转换为自定义的异常,catch块中捕获一个异常,然后再将该异常进行封装,再进行抛出异常
- 因为很多时候会大量使用jdk的api会大量抛出checkedException,可以进行捕获,然后再进行自己的封装,这样的做法在实际实际开发中非常常见(绝大部分的java书是理想化的书,,,就像java核心技术中说到的我们不会那些玩具一样的案例)
public void method() throws MyException{ try{ System.out.println("hello"); } catch(Exception e){ e.printStackTrace(); System.out.println("catch"); throw new MyException();//这里就可以对java api的异常进行自己的封装,并抛出 } finally{ System.out.println("finally"); } }
- 因为很多时候会大量使用jdk的api会大量抛出checkedException,可以进行捕获,然后再进行自己的封装,这样的做法在实际实际开发中非常常见(绝大部分的java书是理想化的书,,,就像java核心技术中说到的我们不会那些玩具一样的案例)
郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。