Think in Java 笔记_Chapter12_1_Exception基础_异常处理3_自定义异常以及抛出多个异常的处理

  1. 自定义异常

    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
    	}
    	
    }
    

     

  2. 一个方法抛出多个自定义的异常的处理


    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(); } } }

     

  3. 一个方法抛出多个自定义异常 时 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();
    		}}
    
    	}
    

     

  4. 用自定义的异常封装java api的异常

    1. 非运行时异常,jdk中方法抛出为非运行时异常
    2. 将JDK中的异常转换为自定义的异常,catch块中捕获一个异常,然后再将该异常进行封装,再进行抛出异常
      1.   因为很多时候会大量使用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");
        		}
        	}
        

         

郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。