【JAVA异常】

一、异常的基本概念

在java语言种,异常就是程序执行过程不希望出现的问题,如果执行过程中出现了异常,jvm就会终止,应用程序随之终止,开发过程种的语法错误和逻辑错误不是异常


二、java中异常的结构

Throwable类是Java语言中所有错误和异常的超类,它有两个子类:

  • Error:表示执行中的错误,Error是java程序中无法解决的严重问题,比如StackOverflowError表示栈溢出,Error是严重错误,程序会奔溃。
  • Exception:表示程序执行中可以被捕获并处理的异常,可以使用针对性代码进行处理,例如空指针异常,Exception可以分为两大类:运行时异常和编译时异常

三、异常体系图

 

常见的运行时异常包括:

  •  NullPointerException 空指针异常
  •  ArithmeticException 数学运算异常
  •  ArrayIndexOutOfBoundsException 数组下标越界异常
  •  ClassCastException 类型转换异常
  •  NumberFormatException 数字格式不正确异常

常见的运行异常:

  • FileNotFoundException:文件找不到的异常
  • ClassNotFoundException:类找不到的异常
  • DataFormatException:数据格式化异常
  • NoSuchFieldException:没有匹配的属性异常
  • NoSuchMethodException:没有匹配的方法异常
  • SQLException:数据库操作异常
  • TimeoutException:执行超时异常

四、异常的处理

  1. try - catch - finally:程序员在代码块中捕获发生的异常自行处理
  2. throws:将发生的异常抛出,交 A给调用者处理,最顶级的就是JVM

try - catch -finally 方式处理异常注意事项:

  • 如果异常发生了,则异常后面的代码不会执行,直接进入到catch块。
  • 如果异常没有发生,则顺序执行try的代码块,不会进入到catch。
  • 如果希望不管是否发生异常,都执行某段代码(比如关闭连接,释放资源等)则使用如下代码 - finally{ }
  • 如果 try 代码块有可能有多个异常 ,可以使用多个 catch 分别捕获不同的异常,相应处理 要求子类异常写在前面,父类异常写在后面
  • 可以进行 try-finally 配合使用, 这种用法相当于没有捕获异常, 因此程序会直接崩掉/退出。应用场景,就是执行一段代码,不管是否发生异常, 都必须执行某个业务逻辑

try - catch -finally 执行顺序:

  • 如果没有出现异常,则执行try块中所有语句,不执行catch中的语句,如果又finally,最后还需要执行finally里面的语句
  • 如果出现异常,则try块中异常发生后,try块剩下的语句不再执行,将执行catch块中语句,如果有finally,最后还需要执行finally里面的语句!
package ExceptionEx01.Homework;

import java.util.Scanner;

public class Homework01 {

    public static void main(String[] args) {

        try {

            if (args.length < 2){   //判断args长度
                throw new ArrayIndexOutOfBoundsException("参数有误!!");   //抛出异常
            }
            int n1 = Integer.parseInt(args[0]);  //转化为int类型
            int n2 = Integer.parseInt(args[1]);
            System.out.println(new Homework01().cal(n1,n2));
        }catch (NumberFormatException n){    //获取类型异常
            System.out.println("输入的类型有误!"+" "+n);
        }catch (ArithmeticException a){     //获取输入异常数字
            System.out.println("除数不能为0!!"+" "+a);
        }catch (ArrayIndexOutOfBoundsException a){
            System.out.println(a.getMessage());  //获取输出数组越界异常
        }finally {
            System.out.println("必须执行~");
        }


    }
    public int cal(int n1,int n2){
        return n1 / n2;
    }
}


throws 异常处理:

基本介绍:当方法内部抛出异常对象的时候,那么我们就必须处理这个异常对象,可以使用throws关键字处理异常对象,会把异常对象声明抛出给方法的调用者处理(自己不处理,给别人处理),最终交给JVM处理–>中断处理

注意事项和使用细节:

  • 对于编译异常,程序中必须处理,比如 try-catch 或者 throws
  • 对于运行时异常,程序中如果没有处理,默认就是 throws 的方式处理
  • 子类重写父类的方法时,对抛出异常的规定:子类重写的方法, 所抛出的异常类型要么和父类抛出的异常一致,要么为父类抛出的异常类型的子类型
  • 在 throws 过程中,如果有方法 try-catch , 就相当于处理异常,就可以不必 throws

五、自定义异常

基本介绍:在程序中,可能会遇到JDK提供的任何标准异常类都无法充分描述清楚我们想要表达的问题,这种情况下可以创建自己的异常类,即自定义异常类来描述这些问题,给出清楚的提示。

定义步骤:

继承 Exception 或 RuntimeException

使用Exception属于编译异常

使用RuntimeException属于运行异常

自定义异常实例:

package ExceptionEx01.Homework;


public class Exceptiontext {
    public static void main(String[] args) /*throws AgeException*/ {
        int age = 180;
//要求范围在 18 – 120 之间,否则抛出一个自定义异常
        if(!(age >= 18 && age <= 120)) {
//这里我们可以通过构造器,设置信息
            throw new AgeException("年龄需要在 18~120 之间");
        }
        System.out.println("你的年龄范围正确.");
    }
}

//自定义一个异常
//老韩解读
//1. 一般情况下,我们自定义异常是继承 RuntimeException
//2. 即把自定义异常做成 运行时异常,好处时,我们可以使用默认的处理机制
//3. 即比较方便

class AgeException extends RuntimeException {
    public AgeException(String message) {//构造器
        super(message);
    }
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值