面向对象之异常处理

Python面向对象与异常处理实践 本文通过待办事项应用示例展示Python面向对象编程,涵盖类与模块设计,并探讨异常处理、代码重构、数据结构选择及序列化等核心话题,强调DRY原则与代码可维护性,适合提升实际编程能力。 阅读详情

@(笔记)[MarkDown|异常处理|我的博客|面向对象]

7.14

面向对象之异常处理


概述

  • Java异常是Java提供的一种识别及响应错误的一致性机制。
  • Java异常机制可以使程序中异常处理代码和正常业务代码分离,保证程序代码更加优雅,并提高程序健壮性。
  • 在有效使用异常的情况下,异常能清晰的回答what, where, why这3个问题:
    • 异常类型 –>”什么”被抛出;
    • 异常堆栈跟踪 –>”在哪”抛出;
    • 异常信息 –>”为什么”会抛出;

Throwable类



enter image description here

  Throwable是 Java 语言中所有错误或异常的超类。
Throwable包含两个子类: Error 和 Exception。它们通常用于指示发生了异常情况。
  Throwable包含了其线程创建时线程执行堆栈的快照,它提供了printStackTrace()等接口用于获取堆栈跟踪数据等信息。

Exception

  Exception及其子类是 Throwable 的一种形式,它指出了合理的应用程序想要捕获的条件。

RuntimeException

  RuntimeException是那些可能在 Java 虚拟机正常运行期间抛出的异常的超类。
  编译器不会检查RuntimeException异常。例如,除数为零时,抛出ArithmeticException异常。RuntimeException是ArithmeticException的超类。当代码发生除数为零的情况时,倘若既”没有通过throws声明抛出ArithmeticException异常”,也”没有通过try…catch…处理该异常”,也能通过编译。这就是我们所说的”编译器不会检查RuntimeException异常”!
  如果代码会产生RuntimeException异常,则需要通过修改代码进行避免。例如,若会发生除数为零的情况,则需要通过代码避免该情况的发生!

Error

  和Exception一样,Error也是Throwable的子类。它用于指示合理的应用程序不应该试图捕获的严重问题,大多数这样的错误都是异常条件。
  和RuntimeException一样,编译器也不会检查Error。

异常分类(Exception):

Java将可抛出(Throwable)的结构分为三种类型:
1. 被检查的异常(CheckedException)
2. 运行时异常(RuntimeException)
3. 错误(Error)

运行时异常

  • 定义:
    RuntimeException及其子类都被称为运行时异常。
  • 特点:
    Java编译器不会检查它。也就是说,当程序中可能出现这类异常时,倘若既”没有通过throws声明抛出它”,也”没有用try-catch语句捕获它”,还是会编译通过。例如,除数为零时产生的ArithmeticException异常,数组越界时产生的IndexOutOfBoundsException异常,fail-fail机制产生的ConcurrentModificationException异常等,都属于运行时异常。
      虽然Java编译器不会检查运行时异常,但是我们也可以通过throws进行声明抛出,也可以通过try-catch对它进行捕获处理。
      如果产生运行时异常,则需要通过修改代码来进行避免。例如,若会发生除数为零的情况,则需要通过代码避免该情况的发生!

被检查的异常(编译期异常)

  • 定义:
    Exception类本身,以及Exception的子类中除了”运行时异常”之外的其它子类都属于被检查异常。
  • 特点:
    Java编译器会检查它。此类异常,要么通过throws进行声明抛出,要么通过try-catch进行捕获处理,否则不能通过编译。例如,CloneNotSupportedException就属于被检查异常。当通过clone()接口去克隆一个对象,而该对象对应的类没有实现Cloneable接口,就会抛出CloneNotSupportedException异常。
      被检查异常通常都是可以恢复的。

