4.异常

1.异常

1.概念

异常:程序在执行过程中,出现的非正常的情况,导致JVM的非正常停止

在java面向对象的语言中,产生异常就是创建异常对象并且抛出了异常对象,JAVA处理异常的方式是中断处理

异常不是指的语法错误,语法错误无法产生子解码文件,程序不能运行

 

要理解Java异常处理是如何工作的,你需要掌握以下三种类型的异常:

  • 检查性异常:最具代表的检查性异常是用户错误或问题引起的异常,这是程序员无法预见的。例如要打开一个不存在文件时,一个异常就发生了,这些异常在编译时不能被简单地忽略。
  • 运行时异常: 运行时异常是可能被程序员避免的异常。与检查性异常相反,运行时异常可以在编译时被忽略。
  • 错误: 错误不是异常,而是脱离程序员控制的问题。错误在代码中通常被忽略。例如,当栈溢出时,一个错误就发生了,它们在编译也检查不到的。

2.异常体系

java异常的根类是java.lang.Throwable,两个字类分别是java.lang.Error和java.lang.Exception

Error:不能处理,尽量避免

Exception:使用不当导致,可以避免

3.异常分类

编译器异常:checked异常,在编译时期就会检查,没有处理,编译失败

运行期异常:runtime异常,运行期检查,没有处理运行失败

4.异常产生过程解析(如何处理异常)

出现异常的时候,JVM会做两件事情:

1.JVM会根据异常产生的原因产生一个异常对象,这个异常对象包含了异常产生的(内容、原因、位置)

new ArrayIndexOutofBoundsException()

2.如果没有相应的处理逻辑(try....catch),JVM会把异常抛给方法的调用者main来处理这个异常

3.main方法接收到这个异常对象,main也没有想用的处理逻辑,把main对象抛出给main方法的调用者JVM处理

  1. 把异常对象(内容、位置、原因)以红色的字体打印在控制台
  2. JVM会终止当前的程序->中断处理

2.异常的处理

JAVA异常处理的关键字:try、catch、finally、throw、throws

1.throw

可以在throw关键字在指定的方法中弹出指定的异常

使用格式:

throw new xxxException(“异常产生的原因”)

//null异常
throw new NullPointerException("传递的数组是null");
//越界异常
throw new ArrayIndexOutOfBoundsException("数组的使用范围")

2.Objects非空判断

Objects.requireNonNull(obj);//判断对象是否为空

3.throws生命异常关键字

声明异常关键字:讲问题标识出来,报告给调用者,如果方法通过throw抛出了异常,而没有捕获处理,必须通过throws声明,让调用者去处理

关键字throws运用于方法之上,用于表示当前方法不处理异常,而是提醒该方法的调用者来处理异常

格式:

修饰符  返回值类型 方法名(参数列表) throws AAAException,BBBException...(

     throw new AAAException("原因");

     throw new BBBException("原因");

)

注意:

1.throws关键字必须写在方法声明处

2.throws关键字后边声明的必须是Exception或者Exceptions的子类

3.如果抛出了多个异常,那么throws后边就必须声明多个异常

                如果抛出的多个异常对象有字父类关系,那么直接声明父类异常即可

4.调用了一个声明抛出异常的方法,我们就必须处理声明的异常

4.捕获异常try catch  (自己处理异常)

声明有两个元素的一个数组,当代码试图访问数组的第三个元素的时候就会抛出一个异常

import java.io.*;
public class ExcepTest{
 
   public static void main(String args[]){
      try{
         int a[] = new int[2];
         System.out.println("Access element three :" + a[3]);
      }catch(ArrayIndexOutOfBoundsException e){
         System.out.println("Exception thrown  :" + e);
      }
      System.out.println("Out of the block");
   }
}

如何获取异常信息:

  1. getMessage():获取异常的描述信息,原因(提示给用户的时候,就提示错误原因)
  2. toString():获取异常的类型和异常描述信息(不用)
  3. printStrackTrace():打印异常的跟踪栈信息并输出到控制台   包含了异常的类型,异常的原因,异常出现的位置,在开发和调试阶段,都得使用printStackTrace

5.finally

finally 关键字用来创建在 try 代码块后面执行的代码块。无论是否发生异常,finally 代码块中的代码总会被执行。

在 finally 代码块中,可以运行清理类型等收尾善后性质的语句。

6.异常处理注意事项

  • 多个异常使用捕获又该如何处理?
  • 1.多个异常分别处理
  • 2.多个异常一次捕获,多次处理
  • 3.多个异常一次捕获一次处理

 

  • finally中有return:如果finally中有return中有return语句,永远返回finally中的结果
  • 如果父类抛出多个异常,子类重写父类方法的时候,抛出和父类相同的异常或者是父类异常的子类或者不抛出异常
  • 父类方法没有抛出异常,子类重写父类方法的时候也不抛出异常,只能捕获处理,不能声明抛出

    注意:父类异常时什么样,子类异常就什么样

package cn.itcast;

public class person {
    public void show1() throws NullPointerException,ClassCastException{}
    public void show2() throws IndexOutOfBoundsException{}
    public void show3() throws IndexOutOfBoundsException{}
    public void show4() throws Exception{}
}

class Zi extends person{
    //子类重写父类方法的时候,抛出和父类相同的异常
    public void show1() throws NullPointerException,ClassCastException{};
    //子类重写父类方法,抛出父类异常的子类
    public void show2() throws ArrayIndexOutOfBoundsException{}
    //不抛出异常
    public void show3(){}

    //父类如果没有抛出异常的话,子类重写父类方法时也不可抛出异常
    //只能捕获处理,不能声明抛出
    public void show4(){
        try {
            throw new Exception("编译器异常");
        }
        catch (Exception e){
            e.printStackTrace();
        }
    }
}

 

  • 在try/catch后追加finally代码块,其中的代码一定会执行,通常用于资源回收

 

 

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值