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语句块去释放占用的资源

  • 相关阅读:
    堆栈学习
    需要阅读的书籍
    Rust Book Lang Ch.19 Fully Qualified Syntax, Supertraits, Newtype Pattern, type aliases, never type, dynamic sized type
    Rust Lang Book Ch.19 Placeholder type, Default generic type parameter, operator overloading
    Rust Lang Book Ch.19 Unsafe
    Rust Lang Book Ch.18 Patterns and Matching
    Rust Lang Book Ch.17 OOP
    Rust Lang Book Ch.16 Concurrency
    Rust Lang Book Ch.15 Smart Pointers
    HDU3966-Aragorn's Story-树链剖分-点权
  • 原文地址:https://www.cnblogs.com/happyliu/p/9785698.html
Copyright © 2011-2022 走看看