第9章异常

Throwable类

Throwable是所有异常的父类.而Throwable又有俩个直接子类:

1、Error:这个错误一般是JVM和硬件引发的问题,发生了这个错误,一般是不通过代码去处理问题的

2、Exception:称之为异常,异常是程序在编译、运行的时候出现的异常,用户可以对异常进行具体的处理,一般可以通过修改代码来处理异常.如果不去处理异常的话,程序将会停止运行.

 

只有当对象是Throwable类的子类类型的时候,该对象才能通过java虚拟机和throw语句抛出.

例子:

Throwable t1=new Throwable();
//创建一个Throwable类型的异常,括号内可以填写该异常的详细信息

Throwable类有些常用来显示异常信息的方法:

1、对象.getMessage();会返回该异常对象的详细信息字符串

2、对象.toString();当打印对象的时候会自动调用的方法,会返回该对象的父类和详细信息,

3、对象.printStackTrace();打印方法 这个是最常用的,会打印发生错误的代码行号,且异常信息会报红

 

异常和错误

程序异常是指程序在编译或运行期间发生了某种异常,需要处理异常,否则程序会结束运行(如数组索引越界等问题)

 

程序错误时程序在运行期间发生了某种错误(Error).通常没有具体的处理方式,程序会结束运行,一般都是系统级别的问题,用户一帮无法针对Error进行处理,只能修正代码.是JVM所在系统发生并反馈给JVM的.(如内存超出等问题)

 

捕获处理

用法:

//        //捕获处理 
//         try {
//             //可能发生异常的代码
//         } catch(异常类型 变量名){
//             //发生异常后的处理
//         }
         

如果不进行异常处理的话,一发生异常程序就停止了,如果想要当发生异常后继续执行catch之后的代码,就需要使用到异常捕获了.

我们可以将可能会发生异常的代码放入try语句中,发生异常后处理异常的语句放在catch语句中,而异常处理完想要执行的语句放在后面.

 

 

抛出处理

 

除了捕获处理,还有抛出处理,当方法内部不想处理异常,就可以进行抛出处理,让调用者来处理异常问题.

例子:

    public static int demomo(int a,int b) throws     Exception{//声明抛出异常的类型
        if (b==0)
        {
            throw new Exception("除数为0");
            //throw是用于方法内部用于抛出一个异常的,而throws是用于方法声明上的,说明抛出的异常类型
            //而throw后面只能有一个异常对象,throws后面一次能够声明多个异常类型.
        }
        
        
        return a/b;
    }
}

这个方法就进行了抛出异常,内部不进行处理,而进行抛出,让调用者自己处理异常.

 

异常分类

异常分为俩种:

1、运行时异常:是RuntimeException的子类,比如NullPointException(空指针异常)与ArrayIndexOutOfBoundException异常类型

  当方法中抛出运行时异常时,方法定义中不需要throws声明抛出异常的类型,调用者不需要处理此异常,需要程序人员修改源代码.

2、非运行时异常:如果出现了非运行时异常就必须进行处理,也就是必须进行抛出处理或是捕获处理,否则编译器会报错.

 

运行时异常例子:

    public static int demomo(int a,int b) {//当方法内抛出的是运行时异常的时候,方法声明 
        if (b==0)
        {
            //异常的分类 可以分成运行时异常和非运行时异常 非运行时异常出现时,必须先处理异常,否则不能运行,编译器会报错.
            //当方法抛出运行时异常的时候,方法定义中无须throws声明,调用者无须去处理此异常,运行时异常一旦发生,需要程序人员修改源代码
            throw new     ArithmeticException("除数为0");//这个异常类型就属于运行时异常,所以这个方法声明不用加throws来声明抛出异常类型
            //throw是用于方法内部用于抛出一个异常的,而throws是用于方法声明上的,说明抛出的异常类型
            //而throw后面只能有一个异常对象,throws后面一次能够声明多个异常类型.
        }
        
        
        return a/b;
    
}

 

自定义异常

虽然java的jdk中定义了许许多多的异常类,但是有时候还是需要用到自定义异常类

java中所有异常类都是继承于Throwable,自定义类也一样,这样自定义类才能被throw抛出.

每个异常中都调用了父类的构造方法,把异常描述信息传递给了父类,让父类帮用户进行异常信息的封装.

 

语法:

Class 异常名 extends Exception //继承RuntimeException 运行时异常
{
  public 异常名(){//无参构造方法
 }
  public 异常名(String s){//有参构造方法,s为该异常的详细信息

  super(s);//将详细信息传递给父类封装
 }
}

 

异常在重写之中的运用

 

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

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

3、当被覆盖的方法没有异常声明时,子类覆盖时无法声明异常.

4、父类中没有声明异常,而实现的子类覆盖方法发生了异常,无法进行throws声明,只能catch捕获处理,如果问题处理不了,catch中继续使用RuntimeException子类型的异常抛出.

 

课后习题1、异常与错误的区别是什么?

  异常是程序在编译、运行期间发生的某种异常(Exception),若不处理异常,程序会结束运行

  错误是程序在运行期间发生的某种错误(Error)、程序将会结束运行,Error错误发生往往都是系统级别的问题,是jvm所在系统发生并反馈给jvm的.

2、异常有哪几类别?

  有俩种,分为运行时异常和非运行时异常.非运行时异常发生的时候,必须要进抛出或捕获处理,否则编辑器会报错,

而运行时异常,调用者不需要处理此异常,需要程序人员修改源代码.方法抛出运行时异常时.方法定义无须throws声明抛出异常类型

3、异常常用的有哪几种处理方式?

  常用的有捕获处理和抛出处理

 

posted @ 2021-06-19 22:36  况况况  阅读(43)  评论(0编辑  收藏  举报