Java学习14(异常)

异常

概述

  程序运行过程出错的情况就是异常。Java提供了异常处理机制,出现不正常情况的时候,就会把异常信息打印到控制台,供程序员参考修改。
image.png

这是Java打印的异常信息,这个信息是JVM打印的。

异常的作用: 增强程序的健壮性。

异常的存在形式

  异常在Java中是以类和对象的形式存在,可以通过异常类创建异常对象!
  在JVM执行到错误行的时候,就会创建一个异常对象,并且会将该异常对象抛出,打印到控制台。

如果有多个同类的异常出现,会创建多个异常对象。

异常的继承结构

UML和startUML

  UML是一种图标式的统一建模语言,不是只在Java中使用,只要在面向对象编程的语言里,都有UML。
在UML图中,可以描述类和类之间的关系,程序执行的流程,对象的状态等……
  用这类语言的工具(startUML)可以画图帮助理解Java中的关系。

继承结构图

  通过UML,我们可以清晰地了解异常的继承结构:
image.png

之后的继承结构图都会采用这种方式呈现~

编译时异常和运行时异常的区别

  所有异常都是在运行阶段发生的,因为只有运行的时候才能创建对象,编译阶段是无法创建对象的。

编译时异常发生概率较高,在运行之前就需要对其进行预处理。
运行时异常发生概率较低,对这类异常进行预处理会很麻烦

  如果不这么划分,程序需要对所有异常都进行预处理,效率太低了!

两种异常处理方式

  1. 在方法声明的位置上,使用throws关键字,将异常上抛。

注意事项:

  1. Java中异常发生后如果一直上抛,最终抛给了main方法,main方法继续上抛给了JVM,JVM知道这个异常就会直接终止Java程序的执行!
  2. 重写之后的方法不能比重写之前的方法抛出更多(更宽泛)的异常,但是可以更少!
  1. 使用try{}catch(){}进行异常捕捉。

异常处理的原理

public class test01 {public static void main(String[] args) {doSome();}public void doSome() throws ClassNotFoundException{System.out.println("emm");}
}

  public void doSome() throws ClassNotFoundException{}方法使用了编译时异常的异常上抛的情况就需要在main方法的编写阶段对该异常做预处理!

在main方法使用try{}catch(){}处理而不是继续上抛!

  此时,我们可以继续上抛或者使用try{}catch(){}处理。

public static void main(String[] args) {try{doSome();}catch(ClassNotFoundException e){e.orintStackTrace();}    
}

这种方法在这里就已经将异常拦截了,上面不会知道有这个错误!

  出现异常,采用异常上抛,异常后面的不会执行,整个方法就结束了;采用try{}catch(){}处理,try异常后面的代码不会执行,整个异常处理外的代码正常执行。

try{}catch(){}深入理解

  1. catch后面小括号中的类型可以是具体的异常类型,也可以是该异常类型的父类型(多态)。
  2. catch可以写多个,建议写catch的时候一个异常一个catch处理,这样有利于程序的调试。
  3. catch写多个时,如果多个异常存在继承关系,顺序必须从子到父依次写;如果没有继承关系,catch的顺序没有要求。

JDK8.0以后,可以采用或者的方式将多个异常放在一个catch中:
catch(ClassNotFoundException|ArithmeticException|NullPointerException e){}

两种异常处理方式的选择

  如果希望调用者来处理调用函数的异常,就选择异常上抛,其他情况就使用try{}catch(){}

异常对象的常用方法

获取异常简单的描述信息String msg = exception.getMessage();
打印异常堆栈的追踪信息exception.printStackException();
public static void main(String[] args) {NullPointerException e = new NullPointerException("空指针异常");String msg = e.getMessage();System.out.println(msg);e.printStackTrace(); System.out.println("helloWorld!");
}

image.png
  这里并没有发生异常,只是将异常对象的信息抛出,并不会结束程序!异常追踪信息从上往下看,SUN公司的代码就不用看了。

结果中helloWorld先打印,是因为Java打印异常堆栈信息的时候,采用异步线程的方式打印的,涉及多线程,后面再学~

finally子句

概述

  在finally子句中的代码是最后执行的,并且一定会执行,哪怕try语句中出现异常!
  finally子句必须和try语句一起出现,不能单独出现,但是可以只跟try不跟catch。
  使用场景: 完成资源的关闭/释放。

退出JVMfinally的执行情况

public static void main(String[] args) {try{System.out.println("helloWorld!");System.exit(0);}finally{System.out.println("helloWorld!");}
}

image.png
  很明显,当JVM关闭的时候,finally语句也不再执行!

自定义异常

  实际开发的时候,有很多异常是JDK内置中不存在的,此时我们就需要自定义异常。
  Java中自定义异常分为两步:

  1. 编写一个类继承Exception或RuntimeException。
  2. 提供两个构造方法,一个无参,一个有参(带有String的)。
public class MyException extends Exception{public MyException(){        }public MyException(String s){super(s);}
}

  之后我们就可以通过异常对象的方法来调用这个类,此时我们就完成了我们自定义的异常!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/793730.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

FOC算法中为啥用PWM触发ADC中断

在FOC(Field Oriented Control,场向量控制)算法中,为什么要使用PWM(Pulse Width Modulation,脉宽调制)触发ADC(Analog-to-Digital Converter,模数转换器)中断…

可以写网易云的了!

你好,我是云桃桃。 一个希望帮助更多朋友快速入门 WEB 前端的程序媛。 1枚程序媛,大专生,2年时间从1800到月入过万,工作5年买房。 分享成长心得。 259篇原创内容-gzh 后台回复“前端工具”可获取开发工具,持续更新中…

设计模式——原型模式05

