异常---编译时异常和运行时异常:IO异常、NullPointerException、ArrayIndexOutBoundsException、ClassCastExoeption

一、概述

1、定义:

      程序运行过程中的发生了不正常的情况

2、异常处理机制和作用----JVM虚拟机打印的

    java语言时很完善的语言,提供了异常处理方式,出现异常,将异常信息打印到输出控制台,供程序员参考。

   作用:增强程序的健壮性

3、异常的存在形式----类----java.lang中

     每一个异常类都可以创建一个对象出来。

4、异常的继承结构

(1)Throwable的两个子类:               

   <1>Error---错误,都是不可处理的,直接退出JVM

   <2>Exception---异常,可以处理

        所有的异常都是发生在运行阶段,因为只有运行阶段才可以new对象

        两个子类:

  •  Exception的直接子类:编译时异常,要求程序员在编写程序时必须预先对这些异常进行处理
  •   RuntimeException:运行时异常,编写程序阶段程序员可以预先处理,也可以不管(空指针异常那些)

(2)老杜总结图

  •   整体结构  异常---编译时异常和运行时异常:IO异常、NullPointerException、ArrayIndexOutBoundsException、ClassCastExoeption_第1张图片
  • 编译时异常----预先处理的异常

        异常---编译时异常和运行时异常:IO异常、NullPointerException、ArrayIndexOutBoundsException、ClassCastExoeption_第2张图片

  • 运行时异常----控制台报错

       异常---编译时异常和运行时异常:IO异常、NullPointerException、ArrayIndexOutBoundsException、ClassCastExoeption_第3张图片

5、编译时异常和运行时异常区别

       编译时异常一般发生的概率比较高----运行之前预处理(受检异常,受控异常)

       运行时异常一般发生的概率比较低-----没必要在运行之前预处理(未受检异常,非受控异常)

二、编译时异常

1、编写程序时程序画红线的的错

    ---必须处理,处理后才能正常执行,不然就程序中止了

2、两种处理方式

   (1)throws上抛--交给上一级调用者处理(异常上抛)

    (2)try...catch -----异常捕捉,自己处理(真正的处理)

3、处理方式选择标准

     看这个错误是否需要上报,需要选择throws,其他都用catch

【注】

  • 若异常每一级都选择异常上抛,都没有解决,最终抛给了JVM,只能中止java程序的执行
  •  异常处理机制的作用---增强程序的健壮性,希望异常发生了也不影响程序的执行,因为异常捕捉了之后不会影响后续程序的运行

         故一般main方法建议使用try...catch处理

  •   throws后面和catch()内的抛出的异常类,可以写具体对应的异常类,也可以写其父类

4、编译时异常处理的目的

     让程序编译通过,通过后,再根据运行时提示信息去调程序,而不是异常不处理,JVM运行时直接中止,控制台报错

     即:主要目的是让程序顺利运行,控制台打印出异常而不是不报错中止,

           虽然有异常,但是通过异常处理方式给出来,只是待进一步进行问题的解决

(一)try catch语句

     1、基本形式

try{
   程序正常要执行的语句
}catch (具体异常类 e){
    处理语句
}finally{
   有无异常都必执行的语句,一般放资源释放语句
}
  •     一般根据异常提示,编写软件自动生成
  •     这种方式下,try语句块中,某一行有异常,该行后面内容不会执行,

                         catch捕捉到异常后才会执行catch内及后续的代码     

2、基本规则

(1)main方法中一定用try catch语句

(2)catch可以写多个,也可以不写

          每个catch可以对应一个具体类,精确的一个一个处理,有利于程序的调试

           catch写多个时,异常类从上到下必须遵循从小到大(异常具体类在上---异常父类在下)

(3)finally相关    

  •     finally中的语句最后一定会执行的,即使try语句块中代码出现了异常
  •     finally必须和try catch一起出现,不能单独编写
  •      finally语句必须与try 语句连用,没有catch也可以
  •      finally相当于try语句跳过异常的 延续代码部分
  •      fianlly中使用return或throws语句会让try 和catch中return或throws语句失效

(4)return语句

  •       return语句执行----代表方法的结束

             return语句一定最后执行的,无论是return;还是return i

  •      finally中有return try中return失效,因为finally语句块一定会执行的

3、异常的追踪和调错--catch中

    (1)两个重要的方法

         e.getMessage()---获取异常的简单描述信息

                                            只是获得简单描述,对调错没有指导性作用

         e.printStackTrace()----打印异常追踪的堆栈中信息(开发中用比较多)

                                             e是异常对象

(2)e.printStackTrace()--打印堆栈中错误信息

        异常处理时,catch语句中必须加e.printStackTrace(

       这样控制台才能在正常运行程序的情况下,还能打印出异常信息,否则,异常抛出或捕捉后,没有异常提示信息,会以为没有异常

(3)查看异常追踪信息,快速调试程序:

  •  从上往下看,一行一行看(下面的异常是由上面的异常导致的,所以从上往下看)
  •     SUN写的代码不用看,主要问题出现在自己编写的代码上(由包名可以看出是SUN的还是自己的代码)

(二)throws上抛

         在方法声明的位置上,加上throws关键字,抛给上一级调用者(异常上抛)

         上一级调用者同样也有这两种处理方式---throws和catch

    【注】这种方式有异常情况下,该方法下的后续代码不会执行,通过 [方法名  throws 异常类名] 直接跳到上级调用方法

(三)throw 手动抛异常----自定义异常

  1、自定义异常类 

  (1)编写一个类继承Exception或RuntimeException

  (2)提供两个构造方法,一个无参数的,一个带有String参数的

            有参的构造方法用来传递提示信息----e.getMessage

//1、自定义异常类
public class MyException extends Exception{

    //无参构造
    public MyException ();   
    //有参构造
    public MyException (String s);   
}

//2、使用异常类
public class Test{
 
  puiblic static void main(String[] args){
  
    //创建自定义异常对象
    MyException e=new MyException ("密码错误!");

    //打印堆栈信息
      e.printStackTrace();

    //获取并输出异常的描述信息
      
      String msg=e.getMessage();
      System.out.println(msg);
     
   }
}

  这样控制台不仅会输出自定义异常的堆栈信息,还会输出 描述信息  

2、自定义异常的作用

    通过使用自定义异常类,来中止不满足条件的情况,不是用return终止的方式

一般方式:不满足条件,return; 终止方法

  调用异常方式: throw new MyException ("密码错误!"),不满足条件,抛异常并终止

(三)常见编译时异常

  io异常

   FileNotFoundException

   ClassNotFoundException

   SQLException
   NoSuchFieldException
   NoSuchMethodException
   ParseException

三、运行时异常

1、数组下标越界异常---ArrayIndexOutBoundsException

2、空指针异常---NullPointerException

    避免空指针异常的两个经验:

     (1)判断一个对象是否为null最好放在条件的最前面

    (2)判断一个对象是否等于null,最好用【null==对象名】 或 【”某值“.equals(对象)】

            因为 对象==null,容易误写成 对象=null,就成赋值----空指针异常

                   对象.equals(”某值“)----如果对象的值一旦是空----空指针异常  

3、类转换异常---Java.lang.ClassCastExoeption

(1)出现条件:

           强制类型转换出错----两个对象没有继承关系

(2)避免方法----instanceof运算符

     

4、数字格式化异常---NumberFormatException

你可能感兴趣的:(Java基础,java)