JavaSE/异常

简介: JavaSE/异常

博客制作不易,欢迎各位点赞👍+收藏⭐+关注


前言

在使用Java编写代码时,我们难免会遇到数组越界、运行超时、栈溢出等异常问题。所以如果我们熟练掌握异常的定义和使用,这对我们学习Java有很大的帮助。


一、异常的定义

程序执行过程中发生的不正常行为称为异常 。

比如我们在前言中提到的数组越界、运行超时、栈溢出这三个常见的报错信息就是异常的一部分。

在Java当中,为了对不同异常或者错误进行很好的分类管理,Java内部维护了一个异常的体系结构:


  • Throwable:派生出Error和Exception两个子类;
  • Error:代表是Java虚拟机无法解决的严重问题,比如:JVM的内部错误、资源耗尽等。
  • Exception:异常产生后程序员可以通过代码进行处理,使程序继续执行。
  • 异常分为:编译时异常、运行时异常。

二、异常的抛出和捕获

1.异常抛出

throw new ***("异常产生的原因");

1. throw必须写在方法体内部


2. 抛出的对象必须是Exception 或者 Exception 的子类对象


3. 如果抛出的是 RunTimeException 或者 RunTimeException 的子类,则可以不用处理,直接交给JVM来处理


4. 如果抛出的是编译时异常,用户必须处理,否则无法通过编译


5. 异常一旦抛出,其后的代码就不会执行

2.异常捕获

  • 异常的声明:

       修饰符 返回值类型 方法名(参数列表) throws 异常类型1,异常类型2...{ }

       例如:

public int func() throws Exception{}

1. throws必须跟在方法的参数列表之后

2. 声明的异常必须是 Exception 或者 Exception 的子类
3. 方法内部如果抛出了多个异常,throws之后必须跟多个异常类型,之间用逗号隔开,如果抛出多个异常类型 具有父子关系,直接声明父类即可。

  • 异常的 try-catch 捕获
try{
    //可能产生异常的代码
}catch(异常类型 e){
    //处理异常,比如:
    e.print();
}finally{
    //无论是否发生异常,都一定会执行
}

三、自定义异常

1.自定义异常类,然后继承自Exceimeime或RunTimeException;

2.实现一个带String类型参数的构造方法,参数含义:出现异常的原因;
3.继承自Exceimeime的异常默认是受查异常;

4.继承自RunTimeExceimeime的异常默认是非受查异常;

5.编译时异常-》受查异常;

6.运行时异常-》非受查异常。

例:

自定义异常的实现:

class LoginException extends Exception{
    LoginException(String m){
        super(m);
    }
    @Override
    public void printStackTrace() {
        super.printStackTrace();
    }
}
class LoginPwdException extends Exception{
    LoginPwdException(String m){
        super(m);
    }
    @Override
    public void printStackTrace() {
        super.printStackTrace();
    }
}

自定义异常的抛出和捕获:

class Login{
    private String name;
    private String pwd;
    public static void login(String name, String pwd) throws LoginException, LoginPwdException{
        if(!name.equals("zouyujie")){
            throw new LoginException("登录账号异常!");
        }
        if(!pwd.equals("200310")){
            throw new LoginPwdException("登录密码有误!");
        }
        System.out.println("登录成功!");
    }
}
public class Main {
    public static void main(String[] args){
        try{
            Login.login("zouyujie","20031");
        }catch(LoginException ex){
            ex.printStackTrace();
        }catch (LoginPwdException ex){
            ex.printStackTrace();
        }finally {
            System.out.println("over!");
        }
    }
}

运行结果:




结语

两周过去啦,博主学习到了很多新的知识,你们呢~

相关文章
|
机器学习/深度学习 算法
随机森林算法是如何通过构建多个决策树并将它们的预测结果进行投票来做出最终的预测的?
【2月更文挑战第28天】【2月更文挑战第102篇】随机森林算法是如何通过构建多个决策树并将它们的预测结果进行投票来做出最终的预测的?
448 1
|
人工智能 安全 Anolis
打造更 AI 的操作系统 《龙蜥+超级探访》第三期走进浪潮信息
且看龙蜥社区如何联合浪潮信息向更高层次的操作系统智能化迈进?
打造更 AI 的操作系统 《龙蜥+超级探访》第三期走进浪潮信息
|
网络协议 算法 安全
【专栏】RIP是一种古老的内部网关协议,使用距离矢量算法,基于跳数更新路由表,最古老的距离矢量协议
【4月更文挑战第28天】RIP是一种古老的内部网关协议,使用距离矢量算法,基于跳数更新路由表。其工作原理包括周期性更新、度量标准、路由表更新和防止计数到无穷问题的技术。RIP简单易用,适合小规模网络,但在大规模网络中效率低且有限制。随着OSPF和EIGRP等协议的发展,RIP在大型网络中的应用减少,但在中小型网络和遗留系统中仍有其地位。RIPv2的改进提高了安全性与灵活性。尽管逐渐被替代,RIP在理解路由协议基本概念和历史中仍具价值。
745 1
|
开发框架 前端开发 JavaScript
【Flutter前端技术开发专栏】Flutter中的动态UI构建与数据驱动视图
【4月更文挑战第30天】Flutter是一款高效跨平台移动开发框架,以其热重载、高性能渲染和丰富组件库著称,简化了动态UI和数据驱动视图的实现。本文深入讨论了动态UI构建原理,包括基于Widget树模型的UI更新和状态管理,如使用StatefulWidget和数据流库(如Provider、Redux)。此外,文中还介绍了实现技巧,如使用ListView等可滚动组件、StreamBuilder进行数据流驱动的UI更新,以及应用响应式布局以适应不同设备。Flutter为开发者提供了构建高效动态界面的强大工具。
637 0
【Flutter前端技术开发专栏】Flutter中的动态UI构建与数据驱动视图
|
Java API 网络架构
Spring Cloud中的服务路由与过滤技术实现
Spring Cloud中的服务路由与过滤技术实现
|
敏捷开发 测试技术 持续交付
阿里云云效产品使用问题之codeup中某个分支被误删除了,该如何找回
云效作为一款全面覆盖研发全生命周期管理的云端效能平台,致力于帮助企业实现高效协同、敏捷研发和持续交付。本合集收集整理了用户在使用云效过程中遇到的常见问题,问题涉及项目创建与管理、需求规划与迭代、代码托管与版本控制、自动化测试、持续集成与发布等方面。
|
JavaScript 前端开发
JavaScript事件监听
JavaScript事件监听
|
XML Java Maven
深入Gradle:初识构建自动化的魅力
深入Gradle:初识构建自动化的魅力
|
数据采集 机器学习/深度学习 搜索推荐
阿里云向量检索服务体验评测
阿里云向量检索服务是一款功能强大、易于接入的云服务产品。它为用户提供了快速、准确的向量检索功能,适用于多种业务场景,如推荐系统、搜索和图像识别等。产品具有完善的使用文档和丰富的开发者支持,方便用户快速上手。与其他阿里云产品联动,可以为用户提供更加全面和高效的一站式解决方案。尽管有改进空间,但阿里云向量检索服务已表现出出色的性能和应用价值。
902 1
|
存储
队列的学习(一)用数组和链表实现单向队列
队列的学习(一)用数组和链表实现单向队列 队列(Queue)是一种先进先出的数据结构,类似于现实生活中排队的场景。它有两个基本操作:入队(enqueue)和出队(dequeue)。在本文中,我们将介绍如何使用数组和链表来实现单向队列。
226 0