错误

  • 定义:
    Error类及其子类。
  • 特点:
    和运行时异常一样,编译器也不会对错误进行检查。
      当资源不足、约束失败、或是其它程序无法继续运行的条件发生时,就产生错误。程序本身无法修复这些错误的。例如,VirtualMachineError就属于错误。
      按照Java惯例,我们是不应该实现任何新的Error子类的!
    对于上面的3种结构,我们在抛出异常或错误时,到底该哪一种?《Effective Java》中给出的建议是:
    对于可以恢复的条件使用被检查异常,对于程序错误使用运行时异常。

异常处理关键字

  • try –> 用于监听。将要被监听的代码(可能抛出异常的代码)放在try语句块之内,当try语句块内发生异常时,异常就被抛出。
  • catch –> 用于捕获异常。catch用来捕获try语句块中发生的异常。
  • finally –> finally语句块总是会被执行。它主要用于回收在try块里打开的物力资源(如数据库连接、网络连接和磁盘文件)。只有finally块,执行完成之后,才会回来执行try或者catch块中的return或者throw语句,如果finally中使用了return或者throw等终止方法的语句,则就不会跳回执行,直接停止。
    finalize()是Object类的一个方法,用来回收没有被引用的对象,被GC调用;
  • throw –> 用于抛出异常。
  • throws –> 用在方法签名中,用于声明该方法可能抛出的异常。

异常的控制流程

在java中,异常是被一个方法抛出的对象.当一个方法抛出异常时,该方法从调用栈中被弹出,同时把产生的异常的对象抛给栈中的钱一个方法.

异常处理

  • 捕获这个异常,不然它沿着调用栈继续向下抛出
  • 捕获这个异常,并继续向下抛出
  • 不捕获这个异常,从而导致方法从调用栈中被弹出,异常对象继续抛出给调用栈的下面的方法
  • Try程序块里面的语句是按顺序执行的语句
  • 当try程序块里面的语句抛出一个异常的时候,程序的控制转向了相匹配的catch程序块,catch程序块里面的语句被执行。
  • 当异常发生后,程序执行将忽略try程序块中剩余的语句,继续执行程序块后面的语句。
  • 如果在try程序块中没有抛出异常,那么catch块将被忽略。程序将继续执行try-catch下面的语句
  • 在一个try-catch语句中,当有多个catch块的时候,它们被顺序检查
  • 在检查过程中,注意异常的匹配关系是很重要的
  • 当一个异常被抛出,与它相匹配的catch块被执行,其它的catch块,就被忽略掉不再执行
  • 如果没有catch块匹配抛出的异常,那么系统会在堆栈中搜索,找到一个匹配的捕获方法。
  • 如果仍然没有找到,那么系统将处理抛出异常
  • 即使在try程序块内部有一个return语句,finally语句块也要被执行
  • 当在try程序块中,遇到return语句,finally块中的语句在方法返回之前被执行

异常处理流程

  1. 如果程序产生了异常,那么会自动的由JVM根据异常的类型,实例化一个指定异常类的对象;
  2. 如果没有处理异常的操作,
    • 就交给JVM默认处理–>输出异常信息
  3. 如果有异常处理,
    • 则由try语句捕获异常类对象;
    • 然后匹配后面的catch语句,
      • 如果成功,则使用指定的处理语句
      • 如果都不匹配,则由JVM默认处理
  4. 不管是否有异常,都会执行finally语句,如果没有异常,执行完finally,则会继续执行之后的其他语句;如果此时有异常没有处理(没有catch匹配),那么拽会执行finally语句,但是执行完finally后,将默认交给JVM进行异常的输出,并且程序中断.

enter image description here

异常的抛出

throws

一个完整的方法声明:
访问修饰符 可选修饰符 返回类型 方法名(参数列表) throws 异常类型
作用:

  • 通知本方法的调用者,本方法有可能有某种或几种类型的异常
  • 子类重写的方法不能抛出比父类更多(范围)的异常;

3种类:
- 表示层类:主要负责UI的,跟用户打交道,放在最外面的一层;
- 业务层类:处理表示层接受到的数据;
- 持久层类:存储数据;

