• JAVA 中的异常(2)- 异常的处理方式一:try-catch


    1. try - catch(finally):捕获,自己处理

    try - catch 必须搭配使用,不能单独使用。finlly子句:与 try - catch语句连用,不管try - catch 语句是否执行顺利,finlly 语句都会被执行。

    代码格式1:

    try {
        //可能出现异常的代码
    } catch (异常类型 变量名) {
        //异常处理代码
    } finally {
        //一定会执行的代码,如关闭资源
    }
    

    执行顺序:

    • 先执行try{}语句的内容,看是否会出现问题(异常)
    • 有:直接跳转到catch{}语句中开始执行,完成之后再执行finally{}语句中的内容。
    • 没有:直接执行finally语句的内容
    • 当异常问题被解决后 会继续执行下面代码

    代码格式2:
    try - catch 可以同时存在多个catch 语句

    try {
    }
    catch (异常类型1 变量名1) {
    }
    catch (异常类型2 变量名2) {
    }
    ......
    catch (异常类型n 变量名n) {
    }
    

    代码中发生异常,异常被抛给第一个catch块,如果不匹配则继续往下一个catch进行传递
    注: 一个try代码块后面跟多个catch代码块的情况就叫多重捕获

    代码格式3:
    在Java7以前,每个catch语句块只能捕获一种异常,从Java7开始就支持一个catch捕获多种异常,多个异常之间用|隔开。

    try{
        //可能会产生异常的代码
    }
    catch(Exception1 | Exception2 |... | Exception_n e1){
        //统一处理的异常代码
    }
    finally{
        //通常是释放资源的代码
    }
    

    2. try - catch用法

    public class ExceptionDemo {
        public static void main(String[] args) {
            try {
                // 除数不能为0,此行会抛出 ArithmeticException 异常
                int i = 10 / 0;
                // 抛出异常后,此行不会执行
                System.out.println("i = " + i); 
            } catch (ArithmeticException e) { // 捕获 ArithmeticException 异常
                // 异常最详细信息
                e.printStackTrace();  
                // 发生异常的原因
                System.out.println("e.getMessage() : " + e.getMessage()); 
                // 获取异常的类型和异常描述信息
                System.out.println("e.toString() : " + e.toString());  
            }
        }
    }
    

    3. finally 用法

    • try - catch - finally搭配使用,或者 try - finally 搭配使用。
    • finally代码块中的代码总会被执行
    • 一般用于资源回收释放等操作
    public class ExceptionDemo {
        public static void main(String[] args) {
        
            // try-catch-finally搭配使用
            try {
                int[] arr = {1,2,3};
                // 数组索引越界,此行会抛出 ArrayIndexOutOfBoundsException 异常
                int i = arr[3];
                // 抛出异常后,此行不会执行
                System.out.println("i = " + i);
            }catch(ArithmeticException e) {
                System.out.println(e.getMessage());
            }finally {
                System.out.println("finally");
            }
            
            // try-finally搭配使用
            try {
                int[] arr = {1,2,3};
                int i = arr[3];
                System.out.println("i = " + i);
            }finally {
                System.out.println("finally");
            }
        }
    }
    

    4. 范例

    例4.1

    public class trycatch {
     
    	public static void main(String[] args) {
    	
    		try {
    		    int a =10 / 0;
    		    System.out.println("a:"+a);
    		}catch (Exception e) {
    			System.out.println("出现异常");
    	    }finally {
    		    System.out.println("finally");
         	}
         	
    		System.out.println("end");
    	}
    }
    

    输出结果:

    出现异常错误

    finally

    end

    解释: try程序段发生异常后,执行catch段,然后执行finally段,然后顺寻执行try - catch - finally段后面的程序。

    例4.2

    public class trycatch {
     
    	public static void main(String[] args) {
    		// TODO Auto-generated method stub
    		try {  //写尝试要执行的代码
    		int a =10 / 0;
    		System.out.println("a:"+a);
    		}catch (Exception e) {
    			System.out.println("出现异常错误");
                return;
    	    }finally {
    		    System.out.println("finally");
    	    }
    	    // 程序return,try - finally 代码块后续代码不会执行
    		System.out.println("end");
        }
    }
    

    输出结果:

    出现异常错误

    finally

    解释: try程序段发生异常后,执行catch段,然后执行finally段,然后执行catch段的return

    例4.3

    public static void main(String[] args) {
    	
    	try {
    		int a =10 /10;
    		System.out.println("a:"+a);
    		return;
    	}catch (Exception e) {
    		System.out.println("出现异常错误");
    	}finally {
    		System.out.println("finally");
    	}
    	// 程序return,try - finally 代码块后续代码不会执行
    	system.out.println("end");
    }
    }
    

    输出结果:

    a:1

    finally

    解释: try - catch - finally 语句中有return语句时,会执行 finally 语句内容但不会执行 try - catch - finally 语句之外的代码。

    例4.4

    public class ExceptionDemo {
        public static void main(String[] args) {
        
            // try-catch-finally搭配使用
            try {
                int[] arr = {1,2,3};
                // 数组索引越界,此行会抛出 ArrayIndexOutOfBoundsException 异常
                int i = arr[3];
                // 抛出异常后,此行不会执行
                System.out.println("i = " + i);
            }catch(ArithmeticException e) {
                System.out.println(e.getMessage());
                // 程序强制退出,finally 代码块不会执行
                System.exit(0); 
            }finally {
                System.out.println("finally");
            }
            // 程序强制退出,try - finally 代码块后续代码不会执行
    	    system.out.println("end");
            
        }
    }
    

    5. 注意点:

    • try-catch-finally 搭配: 这种形式捕获异常时,开发者可以在 catch 代码块中处理异常(如打印日志、日志记录等),异常处理权在开发者。
    • try-finally 搭配: 这种形式捕获异常时,默认抛出给 JVM 处理,JVM默认处理时调用 e.printStackTrace() 方法打印异常详细信息。
    • finally 代码块: 除非程序强制退出,否则无论程序是否发生异常,finally 代码块总会执行。
      finally 中抛出异常会覆盖(消灭)前面 try 或者 catch 中的异常,尽量避免在 finally 代码块中抛出异常。
    • 如果 try 中和 finally 中都有 return 语句,程序会先执行 finally 中的 return 语句,然后程序块运行结束,而不会执行 try 中的 return 语句。所以尽量不在finally中使用 return 语句。
    • finally代码块只有一种情况不会被执行:那就是在finally之前执行了System.exit(0)。finally代码块通常用来关闭资源(数据库连接,IO流等)。
    • try是一个独立的代码块,在try中定义的变量只能在try块中使用,如果想在try块外使用,则需在try外建立引用,在try中初始化。
    • catch语句可以定义多个,但子类异常需要先catch,否则代码不可达,编译不通过。
    • finally块仅仅用来释放资源是最合适的,减轻finally的任务,不要在finally中做一些其它的事情。将尽量将所有的return写在函数的最后面,而不是try ... catch ... finally中。
    • 方法在重写时,不能抛出新的异常类型,只能抛出原有异常类型及其子类。
    • 多个异常使用捕获:多个异常分别处理

    作者:快乐随行

    https://www.cnblogs.com/jddreams/p/14281918.html


    ---- 作者:快乐随行 著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明原文作者及出处。 ----
  • 相关阅读:
    如何确定Kafka的分区数、key和consumer线程数
    Storm程序永久代内存溢出
    JVM堆内存相关的启动参数:年轻代、老年代和永久代的内存分配
    Git添加本地项目出现fatal: unable to get credential storage lock: File exists
    Kafka的通讯协议
    文件上传 数据对比
    jquery 弹出层
    XSS 简单理解之:AntiSamy
    XSS 简单理解
    超人说我最叼蝙蝠侠笑了 超级英雄战力排名
  • 原文地址:https://www.cnblogs.com/jddreams/p/14281918.html
Copyright © 2020-2023  润新知