当前位置: 首页 > article >正文

Java第二阶段---15异常---第三节 自定义异常

1. 为什么要使用自定义异常

在Java中,异常的类型非常的多,要想使用这些异常,首先必须要熟悉它们。这无疑是一个巨大的工作量,很耗费时间。如果我们可以自定异常,则只需要熟悉 RuntimeException 、 Exception 和 Throwable 即可。这大大缩小了熟悉范围。自定义异常还可以帮助我们快速的定位问题。

自定义运行时异常语法

public class 类名 extends RuntimeException{}

自定义检查异常语法

public class 类名 extends Exception{} 

示例

在登录时经常会看到提示:"用户名不存在"或者"账号或密码错误"。请使用自定义异常来描述该场景

package com.cyx.exception;

/**
 * 用户名不存在
 *
 * 异常命名规范:场景描述+Exception
 */
public class UsernameNotFindException extends Exception{

    public UsernameNotFindException(){
    }

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

}

package com.cyx.exception;

public class BadCredentialsException extends Exception{

    public BadCredentialsException(){
    }

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

package com.cyx.exception;

import java.util.Scanner;

public class Login {

    private static Scanner sc = new Scanner(System.in);

    public static void main(String[] args){
        System.out.println("请输入账号:");
        String username  = sc.next();
        System.out.println("请输入密码:");
        String password = sc.next();

        try{
            login(username,password);
        }catch(UsernameNotFindException e){
            e.printStackTrace();
        }catch (BadCredentialsException e) {
            e.printStackTrace();
        }
    }

    public static void login(String username,String password) throws BadCredentialsException, UsernameNotFindException {
        if("admin".equals(username)){
            if("123456".equals(password)){
                System.out.println("登录成功");
            }else {
                throw new BadCredentialsException("账号或密码错误");
            }
        }else{
            throw new UsernameNotFindException("账号不存在");
        }
    }

}

2.异常使用注意事项

a.运行时异常可以不处理。

b.如果父类抛出了多个异常,子类覆盖父类方法时,只能抛出相同的异常或者是该异常的子集。(与协变返回类型原理一致)

c.父类方法没有抛出异常,子类覆盖父类该方法时也不可能检查异常。此时子类产生该异常,只能捕获处理,不能声明抛出。

package com.cyx.exception;

public class Father {

    public void eat() throws Exception{

    }

    public void sleep(){

    }

    public void login(){

    }

}

package com.cyx.exception;

public class Child extends Father{


    private  String username;

    private  String password;

    public Child(String username, String password) {
        this.username = username;
        this.password = password;
    }


    @Override
    public void eat() throws UsernameNotFindException {

    }
    
    //父类中的方法没有声明抛出异常,子类中方法可以声明抛出运行时异常
    @Override
    public void sleep() throws RuntimeException{

    }

    //父类中的方法没有声明抛出异常,子类中方法不能声明抛出检查异常
    @Override
    public void login() {
      try{
          Login.login(username,password);
      } catch (BadCredentialsException e) {
          e.printStackTrace();
      } catch (UsernameNotFindException e) {
          e.printStackTrace();
      }

    }
}

http://www.kler.cn/a/374897.html

相关文章:

  • [OPEN SQL] FOR ALL ENTRIES IN
  • 学Linux的第五天
  • 计算机毕业设计——ssm驾校预约系统 演示录像 2021
  • java设计模式之创建者模式(5种)
  • flask+celery处理异步任务
  • KOA——基于Node的Web框架
  • 【智能算法应用】秃鹰搜索算法求解二维路径规划问题
  • 适合视频搬运的素材网站推荐——短视频素材下载宝库
  • DirectShow过滤器开发-写MP3音频文件过滤器(再写 写MP3)
  • 鸿蒙系统的优势 不足以及兼容性与未来发展前景分析
  • C++基础_类的基本理解
  • 『 Linux 』网络传输层 - TCP(二)
  • NLP算法工程师精进之路:顶会论文研读精华
  • Rust整合Elasticsearch
  • el-tree展开子节点后宽度没有撑开,溢出内容隐藏了,不显示横向滚动条
  • 使用LangChain控制大模型的输出——解析器Parser
  • 人工智能:塑造未来生活的强大力量
  • 计组-层次化存储结构
  • uniapp+vite配置环境变量
  • Docker | 将本地项目发布到阿里云的实现流程
  • 第3关:命题逻辑推理
  • TQ15EG开发板教程:fmcomms8两片ADRV9009同步采集测试
  • SpringBoot后端开发常用工具详细介绍——flyway数据库版本控制工具
  • MyBatisPlus 中 LambdaQueryWrapper使用
  • ffmpeg+vue2
  • C++STL详解(九)map和set的使用