throw

抛出异常对象
throw new 异常类();
执行到throw时一定会有异常的抛出,就会执行异常抛出执行流程

自定义异常类

  • 继承 Exception 类;
  • 重载Exception的构造方法,一般都是构造3个带参构造方法;
    • 目的是把其他异常的信息封装到自定义异常信息中;
    • 自定义需要的业务上的异常欣喜;
  • 添加自定义异常的特有方法;
    • 大概思路:
      • 新定义一个异常类,继承Exception类
      • 在B内中的方法中声明抛出自定义异常
      • 在B方法内会出现异常的语句用try - catch 包起来
      • 在catch语句中throw new 自定义异常类名(参数列表);
      • 如果 A 类是 B 类的方法的调用者,如果不处理异常,必须在方法中声明 throws 自定义异常类名
      • 如果mian方法是A的调用者,如果不抛出异常,就必须处理这个异常;
      • 如果抛出异常,可以不处理,交给JVM处理;

finall关键字

public classTest {
    public static void main (String[] args) {
        System.out.println (new Test().test() );
    }
    static int test() {
        int x = 1;
        try {
            return x;
        }
        finally {
            ++x;
        }
    }
}

输出 –>1

public class smallT {
    public static void main (String args[]) {
        smallT t = new smallT();
        int b = t.get();
        System.out.println (b);
    }

    public int get() {
        try {
            return 1 ;
        }
        finally {
            return 2 ;
        }
    }
}

输出 –>2

public classTest {
    public static voidmain (String[] args) {
        System.out.println (newTest().test() );;
    }
    int test() {
        try {
            return func1();
        }
        finally {
            return func2();
        }
    }
    int func1() {
        System.out.println ("func1");
        return 1;
    }
    int func2() {
        System.out.println ("func2");
        return 2;
    }
}

输出:
func1
func2
2


Java异常处理与面向对象编程基础 本文深入探讨了Java中的异常处理机制,包括如何捕获和抛出异常,以及面向对象编程(OOP)的核心概念,例如类、字段、构造函数和方法。通过实例和代码示例,详细解析了异常的类型和处理方式,以及如何在Java中实现封装、继承和多态。 阅读详情

相关推荐

Ruby异常处理与面向对象编程

本文深入探讨了Ruby语言中的异常处理机制和面向对象编程的核心概念。通过具体的代码示例和解释,揭示了如何使用rescue、else和ensure关键字管理异常,以及如何通过throw和catch关键字跳出复杂的逻辑结构。同时,本文详细介绍了Ruby中的异常类层次结构,以及如何定义和使用自定义异常类。此外,我们还学习了如何在Ruby中定义类和对象,包括初始化方法、实例变量、以及访问器和设置器方法的使...

weixin_35516624的博客 553

java的 异常处理 Throwable

Java异常类层次结构图 什么是异常 Throwable Error(错误) Exception(异常) unchecked exception(非检查异常,运行时异常) checked exception(检查异常,编译异常) 区别 应该catch什么 Error可以catch吗? 可以catch了后做些其他处理吗? Java异常类层次结构图 什么是异常 异常的英文单词是exception,字面翻译就是“意外、例外”的意思,也就是非正常情况。事实上,异常本质上是程序上的.

weixin_57763462的博客 770

掌握异常处理与面向对象设计的艺术

本文深入探讨了在面向对象编程中异常处理的重要性及其实际应用。通过案例学习和练习,我们理解了try-catch-finally语句的工作原理,如何正确处理异常,以及在设计面向对象系统时如何运用异常处理来增强程序的健壮性。同时,通过对ATM系统的分析,我们学会了如何从需求文档中提取类和属性,并构建用例图来模拟系统交互。

weixin_35391606的博客 159

面向对象-异常

throw关键字:抛出异常创建一个类,继承Exception根据需求,提供对应的构造器业务代码判断,符合一定条件,抛出异常调用者去处理当前异常try-catchsuper(msg);throw new MyException("年龄不符合范围!");

