zoukankan      html  css  js  c++  java
  • 2018-08-06Java中的异常捕获和Throw详细细节

    异常的定义:

    Java代码在运行时期发生的问题就是异常!

    在Java中,把异常信息封装成了一个类!当出现了问题时,就会创建异常类对象并抛出异常相关的信息(异常信息,位置…)!

    异常的继承关系:

    Object-->Throwable-->Exception-->RuntimeException

    //可以选中异常类型,然后Ctrl+T来查看继承关系!

         Throwable: 它是所有错误与异常的超类

             |- Error 错误

             |- Exception 编译期异常,进行编译JAVA程序时出现的问题

                  |- RuntimeException 运行期异常, JAVA程序运行过程中出现的问题

    //内存溢出错误!

    //数组越界异常,以上代码中arrint数组下标只到2,但是调用的方法中却用了下标3,因此发生数组越界异常!

    当发生数组越界异常时,JVM会做两件事:

    ①   创建异常对象ArrayIndexOutOfBoundsException TestEx;

    ②   将异常对象抛给调用者(这里是get(arrint))!

    ③   JVM将错误对象抛给Main方法发现还是没有处理语句,继续往上抛给虚拟机(JVM),JVM会将异常信息以红字的方式打印在控制台以及结束程序!

    Error:错误!

    Exception:异常!

    指程序在运行期间发生了某种错误,Error错误通常没有具体的处理方式,程序将会结束运行!往往都是系统级别的问题,都是JVM所在系统发生的,并反馈给JVM的,我们无法针对处理,只能修正代码!

    在Java中,提供了一个Throw关键字,它用来抛出一个指定的异常对象:

    ①   创建一个异常对象,封装一些提示信息(信息可以自己编写)!

    ②   用Throw关键字将这个异常对象告知给调用者!

    格式:

    throw new 异常类名(参数);

    //目前学到的RuntimeException的构造方法:

    声明异常Throws:

    将问题标识出来,报告给调用者!如果方法内通过Throw抛出了编译时异常,而没有捕获处理,那么必须通过Throws进行声明,让调用者去处理!

    声明异常格式:

    修饰符 返回值类型 方法名(参数) throws 异常类名1,异常类名2… {   }

    异常捕获:Java中对异常有针对性的语句进行捕获,可以对出现的异常进行指定方式的处理!

    捕获异常格式:

    try {

         //需要被检测的语句。

    }

    catch(异常类 变量) {

         //异常的处理语句。

    }

    finally {

         //一定会被执行的语句。

    }

    try:该代码块中编写可能产生异常的代码!

    catch:用来进行某种异常的捕获,实现对捕获到的异常进行处理!

    finally:有一些特定的代码无论异常是否发生,都需要执行!另外,因为异常会引发程序跳转,导致有些语句执行不到,而finally就是解决这个问题的,在finally代码块中存放的代码都是一定会被执行的!

    //try-catch如果捕获到了异常,try-catch以下的代码是不会被执行的!

    Try-Catch-Finally捕获异常的组合方式:

    ①   Try-Catch-Finally组合:检测异常,并传递给Catch处理,并在Finally中进行资源释放!

    ②   Try-Catch组合:对代码进行异常检测,并对检测的异常传递给catch处理!对异常进行捕获处理!

    ③   一个Try多个Catch组合:对代码进行异常检测,并对检测的异常传递给catch处理,对每种异常信息进行不同的捕获处理!

    ④   Try-Finally组合:对代码进行异常检测,检测到异常后因为没有Catch,所以一样会被默认JVM抛出!异常是没有捕获处理的,但是功能所开启资源需要进行关闭,所有Finally只为关闭资源!

    运行时期异常RuntimeException:

    RuntimeException和他的所有子类异常,都属于运行时期异常!

    方法中抛出运行时期异常,方法定义中无需throws声明,调用者也无需处理此异常,运行时期异常一旦发生,需要程序人员修改源代码!

    异常在方法重写中的细节:

    ①   子类覆盖父类方法时,如果父类的方法声明异常,子类只能声明父类异常或者该异常的子类,或者不声明!

    ②   当父类方法声明多个异常时,子类覆盖时只能声明多个异常的子集!

    ③   当被覆盖的方法没有异常声明时,子类覆盖时无法声明异常的!

     

    异常中常用的方法:

    ①   getMessage()异常类名和异常信息!

    ②   printStackTrace()打印异常详细信息!

    ③   toString()异常信息!

     

    自定义异常:

    格式:

    Class 异常名 extends Exception{

    //或者继承RuntimeException!

         public 异常名(){

            

    }

         public 异常名(String s){

    super(s);

    }

    }

    //以上调用父类Exception的有参构造!

     

    示例代码:

    try{

         可能会发生异常的代码

    }catch(异常对象 ex){

         处理语句

    }finally{

         不管出不出现异常必须执行的语句

         一般写释放资源的语句

    }

    package com.oracle.errorexception;

    public class Demo03{

         public static void main(String[] args) {

             int[] arr=null;

             try{

                  int index=get(arr);

                  System.out.println(index);

             }catch(NullPointerException ex){

                  System.out.println(ex);

             }

         }

         public static int get(int[] arr) throws NullPointerException,ArrayIndexOutOfBoundsException{

             if(arr==null){

                  throw new NullPointerException("数组为空");

             }

             if(arr.length<4){

                  throw new ArrayIndexOutOfBoundsException("数组长度不够");

             }

             return arr[3]+1;

         }

    }

    //try中一旦发生异常,try中其余代码将不再执行,直接跳到catch进行异常捕获!

     

    //RuntimeException及其子类不需要Throws!

     

    package com.oracle.errorexception;

    public class Demo04{

         public void eat() throws Exception{

            

         }

    }

    class Zi extends Demo04{

         //如果父类方法抛出异常,那么子类重写后的方法有两种选择:①不抛异常②抛异常,但是异常类型不能超越父类!

         //如果父类没有异常,子类重写后不能抛出异常!但是如果重写后的方法中调用了抛出异常的方法,只能Try-Catch

         public void eat(){

            

         }

    }

  • 相关阅读:
    CSS:命名规范心得分享
    css中用一张背景图做页面的技术有什么优势?
    ie8 css hack
    简单介绍几个CSSReset的方法
    牛人也得看的CSS常识
    DIV+CSS网页布局常用的一些基础知识整理
    font-size:100%有什么作用?
    为什么无法定义1px左右高度的容器
    Div+CSS常见错误总结
    从数字千分位处理认识(?<=)、(?=)、(?:)
  • 原文地址:https://www.cnblogs.com/postgredingdangniu/p/9430921.html
Copyright © 2011-2022 走看看