Java中异常的处理机制

异常的概述和分类

  1. 异常的概述’:
    异常就是Java程序在运行过程中出现的错误。
  2. 异常的继承体系:
  • 异常的基类:Throwable
  • 严重问题:Error 不予处理或无法处理,因为这种问题一般是很严重的问题,比如:内存溢出。
  • 非严重问题:Exception
    - 编译时异常:非RuntimeException
    - 运行时异常:RuntimeException

JVM默认是如何处理异常的

  • 异常的两种处理方式
  1. 使用try…catch进行捕获
  2. 使用throws将异常抛出
  • main函数收到这个问题时,有两种处理方式:
  1. 自己将该问题处理,然后继续运行
  2. 自己没有针对的处理方式,只有交给调用main的jvm来处理
  • jvm有一个默认的异常处理机制,就将该异常进行处理.
    并将该异常的名称,异常的信息.异常出现的位置打印在了控制台上,同时将程序停止运行

try…catch的方式处理异常(自己处理异常)

try…catch处理单个异常的基本格式

由于如果你自己不解决,那就交由JVM去处理
JVM的默认处理方式是,答应异常信息,并停掉JVM。
我觉得交由JVM去处理运行期异常,这种方式不太友好。
如果,我觉得JVM处理方式不是很友好,那么我就自己处理
那么我们自己怎么来处理呢,可以使用try catch

 try {
  可能出现问题的代码 ;
 }catch(异常名 变量名){
  针对问题的处理 ;
 }finally{
  释放资源;
 }


  • catch里面的语句只有遇到异常才会执行
  • catch中的异常能够明确的话尽量明确,尽量不要写大的父类来处理
  • final中的语句无论有没有遇到异常都会进行运行,一般final中做一些收尾工作,比如释放资源,在IO流操作以及数据库中使用
  • 变形格式
try {
   可能出现问题的代码 ;
  }catch(异常名 变量名){
   针对问题的处理 ;
  } 
  注

  • 注意事项:
    a: try中的代码越少越好
    b: catch中要做处理,哪怕是一条输出语句也可以.(不能将异常信息隐藏)
try …catch对可能出现多个异常的处理
  • 基本格式
    多个明确的异常,就用多个catch(具体的异常类型 变量名)并列写出来,如果多个异常,之间有继承关系,父类写在最后
       try {
       可能出现问题的代码 ;
       }catch(异常名1 变量名1){
       对异常的处理方式 ;
       }catch (异常名2 变量名2){
       对异常的处理方式 ;
       }.....


  • 注意事项:
  1. 能明确的尽量明确,不要用大的来处理。
  2. 平级关系的异常谁前谁后无所谓,如果出现了子父关系,父必须在后面。
  • 对多个异常处理的变形格式(不推荐使用)
    JDK1.7中对多个catch的变形格式
try {
可能出现问题的代码 ;
}catch(异常名1 | 异常名2 | ....   变量名){
对异常的处理方案 ;
}


  • 注意事项:
  1. 多个异常之间只能是平级关系,不能出现继承关系
  2. 多个异常之间的异常处理是相同的,实际开发中好多时候可能就是针对同类型的问题,给出同一个处理

throw的概述以及和throws的区别

  • throw 和 throws 的区别:
    throw 他是在方法内部进行异常的抛出;throws 是在方法声明上进行异常的抛出。
    throws抛出的是一些,异常的类名,可以抛出多个异常;throw 抛出的是一个异常对象。
    throws 是抛出多种异常的可能性;throw 一旦抛出了异常,那么肯定是他遇到了这种异常。
  • 代码演示
public class MyTest2 {
    public static void main(String[] args) throws NullPointerException,ArithmeticException,Exception{
    show();
    }


    private static void show() {
        Scanner scanner = new Scanner(System.in);
        System.out.println("请输入第一个整数");
        int a = scanner.nextInt();
        System.out.println("请输入第二个整数");
        int b = scanner.nextInt();
        if(b==0){


            throw new ArithmeticException("你傻啊,除数为0了");

        }else{
            System.out.println(a/b);
        }
    }
}


自定义异常概述和基本使用

  • 为什么需要自定义异常:
    因为在以后的开发过程中,我们可能会遇到各种问题,而Jdk不可能针对每一种问题都给出具体的异常类与之对应, 为了满足需求,我们就需要自定义异常.
  • 自定义异常概述 :
    需要将我们自定义的异常类纳入到我们的异常体系中
    继承自Exception
  • 案例演示
    判断成绩范围,如果不在规定的范围报 “成绩不合法” 异常
public class MyTest {
    public static void main(String[] args) {
        ScoreException scoreException = new ScoreException("成绩不合法");
        Scanner sc = new Scanner(System.in);
        System.out.println("请输入学生的成绩0~100:");
        int i=sc.nextInt();
        if (i<0||i>100){
          throw  scoreException;
        //  throw new ScoreException("成绩不合法");
        }else {
            System.out.println("学生成绩为:"+'i');
        }
    }

}

//自定义异常代码块
 class ScoreException extends RuntimeException{


    public ScoreException(String msg) {
        super(msg);
    }
}


如果有继承关系,在重写父类方法时,需要注意的异常语法

  1. 父类方法有抛出异常,子类在重写父类方法时,可以抛出和父类一样的异常,也可以不抛出异常
  2. 父类方法没有抛出异常,子类在重写父类方法时,就不能抛出异常
  3. 子类不能抛出,父类没有抛出的异常
  4. 子类不能抛出的异常,不能比父类的大,只能跟父类的一样,或者比父类小
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值