m0_68604414的博客 175

手把手教你用SpringBoot+Vue3+Docker从零搭建一个在线OJ系统(附完整源码)

本文详细介绍了如何使用SpringBoot、Vue3和Docker从零搭建一个在线OJ系统,涵盖前后端开发、判题机实现及Docker容器化部署。通过完整的源码和实战步骤,帮助开发者掌握OJ系统的核心架构与关键技术,适用于算法训练、编程竞赛等场景。

weixin_42648844的博客 297

ASME B31.3-2024工艺管道标准介绍

ASME B31.3-2024《过程管道》是ASME发布的最新版工业管道标准,适用于石油、化工、制药等行业的管道系统设计、建造和维护。该版标准进行了多项重要更新,包括软管管理、应力指数调整、新增管件类型、焊接检查和泄漏测试等条款修订,并新增了书面报告要求。标准共594页,为全球过程工业提供管道安全规范,对保障管道系统完整性、可靠性具有重要意义,被多国强制采用或推荐使用。

TXNMG的博客 4702

看java黑马程序员九到十一章总结

JDK中定义了大量的异常类,虽然这些异常类可以描述编程时出现的大部分异常情况,但是在程序开发中有时可能需要描述程序中特有的异常情况,例如文件4-38中在divide()方法中不允许被除数为负数。为了解决这个问题,在Java中允许用户自定义异常,但自定义的异常类必须继承自Exception或其子类。在实际开发中,如果没有特殊的要求,自定义的异常类只需继承Exception类在构造方法中使用super()语句调用Exception的构造方法即可。既然自定义了异常,那么该如何使用呢?

y3068664188的博客 233

你不必懂AI,但必须会用AI:写给所有焦虑中的职场人

AI时代不必焦虑学技术,关键在于用AI解决实际问题。文章指出,99%的人只需成为AI使用者而非建造者,核心竞争力在于结合业务痛点运用AI工具提升效率。与其盲目学习工具,不如梳理工作流程,识别可优化环节,让AI赋能重复性、标准化任务。行业经验与AI工具的结合才是真正的职场护城河。建议从具体工作场景出发,寻找匹配的AI解决方案,迈出应用第一步。

hundred98的博客 716

Java异常try-catch-finally和try-with-resources

Java 异常类层次结构图 在 Java 中,所有的异常都有一个共同的祖先 java.lang 包中的 Throwable 类。Throwable 类有两个重要的子类 Exception(异常)和 Error(错误)。Exception 能被程序本身处理(try-catch), Error 是无法处理的(只能尽量避免)。Exception 和 Error 二者都是 Java 异常处理的重要子类,各自都包含大量子类。 Exception :程序本身可以处理的异常,可以通过 catch 来进行捕获。Exce

qq_42390636的博客 788

codevs 1620 轮船问题 DP 解题报告

某国家被一条河划分为南北两部分,在南岸和北岸总共有N对城市,每一城市在对岸都有唯一的友好城市,任何两个城市都没有相同的友好城市。

Hawo11的博客 817

空间节省算法在Rowhammer防御中的应用与优化

空间节省算法(Space-Saving)是一种高效的流式数据处理算法,主要用于在有限内存条件下实时识别数据流中的高频项。其核心原理是通过维护固定大小的计数器表,动态跟踪最活跃的元素,适用于处理无限数据流场景。该算法在内存安全领域具有重要价值,特别是在Rowhammer攻击防御中,能够有效检测异常高频访问的DRAM行地址。通过结合计数器衰减策略(如DSAC)和混合架构设计,空间节省算法可以在保证低硬件开销的同时,提供高精度的攻击检测能力。这些技术已成功应用于现代DDR5内存控制器,展现出优异的工程实践价值。

weixin_31139479的博客 606

【面向对象的程序设计——异常处理与输入输出流】异常处理

