Java异常基础+原理解析+自定义异常

Java异常基础+原理解析

1.什么是异常呀?
程序中的异常就好比人生病了,即再程序的运行过程中。出现非正常的情况,导致jvm非正常终止终止
异常的体系:
异常的的根类为java.lang.Throwable 下面有两个子类 java.lang.Error和java.lang.Exception平常说的异常通常是值java.lang.Exception
在这里插入图片描述Error:好比绝症,比如说吃了含笑半步颠等毒药,无药可治的病,这种错误在java中无法通过处理,只可以先处理
在这里插入图片描述Exception:表示异常,异常产生后程序猿可以通过代码的方式纠正,让程序继续运行,比如张伟吃了神户小龙虾过敏了,去医院打个点滴吃点药就好了
在这里插入图片描述2.异常中的常用方法
public void print Stack Trace():打印异常的详细信息(包括异常出现的原因,异常出现的位置,异常出现的类型)
public String getMessage():获取异常发生的原因(仅仅抛出错误的原因)
public String toString():获取异常的类型与描述信息
面对异常我们不要害怕,要勇敢的去使用API查询面对他,加油,奥里给
在这里插入图片描述这是一个数组下标越界异常

在这里插入图片描述3.异常的分类
1.编译期异常:在编译的时候就会检查,必须要处理,否则程序无法运行
2.运行期异常,检查异常
在这里插入图片描述4.异常的产生过程
在这里插入图片描述
以下面这段代码来演示异常产生的过程与原理

public class Main {
    public static void main(String[] args) {
       int[] a=new int[1];
       a[0]=1;
       int shuchu = shuchu(a);
       System.out.println(shuchu);
    }
    public  static  int shuchu(int [] a){
        return a[2];
    }
}

原理图
在这里插入图片描述在这44入图片描述5.如何抛出一个异常
为什么要抛出异常?抛出异常的目的是什么
当我们编写程序的时候往往需要考虑程序出现异常的情况,比如我们定义一个方法,这个方法需要传入参数的时候,我们要判断这个参数是否合法,若数据不合法我们就用抛出异常的方式来告诉调用者参数不合法
throw用在方法内,将这个异常返回给方法的调用者,并结束当前方法的运行
抛出异常的格式
throw new 异常类名(参数格式);
For Example
throw new NullPointerException(“要访问的arr数组不存在”);
上例子(还是之前那个数组越界的问题)

public class Main {
    public static void main(String[] args) {
        int[] a=new int[1];
        a[0]=1;
        shuchu(a,2);
    }
    public  static  void shuchu(int [] a,int i){
      if (i<0||i>a.length-1){
          throw new ArrayIndexOutOfBoundsException("兄弟,索引错了");
      }
        System.out.println(a[i]);
    }
}

结果
在这里插入图片描述还记得我前面文章有说过Objects类的requireNonNull(Object object)方法用的就是抛出异常的方法
public static T requireNonNull(T obj) :查看指定引用对象不是null。
源码

public static <T> T requireNonNull(T obj)
 { 
 if (obj == null) 
 throw new NullPointerException(); 
 return obj; 
 }

使用throws声明异常
如果方法内通过throw抛出了编译时异常,而没有捕获处理(稍后讲 解该方式),那么必须通过throws进行声明,让调用者去处理。
声明异常的格式
修饰符 返回值类型 方法名(参数) throws 异常类名1,异常类名2…{ }
下面演示一个io流异常

public class Main {
    public static void main(String[] args) throws FileNotFoundException {
            test("a.pdf");
    }
    public  static  void test(String path) throws FileNotFoundException {
        if (!path.equals("b.pdf")){
            throw  new FileNotFoundException("没有该文件");
        }
    }
}

try…catch捕获异常

为什么使用try…catch?
因为异常出现的时候会直接终止程序,所以我们要捕获处理异常
对待异常的方法

  1. 该方法不处理,而是声明抛出,由该方法的调用者来处理(throws)。
  2. 在方法中使用try-catch的语句块来处理异常。
    什么是try…catch?
    就是捕获异常,然后以特定的方式处理异常
    格式
 try {
            //可能出现异常的代码
        }
        catch (异常类型 e){
            //处理异常代码
        }

try:该代码块中编写可能产生异常的代码。
catch:用来进行某种异常的捕获,实现对捕获到的异常进行处理。
二者必须一起用,不能分开
finally代码块
有一些特定的代码无论异常是否发生,都需要执行。另外,因为异常会引发程序跳转,导致有些语句执行 不到。而finally就是解决这个问题的,在finally代码块中存放的代码都是一定会被执行的。
比如:
当我们在try语句块中打开了一些物理资源(磁盘文件/网络连接/数据库连接等),我们都得在使用完之后,最终关闭打开 的资源。
语法格式:
try…catch…finally:自身需要处理异常,最终还得关闭资源
注意事项
在这里插入图片描述多个异常捕获的处理
3. 多个异常分别处理。
4. 多个异常一次捕获,多次处理。
5. 多个异常一次捕获一次处理。
通常情况下是一次捕获多次处理
格式

try{ 
 编写可能会出现异常的代码 
 }
 catch(异常类型A e)
 {try中出现A类型异常,就用该catch来捕获. 处理异常的代码
  //记录日志/打印异常信息/继续抛出异常 }
  catch(异常类型B e)
  {try中出现B类型异常,就用该catch来捕获. 处理异常的代码 
  //记录日志/打印异常信息/继续抛出异常 
  }

注意:
这种异常处理方式,要求多个catch中的异常不能相同,并且若catch中的多个异常之间有子父类异 常的关系,那么子类异常要求在上面的catch处理,父类异常在下面的catch处理。
继承关系中的异常处理
1.如果父类抛出了多个异常,子类重写父类方法时,抛出和父类相同的异常或者是父类异常的子类或者不抛出异 常。
2.父类方法没有抛出异常,子类重写父类该方法时也不可抛出异常。此时子类产生该异常,只能捕获处理,不 能声明抛出

自定义异常

java中只是定义了一些我们常用到的方法,但是在开发中总是有许多异常情况是没有定义到的,这时候就需要我们自己去编写定义一个异常类
如何定义一个异常类?

  1. 自定义一个编译期异常: 自定义类 并继承于 java.lang.Exception 。
  2. 自定义一个运行时期的异常类:自定义类 并继承于 java.lang.RuntimeException 。
    下面演示一个自定义异常类
    模拟一个年龄小于零的异常
public class ageException extends Exception{
    public ageException() {
    }

    public ageException(String message) {
        super(message);
    }
}
public class Main {
    public static void main(String[] args) throws  ageException {
             int a=-1;
             testage(a);
    }
    public  static  void testage(int age) throws ageException {
        if (age<0){
            throw new ageException("年龄小于0了");
        }
        System.out.println(age);
    }
}

以上就是java异常的一些基础知识,如有错误请各位批评指教
喜欢我的可以关注我
在这里插入图片描述

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值