原型模式核心复制,每次new出来的对象完全不一样,实现对象之间的隔离。 学习前最好先掌握jAVA值传递和深浅拷贝 设计模式,一定要敲代码理解 浅拷贝 克隆出对象,其中两者的引用类型属性是同一个对象。 对象信息 /*** author ggb…

常用的AI绘画自动生成器介绍

AI绘画自动生成器是一种利用人工智能技术生成图像的工具。它可以根据用户输入的文本描述自动生成相应的图像。目前,有几种流行的AI绘画自动生成器,包括: 1. **DALL-E 2** DALL-E 2是由OpenAI开发的AI绘画生成器,它可以根据用户输入的自然语言描述生成高质量的图像。DALL-E 2使…

【Linux】Linux进程学习(基本认知)

🔥博客主页: 小羊失眠啦. 🎥系列专栏:《C语言》 《数据结构》 《C》 《Linux》 《Cpolar》 ❤️感谢大家点赞👍收藏⭐评论✍️ 文章目录 前言一、冯诺依曼体系二、系统管理三、进程理解3.1 代码与数据3.2 进程控制块 四…

jvm总结学习

四种加载器 1.启动类加载器 2.拓展类加载器 3.应用程序加载器 4.自定义加载器 沙箱机制 就是为了保证安全,增加的一些权限。 native方法区(静态变量,常量,类信息(构造方法,接口定义)&…

java八股——常见设计模式

上一篇传送门:点我 有哪些设计模式? 按照模式的应用目标分类,可以分为创建型模式、结构型模式、行为型模式三类。 创建型模式: 对象实例化的模式,创建型模式用于解耦对象的实例化过程。 单例模式:某个类…

突破!AI机器人拥有嗅觉!仿生嗅觉芯片研究登上Nature子刊

我们一直梦想着让AI与人类能够更加相似,赋予它们视觉与听觉。而让机器人拥有嗅觉一直以来面临着巨大的困难。 香港科技大学范志勇教授领导的研究团队凭借最新研发的仿生嗅觉芯片(BOC)在这一领域取得了重大突破。该研究成果目前已被发表到IF …

ActiViz中的数据集vtkPolyData

文章目录 前言一、数据结构二、数据内容三、几何操作四、数据导入与导出五、数据可视化六、函数详解1、SetPoints(vtkPoints points):2、SetPolys(vtkCellArray polys):3、GetNumberOfPoints():4、GetNumberOfCells():5、GetPointData():6、GetCellData():7、Ge

github生成新的SSH密钥

首先是参考官方文档 生成新的 SSH 密钥并将其添加到 ssh-agent述 当你在创建SSH密钥时遇到提示: Enter file in which to save the key (/c/Users/YOU/.ssh/id_ALGORITHM):这一步是让你选择保存生成的SSH密钥对的文件名和位置。如果你直接按回车键([Pr…

Qt+OpenGL_part1

OpenGL,Qt实现:1入门篇(已更完)_哔哩哔哩_bilibili OpenGL3.3以上是现代模式(可编程管线): 状态机 状态设置函数(State-changing Function) 状态应用函数 (State-using Function) OpenGL的状态…

Centos7安装minio

下载 官网:MinIO | Code and downloads to create high performance object storage 网盘:链接:https://pan.baidu.com/s/1XTu4WyHrBQbetu5g4oKvAw?pwd7b22 提取码:7b22 将下载的安装文件上传到服务器/opt目录下 安装前准备…

获取天翼网关TEWA-708E超级管理员密码

Download RouterPassView 参考:破解光猫超级管理员密码(网关型号:TEWA-708E) - 知乎

记Kubernetes(k8s)初始化报错:“Error getting node“ err=“node \“k8s-master\“ not found“

记Kubernetes(k8s)初始化报错:"Error getting node" err"node \"k8s-master\" not found" 1、报错详情2、问题排查3、尝试问题解决 💖The Begin💖点点关注,收藏不迷路&#…

Rust语言之属性宏(Attribute Macro)derive

文章目录 Rust语言之属性宏(Attribute Macro)derive Rust语言之属性宏(Attribute Macro)derive 属性宏是一种基于属性的宏,用于修改、扩展或注解 Rust 代码。它们通常用于为函数、结构体、枚举、模块等添加元数据或自…

MATLAB /Simulink 快速开发STM32 --学习收获

MATLAB的Simulink 的确可以下载代码,运行。目前我的硬件不知道哪里除了问题,不能监控。 win11st cubemxkeilmatlab2023b,stm32的固件包是F4的。使用了某石电子的f4电机开发板。 cube配置了led灯,gpio使用LL驱动,不是…

Python教程:Tkinter.root.iconphoto设置程序窗口图标的方法

tk.root 通常指的是Tkinter应用程序的主窗口实例。当你创建一个Tkinter窗口时,你会有一个Tk类的实例,这通常被命名为root。 iconphoto 是这个Tk类实例的一个方法,用于设置窗口的图标。你可以使用这个方法为你的应用程序窗口设置一个自定义的…

14.信号量

一、信号量的简介 信号量是一种解决同步问题的机制,可以实现对共享资源的有序访问。其中,“同步”指的 是任务间的同步,即信号量可以使得一个任务等待另一个任务完成某件事情后,才继续执行; 而“有序访问”指的是对被…

如何打包一个手机软件

目录 前言: 准备工具: 创建项目: 打包程序: 前言: 我们平时手机上使用的程序,或者电脑上使用的程序都可以由Web程序打包而来的,而打包不是一个.html文件也不是一个.js文件而是一个大型的文…

[环境配置]conda 64位安装32位python

进入32模式 set CONDA_FORCE_32BIT1创建环境 conda create --name yourEnv python3.8退出32模式 set CONDA_FORCE_32BIT0ok