异常处理,又称意外,是特殊的运行错误的对象,在Java中声明了很多异常类,每一个类都代表着一种错误,类中包含错误信息和处理错误的方法。在子类中,如果要覆盖一个父类的一个方法,若父类中的方法声明了throw异常,则子类的方法也可以throe异常,可以抛出更加局的异常,但不能抛出更加一般的异常。在方法的运行过程中,如果发生了异常,则该方法生成一个代表该异常的对象并把它交给运行时系统,运行时系统便寻找相应的代码来处理这一异常。异常时非致命性的,可以编译程序捕获和处理,Exception类时所有异常类的父类。

m0_74050974的博客 857

4-20mA电流信号转电压

该电路实现4-20mA电流信号转电压(0.44-2.2V)调理功能,采用两级运放设计:第一级LMH6642MFX进行11倍放大,第二级配置为缓冲器加二阶低通滤波。电路包含10Ω采样电阻、多级RC滤波和ESD防护,具有抗干扰强、功耗低(4mW)等特点,适配3.3V系统ADC采集。通过使能控制MOS管可实现节能模式,适用于工业自动化、环境监测等场景。设计合理平衡了信号精度与功耗,输出电压范围留有充足余量避免饱和。

qq_37999850的博客 303

JAVA-面向对象之异常处理

面向对象之异常处理 ---云智科技学习笔记 异常 异常的体系 •    Throwable •    Error •    通常出现重大问题如:运行的类不存在或者内存溢出等。 •

yixuan_1的专栏 787

【网络】叶脊(Spine-Leaf)网络拓扑下全三层网络设计与实践(二) - 网络规划

2. 全三层架构设计思路 采用全三层网络架构设计的出发点是: 使用尽量少的交换机高级功能,可以尽可能减少由于功能bug故障造成的问题; 使用尽量少的网络协议,以兼容不通厂商的网络设备 实现简单,易于维护,绝对可靠的路由协议; 通过控制路由来调度流量,尽量减少设备或协议的故障域; 牺牲高级功能带来的便捷,得到更高的可用性和性能; 由上述原则,本文的设计选择只使用静态路由和BGP...

因吹斯汀 1万+

【python数据挖掘课程】二十八.基于LDA和pyLDAvis的主题挖掘及可视化分析

这是《Python数据挖掘课程》系列文章,前面很多文章都讲解了数据挖掘、机器学习,这篇文章主要讲解LDA和pyLDAvis算法,同时讲解如何读取CSV文本内容进行主题挖掘及可视化展示。文章比较基础,希望对你有所帮助,提供些思路,也是自己教学的内容。推荐大家购买作者新书《Python网络数据爬取及分析从入门到精通(分析篇)》,如果文章中存在错误或不足之处,还请海涵。 目录: 一.显示结果及安装 二.LDA主题挖掘 三.pyLDAvis可视化分析 四.小结

杨秀璋的专栏 1万+

Python基础——面向对象、异常处理

学习内容 1、面向对象 类和对象 魔法方法 继承、多态、私有 类属性和类方法 2、异常处理

Only_kele_ 的博客 953

pscad IEEE标准系统搭建说明

pscad IEEE标准系统搭建说明,包含典型的IEEE 9节点、14节点、30节点、39节点和118节点系统。内含标准测试系统的原始数据和潮流结果。

python异常处理和面向对象编程总结

     异常处理和面向对象编程,是python编程中,比较重要的基础。在实际生产编程设计和开发中,异常处理和面向读象都是必须在设计和开发过程中充分考虑的。     对于python开发和面向对象这两部分基础,用一个python程序进行封装说明,结果如下: #!/usr/bin/env python # _*_ coding:utf-8 _*_ ################# #异

yumushui的专栏 1204

ssm框架搭建

这个是一个在idea上成功跑起来的ssm框架项目,保存在这里方便以后使用直接下载

廖雪峰Python教程[完整版]

廖雪峰的python教程整理的,已经排好版了,而且还是完整的,适合小白

异常处理-面向对象思想的了解

