异常(中)创建自定义异常,throw,throws关键字抛出异常

简介: 异常(中)创建自定义异常,throw,throws关键字抛出异常

前言

       该文介绍了Java的异常的创建自定义异常,让我们可以自己创建出一个异常,应对Java API中没有的基础的异常报错。throw关键字抛出异常,throws关键字抛出异常,是不同于try-catch语句的另一种抛出异常的方式。

一、创建自定义异常

       创建自定义异常:自己创建一个应对可以反馈不符合项目需求或现实的异常,应对Java API中基础异常报错没有的情况。

        语法:

class 自定义异常类 extends 已有的异常类{
    public 自定义异常类(){
        //创建了一个构造方法,通过 super 关键字调用父类构造方法,反馈不符合的新异常
        super();
    }
}

实例:

               一家无人餐厅中服务一个人时,若顾客不是一个人,而是动物,此异常需要抛错,而Java API中基础异常报错没有此异常,需要我们自定义一个异常。

创建一个NoHumansException异常类,应对该无人餐厅的异常:

public class NoHumansException extends Exception{
  public NoHumansException(String message) {
      //创建了一个构造方法,通过 super 关键字调用父类构造方法,反馈不符合的新异常
      super(message);
  }
}

 在项目中调用此异常:

public class Demo {
  public static void main(String[] args) {
    try {
      String customer = "monkey";
      if(!customer.equals("human")) {
                //通过 throw 关键字实例化 创建的 NoHumansException 异常类
        throw new NoHumansException("有非人客户:"+customer);
      }
      System.out.println("上菜");
    } catch (NoHumansException e) {
      //输出 try 代码块中捕获的异常,相关的异常内容,报错位置
      e.printStackTrace();
    }
  }
}

 输出结果:

        总结:

                使用自定义异常步骤:


               (1)创建自定义异常。


               (2)在方法中通过 throw 关键字抛出异常对象。


               (3)若在当前抛出异常的方法中处理异常,可以使用 try-catch 语句块捕获并处理,否则在方法的声明处通过 throws 关键字指明要抛出给方法调用者的异常,继续进行下一步操作。


               (4)在出现异常方法的调用者中捕获并处理异常。

二、在方法中抛出异常

        前要:若某个方法可能会发生异常,若不想在当前方法中处理这个异常,则可以使用 throw 、throws 关键字在方法中抛出异常。

1.使用throw关键字抛出异常

       定义:throw 关键字通常用于方法体中,并且抛出一个异常对象。

       语法:

throw new 异常类型(报错内容);

    特点:

               (1)程序运行至 throw 语句时,立即停止执行后面的语句(所在代码块中的语句)。

               (2)通过 throw 抛出异常后,如果想在上一级代码中捕获并处理异常,则需要在抛出的异常的方法中使用 throws 关键字。

               (3)如果要捕捉 throw 抛出的异常,反馈在控制台中,则必须使用 try-catch 语句块。

        实例:

       在统计人数时,人数是大于零的一个值,当人数这个值为负数时,应当报错。虽然运行过程中不会自动报错,但我们可以通过throw关键字抛出实现报错。                

public class ThrowDemo {
  public static void main(String[] args) {
        //定义 人数 为 count 对象
    int count = -100;
    try {
      if(count < 0) {
        //人数小于零时,抛出该异常,终止try代码块中的程序
        throw new ArithmeticException("人员数量是负数"+count);
      }
      System.out.println("当前统计的人数为:"+count);      
    }catch(Exception e) {
      //调用printStackTrace()方法,在控制台中反馈抛出的异常性质,内容,位置
      e.printStackTrace();
    }
  }
}

输出结果:

 

2.使用throws关键字抛出异常

       定义:throws 关键字通常被应用在声明方法时,用来指定方法可能抛出的异常(大部分起到警示这个方法中异常的作用)。

      语法:

public void method() throws 异常类型1,异常类型2,…,异常类型n{
}

  特点:

               (1)使用 throws 关键字将异常抛给上一级后,如果不想处理该异常,可以继续向上抛出,但最终要处理该异常的代码

               (2)多个异常可使用逗号分隔 ,

              (3)如果是Error、RuntimeException或它们的子类,可以不使用 throws 关键字来声明要抛出的异常,编译仍能顺利通过,但在运行时会被系统抛出。

      实例:

public class ThrowsDemo {
    //在定义 show()方法时,使用 throws 关键字,抛出异常
  public static void show() throws ArithmeticException,Exception{
    for(int i = 0;i<10;i++) {
      int b = 1/0;
            //此处运算,除数不能为零,发生异常
    }
  }
  public static void main(String[] args) {
    //try-catch语句反馈处理异常
        try {
      show();
    } catch (Exception e) {
      //在控制台中反馈出异常的信息
            System.out.println("异常:除数不能为零!");
      System.out.println(" 请程序员尽快解决!");
      e.printStackTrace();
    }
  }
}

 输出结果:

        由此可知,不管是thrrow,throws,或者try-catch语句,它们并不没有修正BUG的能力,最多的用处是反馈,推测项目中发生了什么BUG。它们只是程序员去检测,推敲,修改BUG的辅助工具。具体的BUG需要我们亲自动手处理,不要偷懒。

总结

       此篇博客介绍了异常中自定义异常的创建,throw,throws关键字的使用,如果对本文中有疑惑或者补充,指正的想法,欢迎在评论区中留言,博主会及时回复的。

相关文章
|
Java
Java实现一个坦克大战的小游戏【附源码】
Java实现一个坦克大战的小游戏【附源码】
434 0
|
11月前
|
SQL 存储 Oracle
【赵渝强老师】Hive的分区表
Hive的分区表与Oracle、MySQL类似,通过分区条件将数据分隔存储,提高查询效率。本文介绍了静态分区表和动态分区表的创建与使用方法,包括具体SQL语句和执行计划分析,附带视频讲解。静态分区表需显式指定分区条件,而动态分区表则根据插入数据自动创建分区。
919 1
|
Arthas 监控 Java
深入解析与解决高并发下的线程池死锁问题
在高并发的互联网应用中,遇到线程池死锁问题导致响应延迟和超时。问题源于库存服务的悲观锁策略和线程池配置不当。通过以下方式解决:1) 采用乐观锁(如Spring Data JPA的@Version注解)替换悲观锁,减少线程等待;2) 动态调整线程池参数,如核心线程数、最大线程数和拒绝策略,以适应业务负载变化;3) 实施超时和重试机制,减少资源占用。这些改进提高了系统稳定性和用户体验。
558 2
|
算法 定位技术
【逻辑设计】卡诺图 | 布尔方程式 | 最小项与最大项 | 卡诺图无关项 Don‘t cares
【逻辑设计】卡诺图 | 布尔方程式 | 最小项与最大项 | 卡诺图无关项 Don‘t cares
782 0
|
存储 算法 安全
【集合系列】- 初探java集合框架图(一)
实际开发中,经常用到java的集合框架,比如ArrayList、LinkedList、HashMap、LinkedHashMap,几乎经常接触到,虽然用的多,但是对集合的整体框架,基础知识还是不够系统,今天想和大家一起来梳理一下!
1977 0
【集合系列】- 初探java集合框架图(一)
|
网络协议 中间件 编译器
C语言的应用场景
C语言的应用场景
|
网络协议 开发工具 git
【斯坦福计网CS144】Lab4终结笔记
【斯坦福计网CS144】Lab4终结笔记
198 0
|
存储 消息中间件 缓存
RocketMQ如何保证消息的可靠性?
消息的发送方式有哪几种?存储消息的可靠性面临哪些挑战?消费消息的确认机制是怎样的?本文通过分析消息流转的整个过程,从消息发送、消息存储和消息消费三个阶段介绍RocketMQ是如何保证消息的可靠性的。
RocketMQ如何保证消息的可靠性?
|
机器学习/深度学习 自然语言处理 物联网
大模型学习路线与建议
大模型学习路线与建议
1389 0
|
存储 前端开发 JavaScript
JavaScript学习 -- AES加密算法
JavaScript学习 -- AES加密算法
568 0