zoukankan      html  css  js  c++  java
  • Java异常处理总结

    一、Java 异常继承框架

    Error:

    Error类对象由 Java 虚拟机生成并抛出,大多数错误与代码编写者所执行的操作无关。对于设计合理的应用程序来说,即使确实发生了错误,本质上也不应该试图去处理它所引起的异常状况。

    Exception:

    在Exception分支中有一个重要的子类RuntimeException(运行时异常),这些异常是不检查异常,程序中可以选择捕获处理,也可以不处理。这些异常一般是由程序逻辑错误引起的,程序应该从逻辑角度尽可能避免这类异常的发生;而RuntimeException之外的异常我们统称为非运行时异常,类型上属于Exception类及其子类,从程序语法角度讲是必须进行处理的异常,如果不处理,程序就不能编译通过。

    注意
    Error和Exception的区别:Error通常是灾难性的致命的错误,是程序无法控制和处理的,当出现这些异常时,Java虚拟机(JVM)一般会选择终止线程;Exception通常情况下是可以被程序处理的,并且在程序中应该尽可能的去处理这些异常。
    
    ♠提示
    除了RuntimeException及其子类以外,其他的Exception类及其子类都属于检查异常,当程序中可能出现这类异常,要么使用try-catch语句进行捕获,要么用throws子句抛出,否则编译无法通过。
    
    ♠提示
    对于运行时异常、错误和检查异常,Java技术所要求的异常处理方式有所不同。
    由于运行时异常及其子类的不可查性,为了更合理、更容易地实现应用程序,Java规定,运行时异常将由Java运行时系统自动抛出,允许应用程序忽略运行时异常。
    对于方法运行中可能出现的Error,当运行方法不欲捕捉时,Java允许该方法不做任何抛出声明。因为,大多数Error异常属于永远不能被允许发生的状况,也属于合理的应用程序不该捕捉的异常。
    对于所有的检查异常,Java规定:一个方法必须捕捉,或者声明抛出方法之外。也就是说,当一个方法选择不捕捉检查异常时,它必须声明将抛出异常。
    

    二、异常处理原则

    异常处理语法

    try{
        //code that might generate exceptions    
    }catch(Exception e){
        //the code of handling exception1
    }catch(Exception e){
        //the code of handling exception2
    } finally {
    }
    

    一个例子:

    public class Ex1 {
     
        public static void main(String[] args) {
            try{
            System.out.println(Ex1.getResult());
            }catch(Exception e){
                e.printStackTrace();
                System.out.println("截获异常catch");
            }finally{
                System.out.println("异常处理finally");
            }
        }
     
        public static int getResult() throws Exception{
            int a =100;
             
            try{
                 
                a=a+10;
                throw new RuntimeException();
            }catch(Exception e){
                System.out.println("截获异常并重新抛出异常");
                throw new Exception();           
            }finally{
                return a;
            }
        }
    }
    

    输出如下:

    截获异常并重新抛出异常
    110
    异常处理finally

    “截获异常catch”却没有执行!
    原因是在getResult()的finally中return一个值,等同于告诉编译器该方法没有异常,但实际上异常是有的,这样的结果是该方法的调用者却捕获不到异常,不要再finally中试图return一个值,这样可能会导致一些意想不到的逻辑错误,finally就是用来释放资源的!

    注意:在finally中改变返回值的做法是不好的,因为如果存在finally代码块,try中的return语句不会立马返回调用者,而是记录下返回值待finally代码块执行完毕之后再向调用者返回其值,然后如果在finally中修改了返回值,就会返回修改后的值。显然,在finally中返回或者修改返回值会对程序造成很大的困扰,C#中直接用编译错误的方式来阻止程序员干这种龌龊的事情,Java中也可以通过提升编译器的语法检查级别来产生警告或错误,Eclipse中可以在如图所示的地方进行设置,强烈建议将此项设置为编译错误。
    

    三、总结

    Java的异常处理的知识点杂而且理解起来也有点困难,这里给大家总结了以下几点使用java异常处理的时候,良好的编码习惯:

    1、处理运行时异常时,采用逻辑去合理规避同时辅助try-catch处理

    2、在多重catch块后面,可以加一个catch(Exception)来处理可能会被遗漏的异常

    3、对于不确定的代码,也可以加上try-catch,处理潜在的异常

    4、尽量去处理异常,切记只是简单的调用printStackTrace()去打印

    5、具体如何处理异常,要根据不同的业务需求和异常类型去决定

    6、尽量添加finally语句块去释放占用的资源

  • 相关阅读:
    R中的一些数据形式
    R数据处理
    矩阵的一些知识
    R语言的一些矩阵运算
    R语言中的常用函数
    R读取数据和导出数据
    贝叶斯公式的理解方式
    R语言中bioconductor包
    R语言中的数据结构
    网页版的R设置环境变量
  • 原文地址:https://www.cnblogs.com/happyliu/p/9785698.html
Copyright © 2011-2022 走看看