本文介绍了Python编程中的异常处理和面向对象编程两大核心概念。异常处理部分详细讲解了try-except语法结构及其应用场景,列举了ValueError、ZeroDivisionError等常见异常类型,并提供了实际案例演示。面向对象部分阐述了类与对象的关系,讲解了类的定义方法、构造方法__init__的使用以及对象的实例化过程,通过QQ类案例展示了面向对象编程的具体实现。文章最后总结了异常处理和面向对象编程的核心要点,强调两者结合使用能提高程序健壮性,特别适合处理复杂业务场景。

2401_83519807的博客 600

win10 跳过U8环境检测的IE WebControls.rar

win10 安装u8的时候 提示IE WebControls 不通过,这个工具可以欺骗u8的检查。 跳过U8环境检测的IE WebControls。提示导入失败后,重新检测通过。

Python面向对象和异常处理

python0基础异常处理和面向对象学习

姜小孩的博客 289

python基础之异常处理、面向对象

异常处理 当代码运行出错时,程序会终止。code就不是0了,而是-1或者1,不是正常结束。 程序碰到异常又没有捕获到,没有做相应的处理,程序会崩溃。 如果不做异常处理,执行到一些容易出错的位置,可能代码出错会导致程序崩溃,控制台打印异常信息 如果做了异常处理,只是有异常的代码不执行,对异常处理以外的代码不影响 可以在except后面添加异常类型,如果是某种类型的错误,就打印对应的输出信息 可以在后面添加else,如果这段代码没有出错,就执行else后面的代码 有一些代码是不管代码是否运行出错都要执行

aijaijgnaw的博客 549

python面向对象及异常处理

方法重写(overwrite)、方法覆盖(override):在继承的基础上,若子类继承了父类的某些或某个方法,发现某一个方法难以满足自身使用时,就会重写这个方法。函数重写(overwrite)、函数覆盖(override):在继承的基础上,若子类继承了父类的某些或一个方法,发现某个方法难以满足自身使用时,就会重写这个方法。存在多个同名称函数,函数名称相同,参数的个数或类型不同,从而在调用时,会自动调用对应方法的这种现象,叫做函数重载。面向对象中:在继承的基础上,父类引用指向子类实例的现象,被称为多态。

H945572的博客 926

错误异常处理与面向对象

Python 为类元素(属性和方法)的私有性提供初步的形式,由双下划线开始的属性在运行时被“混淆”,所以直接访问是不允许的。继承描述了基类(祖先)的属性如何遗传给派生类(子孙),子类可以继承它的基类的任何属性,不管是数据属性还是方法。类中的方法,也就是类中定义的函数,这个函数第一个参数永远是self,表示自己。

qq_45953122的博客 296

java必备——通过异常处理看面向对象

在看java视频的时候,看到异常处理的时候,我认识到自己编程上的一个缺憾,就是以前的错误处理他范范,我们应该针对不同的错误,做不同的处理,我拿出自己c#和vb的代码,看了看错误处理代码,发现,他们的格式很相似,想到面向对象和面向过程的对比,我想,咱们也许可以在这里,再挖掘一把!     在编写VB的时候,我作为一个小白,基本没有用过错误处理,心中的他是个很高大上的技术,而随着学习了c#,java

ESOO 2655

面向对象的异常处理机制

1,从安全的角度来讲,面向过程的异常处理是更为安全的,因为面向过程是事前处理,而面向对象是事后处理。 从编程和理解的角度来讲,面向对象的处理方式更为方便易懂,因为他是正常代码和处理异常分开的,从而使程序具有处理错误的能力。 2,另一方面 面向过程语言错误处理方式是有缺陷的: 1)不进行范围检查(数据范围错误,如数组下标越界) 2)采用if语句进行事先判断以防止出现错误。

BarryLee的博客 619
上一篇: 面向对象之关键字
下一篇: 每日一类之String类
dong4go
博客等级 码龄12年 5粉丝 28原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值