太简单了!这套Java异常处理的总结,80%的人都没看过
ztj100 2024-12-07 18:47 20 浏览 0 评论
上一篇是分享的是《Java类与类之间的关系、Java内部类》,这篇分享的是《Java异常简介与Java异常处理》。
Java异常简介
1.类型转换异常:ClassCastException
2.算术异常: ArithmeticException
在java中, 把一些不正常现象进行了抽象, 形成了一些异常类型。
在Throwable类的getMessage()/printStackTrace()这两个方法,所有的异常都有。
编译时异常,也称受检异常是指在编译前必须进行预处理, 并不是说这个异常在编译阶段发生,所有的异常都是在运行阶段才可能发生. 就像楼道中必须有灭火器与消防栓, 如果没有这些设备, 就没有安全证, 没有这个安全证,企业就不能生产. 企业必须有火灾的预处理措施, 火灾现在并没有发生。
编译阶段进行语法检查, Java的语法有很多条, 其中一种语法是: 对于受检异常必须进行预处理。
package com.wkcto.chapter02.demo01;
/**
* 运行时异常都是RuntimeException类的子类
* 不需要进行预处理,
* 通过规范的代码进行规避
*
*/
public class Test01 {
public static void main(String[] args) {
int x = 10;
int y = 2;
// divide(x, y); //10/2=5
// divide(10, 0); //这一行产生了异常,导致了程序中断, 程序不再继续向下执行
divide22(x, y);
divide22(10, 0);
System.out.println("main....end...");
}
//定义方法,计算两个整数的商, 没有判断除数为0的情况
public static void divide( int num1, int num2) {
int result = num1/num2;
System.out.println( num1 + "/" + num2 + "=" + result);
}
//定义方法,计算两个整数的商, 通过判断除数为0避免出现算术异常
public static void divide22( int num1, int num2) {
if ( num2 == 0 ) {
System.out.println("除数不能为0");
return ; //结束方法的执行
}
int result = num1/num2;
System.out.println( num1 + "/" + num2 + "=" + result);
}
}
package com.wkcto.chapter02.demo01;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
/**
* 演示编译时异常
* 受检异常, 受控异常
*
*/
public class Test02 {
public static void main(String[] args) {
//读取d:/abc.txt文件中的内容, 使用了FileInputStream类
FileInputStream fis = new FileInputStream("d:/abc.txt");
//SUN在定义FileInputStream构造方法时, 通过 throws关键字声明了FileNotFoundException异常,
//这个异常就是受检异常, 即在定义方法时, 通过throws声明的异常
//受检异常在编译前必须进行预处理, 否则编译语法报错
}
}
Java异常处理
● throws抛出处理
try…catch捕获处理
语法:
try{
对可能产生异常的代码进行检视
try代码块中的某条语句一旦产生了异常,程序就立即跳转到catch子句执行, try代码块后面的代码不再执行
try代码块中, 可能会有多条语句有受检异常需要预处理, 可以通过多个catch子句分别捕获
}catch( 异常类型1 e1){
捕获异常类型1的异常, 捕获了异常,在开发阶段, 一般的预处理方式就是把异常打印到屏幕上, 程序员可以根据异常信息进行程序调试
e1.printStackTrace(); //每个异常都有这个方法
}catch( 异常类型2 e2){
如果catch子句捕获的异常有继承关系, 如果想单独对异常进行预处理, 应该先捕获子异常, 再捕获父异常, 或者直接捕获一个父异常
}finally{
finally子句不管是否有异常产生,总是会执行
经常在finally子句中释放系统资源
}
package com.wkcto.chapter02.demo01;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
/**
* 演示异常的捕获处理
* 如果没有捕获异常, 系统会中断, 对产生 的异常进行捕获处理后, 程序不会中断 ,会继续向下执行
* 异常处理的作用:
* 提高程序的健壮性, 鲁棒性(Robust)
*
*
*/
public class Test03 {
public static void main(String[] args) {
try{
FileInputStream fis = new FileInputStream("d:/abc.txt"); //构造方法有受检异常FileNotFoundException需要预处理
System.out.println("在当前程序与指定的文件之间建立了流通道, ");
fis.read(); //read()方法有受检异常IOException需要预处理
System.out.println("从文件中读取了一个字节");
fis.close(); //close()方法有受检异常IOException需要预处理
System.out.println("文件读取完后,需要关闭流通道");
}catch (FileNotFoundException e) {
// 捕获文件未找到异常
e.printStackTrace(); //开发时,一般把异常打印到屏幕上
//捕获了产生的异常, 程序没有中断, 还继续向下执行
}catch (IOException e) {
// 捕获IOException异常
// FileNotFoundException 继承了 IOException, 如果需要单独处理, 应该先捕获子异常 ,再捕获父异常
// 或者, 不需要单独处理时, 直接捕获父异常即可
}
System.out.println("main...end....");
}
}
finally子句总是会执行
package com.wkcto.chapter02.demo01;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
/**
* finally子句
* 不管是否产生异常, finally子句总是会执行, 经常用来释放系统资源
*
*/
public class Test04 {
public static void main(String[] args) {
FileInputStream fis = null;
try{ //try代码块,对可能产生异常的代码进行检视
fis = new FileInputStream("d:/abc.txt"); //构造方法有受检异常FileNotFoundException需要预处理
System.out.println("在当前程序与指定的文件之间建立了流通道, ");
fis.read(); //read()方法有受检异常IOException需要预处理
System.out.println("从文件中读取了一个字节");
// 通过catch子句捕获产生的异常
}catch (FileNotFoundException e) {
// 捕获文件未找到异常
e.printStackTrace(); //开发时,一般把异常打印到屏幕上
//捕获了产生的异常, 程序没有中断, 还继续向下执行
}catch (IOException e) {
// 捕获IOException异常
// FileNotFoundException 继承了 IOException, 如果需要单独处理, 应该先捕获子异常 ,再捕获父异常
// 或者, 不需要单独处理时, 直接捕获父异常即可
}finally {
System.out.println("finally子句,不管是否产生异常,总是会执行, 经常在finally子句中释放系统资源");
//可以在finally子句中关闭流通道
if ( fis != null ) {
try {
fis.close(); //close()方法有受检异常IOException需要预处理
} catch (IOException e) {
e.printStackTrace();
}
System.out.println("文件读取完后,需要关闭流通道");
}
}
System.out.println("main...end....");
}
}
package com.wkcto.chapter02.demo01;
/**
* finally总是会执行
* 1)try/catch/finally子句都不能单独使用, 可以try..catch.., 也可以try...finally, 也可以try...catch..finally
* 2)final/finalize/finally的区别
*
*/
public class Test05 {
public static void main(String[] args) {
int num = mm(10);
System.out.println( num ); //10
}
public static int mm( int xx ) { //xx = 10
try {
return xx;
} finally {
xx++;
}
/*
* 程序执行到return xx;语句时, 并没有立即执行return语句, 而是把xx变量的值保存起来
* 然后执行finally子句, xx的值加1变为了 11
* 最后再执行return语句, 返回的不是xx变量现在的值, 而保存的值10给返回了
*/
}
}
throws抛出处理
package com.wkcto.chapter02.demo01;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
/**
* throws抛出处理
*
*/
public class Test06 {
//在定义main()方法时,可以抛出异常, main的异常抛出给JVM
//JVM默认的处理方式: 中断程序, 打印异常信息
// public static void main(String[] args) throws FileNotFoundException {
public static void main(String[] args) {
System.out.println("main方法中调用m1()方法");
try {
m1(); //抛出m1()抛出的异常, 这个异常不会继续上抛了, 程序也不会中断,继续向下执行
} catch (FileNotFoundException e) {
e.printStackTrace();
}
System.out.println("main方法结束....");
}
//如果m1()方法 在定义时通过throws声明了一个异常, 就是受检异常, 在调用m1()方法时也需要对该异常进行预处理
//谁调用m1()方法, 谁负责处理该异常
private static void m1() throws FileNotFoundException {
System.out.println("m1方法开始执行, 调用了m2()方法 ");
m2(); //在调用m2()方法, 需要对m2()的受检异常进行预处理
System.out.println("m1方法结束 ......");
}
//在定义方法时, 如果方法体中的某条语句有受检异常需要预处理, 可以捕获处理, 还可以抛出处理
//在方法的定义位置通过throws关键字声明抛出异常, 在m2()定义时通过throws声明的异常 就是受检异常
//谁调用m2()方法, 谁负责处理该异常
private static void m2() throws FileNotFoundException {
System.out.println("m2方法调用 FileInputStream类的构造方法");
FileInputStream fis = new FileInputStream("d:/abc.txt"); //构造方法有受检异常需要预处理
System.out.println("m2.结束");
}
}
异常处理可以进行捕获,也可以抛出, 如何选择?
● 在定义方法时, 如果方法体中某条语句有受检异常需要预处理, 可以选择捕获处理,也可以选择抛出处理。
● 在调用方法时, 如果被调用的方法有受检异常需要预处理, 一般情况下是进行捕获处理。
● 定义方法时,抛出的异常,是抛出给调用者, 通过抛出异常,提醒方法的调用者,可能有异常发生, 调用者需要对这个异常进行预处理
● 在定义方法时, 如果方法体中通过throw语句抛出了一个异常对象, 所在的方法应该通过throws声明该异常
- 上面就是《Java异常简介与Java异常处理》的分享,接下来为大家梳理《Java方法覆盖中的异常处理、Java异常在开发中的应用与Java数组的定义》。
- 也欢迎大家交流探讨,该文章若有不正确的地方,希望大家多多包涵。
- 你们的支持就是我最大的动力,如果对大家有帮忙给个赞哦~~~
- 上一篇:java数据结构与算法之归并排序
- 下一篇:Python实现图像的全景拼接
相关推荐
- 离谱!写了5年Vue,还不会自动化测试?
-
前言大家好,我是倔强青铜三。是一名热情的软件工程师,我热衷于分享和传播IT技术,致力于通过我的知识和技能推动技术交流与创新,欢迎关注我,微信公众号:倔强青铜三。Playwright是一个功能强大的端到...
- package.json 与 package-lock.json 的关系
-
模块化开发在前端越来越流行,使用node和npm可以很方便的下载管理项目所需的依赖模块。package.json用来描述项目及项目所依赖的模块信息。那package-lock.json和...
- Github 标星35k 的 SpringBoot整合acvtiviti开源分享,看完献上膝盖
-
前言activiti是目前比较流行的工作流框架,但是activiti学起来还是费劲,还是有点难度的,如何整合在线编辑器,如何和业务表单绑定,如何和系统权限绑定,这些问题都是要考虑到的,不是说纯粹的把a...
- Vue3 + TypeScript 前端研发模板仓库
-
我们把这个Vue3+TypeScript前端研发模板仓库的初始化脚本一次性补全到可直接运行的状态,包括:完整的目录结构所有配置文件研发规范文档示例功能模块(ExampleFeature)...
- Vue 2迁移Vue 3:从响应式到性能优化
-
小伙伴们注意啦!Vue2已经在2023年底正式停止维护,再不升级就要面临安全漏洞没人管的风险啦!而且Vue3带来的性能提升可不是一点点——渲染速度快40%,内存占用少一半,更新速度直接翻倍!还在...
- VUE学习笔记:声明式渲染详解,对比WEB与VUE
-
声明式渲染是指使用简洁的模板语法,声明式的方式将数据渲染进DOM系统。声明式是相对于编程式而言,声明式是面向对象的,告诉框架做什么,具体操作由框架完成。编程式是面向过程思想,需要手动编写代码完成具...
- 苏州web前端培训班, 苏州哪里有web前端工程师培训
-
前端+HTML5德学习内容:第一阶段:前端页面重构:PC端网站布局、HTML5+CSS3基础项目、WebAPP页面布局;第二阶段:高级程序设计:原生交互功能开发、面向对象开发与ES5/ES6、工具库...
- 跟我一起开发微信小程序——扩展组件的代码提示补全
-
用户自定义代码块步骤:1.HBuilderX中工具栏:工具-代码块设置-vue代码块2.通过“1”步骤打开设置文件...
- JimuReport 积木报表 v1.9.3发布,免费可视化报表
-
项目介绍积木报表JimuReport,是一款免费的数据可视化报表,含报表、大屏和仪表盘,像搭建积木一样完全在线设计!功能涵盖:数据报表、打印设计、图表报表、门户设计、大屏设计等!...
- 软开企服开源的无忧企业文档(V2.1.3)产品说明书
-
目录1....
- 一款面向 AI 的下一代富文本编辑器,已开源
-
简介AiEditor是一个面向AI的下一代富文本编辑器。开箱即用、支持所有前端框架、支持Markdown书写模式什么是AiEditor?AiEditor是一个面向AI的下一代富文本编辑...
- 玩转Markdown(2)——抽象语法树的提取与操纵
-
上一篇玩转Markdown——数据的分离存储与组件的原生渲染发布,转眼已经鸽了大半年了。最近在操纵mdast生成md文件的时候,心血来潮,把玩转Markdown(2)给补上了。...
- DeepseekR1+ollama+dify1.0.0搭建企业/个人知识库(入门避坑版)
-
找了网上的视频和相关文档看了之后,可能由于版本不对或文档格式不对,很容易走弯路,看完这一章,可以让你少踩三天的坑。步骤和注意事项我一一列出来:1,前提条件是在你的电脑上已配置好ollama,dify1...
- 升级JDK17的理由,核心是降低GC时间
-
升级前后对比升级方法...
- 一个vsCode格式化插件_vscode格式化插件缩进量
-
ESlint...
你 发表评论:
欢迎- 一周热门
-
-
MySQL中这14个小玩意,让人眼前一亮!
-
旗舰机新标杆 OPPO Find X2系列正式发布 售价5499元起
-
【VueTorrent】一款吊炸天的qBittorrent主题,人人都可用
-
面试官:使用int类型做加减操作,是线程安全吗
-
C++编程知识:ToString()字符串转换你用正确了吗?
-
【Spring Boot】WebSocket 的 6 种集成方式
-
PyTorch 深度学习实战(26):多目标强化学习Multi-Objective RL
-
pytorch中的 scatter_()函数使用和详解
-
与 Java 17 相比,Java 21 究竟有多快?
-
基于TensorRT_LLM的大模型推理加速与OpenAI兼容服务优化
-
- 最近发表
- 标签列表
-
- idea eval reset (50)
- vue dispatch (70)
- update canceled (42)
- order by asc (53)
- spring gateway (67)
- 简单代码编程 贪吃蛇 (40)
- transforms.resize (33)
- redisson trylock (35)
- 卸载node (35)
- np.reshape (33)
- torch.arange (34)
- npm 源 (35)
- vue3 deep (35)
- win10 ssh (35)
- vue foreach (34)
- idea设置编码为utf8 (35)
- vue 数组添加元素 (34)
- std find (34)
- tablefield注解用途 (35)
- python str转json (34)
- java websocket客户端 (34)
- tensor.view (34)
- java jackson (34)
- vmware17pro最新密钥 (34)
- mysql单表最大数据量 (35)