【JAVA学习笔记】47 - 异常,try-catch处理,throw处理

项目代码

https://github.com/yinhai1114/Java_Learning_Code/tree/main/IDEA_Chapter12/scr/com/yinhai/exception_

〇、异常处理的引入

程序出现一个小问题如int num1 = 10;int num2 = 0;num1 / num2 => 10 / 0

会抛出错误,但这样不算致命的小问题就导致程序崩溃不应该,健壮性太差

所以引出异常处理-异常捕获try-catch

对于可能出现问题的代码使用ctrl + alt + t选中

/*** @author 银海* @version 1.0*/
public class Exception01 {public static void main(String[] args)  {int num1 = 10;int num2 = 0;//Scanner();//1. num1 / num2 => 10 / 0//2. 当执行到 num1 / num2 因为 num2 = 0, 程序就会出现(抛出)异常 ArithmeticException//3. 当抛出异常后,程序就退出,崩溃了 , 下面的代码就不在执行//4. 这样的程序不好,不应该出现了一个不算致命的问题,就导致整个系统崩溃,健重性太次//5. java 设计者,提供了一个叫 异常处理机制来解决该问题// int res = num1 / num2;//如果程序员,认为一段代码可能出现异常/问题,可以使用try-catch异常处理机制来解决//从而保证程序的健壮性//将该代码块->选中->快捷键 ctrl + alt + t -> 选中 try-catch//6. 如果进行异常处理,那么即使出现了异常,程序可以继续执行try {int res = num1 / num2;} catch (Exception e) {//e.printStackTrace();System.out.println("出现异常的原因=" + e.getMessage());//输出异常信息}System.out.println("程序继续运行....");}
}

一、异常的基本介绍

基本概念

        Java语言中,将程序执行中发生的不正常情况称为“异常"。(开发过程中的语法错误和逻辑错误不是异常)

执行过程中所发生的异常事件

可分为两类

1.Error(错误): Java虚拟机无法解决的严重问题。如: JVM系统内部错误、资源耗尽等严重情况。比如: StackOverflowError[栈溢出]和OOM(out ofmemory内存不足), Error 是严重错误,程序会崩溃。

2.Exception(异常):其它因编程错误或偶然的外在因素导致的一般性问题,可以使用针对性的代码进行处理。例如空指针访问,试图读取不存在的文件,网络连接中断等等,

Exception异常又分为两大类

        运行时异常(程序运行时发生的)和编译时异常(编程时,编译器检查出的)。〇所演示的是运行时异常

        1)运行时异常,编译器不要求强制处置的异常。一般是指编程时的逻辑错误,是程序员应该避免其出现的异常。java.lang.RuntimeException类及它的子类都是运行时异常

        2)对于运行时异常,可以不作处理,因为这类异常很普遍,若全处理可能会对程序的可读性和运行效率产生影响

        3)编译时异常,是编译器要求必须处置的异常。

二、异常体系图

如何在IDEA内查看上面的类图体系图呢 

1.从Exception类跳转到Throuwable根类,使用Ctrl+B

2. 右键Throwable类的代码编辑的空白处,点击Diagrams

3.在打开的Diagrams, 右键Throable,选择show Implementations,快捷键Ctrl + Alt +B

show Parent 展示所继承的父类

4.在弹出的接口框中使用键盘输入需要查看的类

5.完成 蓝色线表示继承,绿色线表示调用接口

                 
 

三、常见的运行时异常 

1.NullPointerException空指针

        当应用程序试图在需要对象的地方使用nul时,抛出该异常。

 2.ArithmeticException运算异常

        当出现异常的运算条件时,抛出此异常。例如,一个整数“除以零”时,抛出此类的一个实例

3.ArrayIndexOutOfBoundsExceptiont非法索引异常

        用非法索引访问数组时抛出的异常。如果索引为负或大于等于数组大小,则,该索引为非法索引

4. ClassCastException类型转换异常

当试图将对象强制转换为不是实例的子类时,抛出该异常。例如,以下代码将生成一个

5.NumberFormatException数字格式不正确异常

当应用程序试图将字符串转换成一种数值类型,但该字符串不能转换为适当格式时,抛出该异常=>使用异常我们可以确保输入是满足条件数字,

Integer.parseInt();解析字符串并返回相应的整数值

 四、编译异常

编译异常是指在编译期间,就必须处理的异常,否则代码不能通过编译。了解即可

常见的编译异常

SQLException //操作数据库时,查询表可能发生异常

lOException //操作文件时,发生的异常

FileNotFoundException //当操作一个不存在的文件时, 发生异常

ClassNotFoundException //加载类,而该类不存在时,异常

EOFException //操作文件,到文件末尾,发生异常

llegalArguementException //参数异常
 

五、异常课堂练习

六、异常处理

基本介绍

        异常处理就是异常发生时,对异常处理的方式

处理的方式

        处理方式只能二选一,要么1要么2

1.try-catch-finally        

        程序员在代码中捕获发生的异常,自行处理

try {//代码/可能有异常
}catch(Exception e) {//捕获到异常//1.当异常发生时//2.系统将异常封装成Exception对象e,传递给catch//3得到异常对象后,程序员,自己处理//4.注意,如果没有发生异常catch代码块不执行
}finally{//1.不管try代码块是否有异常发生,始终要执行finally//2.所以,通常将释放资源的代码,放在finally
}
2.throws       

         将发生的异常抛出,交给调用方法来处理,最顶级的处理者就是JVM。如果扔给JVM,会直接输出异常信息然后退出程序,如果没有显式的处理方法则默认throw,一直扔到最高的JVM

七、try-catch异常处理 

1.Java提供try和catch块来处理异常。

try块用于包含 可能出错的代码。catch块用于处理try块中发生的异常。可以根据需要在程序中有多个数量的try..catch块。

2.基本语法
        

        try {
                //可疑代码
                //将异常生成对应的异常对象,传递给catch块
        }catch(异常){
                     //对异常的处理

       }finnaly{

                       //无论有没有异常都会执行

        }

 3.try-catch注意事项和细节

        1)如果异常发生了,则异常发生try块内后面的代码不会执行,直接进入到catch块,注意catch完之后程序依然会执行
public class TryCatchDetail {public static void main(String[] args) {//ctrl + alt + Ttry {String str = "yinhai";int a = Integer.parseInt(str);System.out.println("数字" + a);} catch (NumberFormatException e) {System.out.println(e.getMessage());}System.out.println("程序继续");}
}

        

        2)如果异常没有发生,则顺序执行try的代码块,不会进入到catch.
String str = "123";

         

        3)如果希望不管是否发生异常,都执行某段代码(比如关闭连接,释放资源等)则使用如下代码finally {}
finally {System.out.println("finally 代码块被执行");}

        4)可以有多个catch语句,捕获不同的异常(进行不同的业务处理),要求父类异常在后,子类异常在前,比如(Exception 在后,NullPointerException 在前),如果发生异常,只会匹配一个catch
public class TryCatchDetail02 {public static void main(String[] args) {try {Person person = new Person();person = null;System.out.println(person.getName());//NullPointerExceptionint n1 = 10;int n2 = 0;int res = n1/n2;//ArithmeticException//可以使用多个catch} catch (NullPointerException e){//要求子类异常写在前面,父类异常写在后面System.out.println("空指针异常" + e.getMessage());}catch (ArithmeticException e){System.out.println("算术异常" + e.getMessage());}catch (Exception e) {System.out.println(e.getMessage());}finally {}}
}
        5)可以进行try-finally配合使用,这种用法相当于没有捕获异常,因此程序会直接崩掉,finally进行善后工作,
public class TryCatchDetail03 {public static void main(String[] args) {try {int n1 = 10;int n2 = 0;System.out.println(n1 / n2);} finally {System.out.println("执行了finally");}System.out.println("程序继续执行");}
}

 八、try - catch课堂练习

1.     

2.

3.

        注意,这里的catch内的return会在finally执行完毕后返回,而且在执行到return ++i的时候会用一个临时变量temp保存当前的i值,返回的是temp值

所以method确实是返回3

小结

try-catch-finally执行顺序小结

        1)如果没有出现异常,则执行try块中所有语句,不执行catch块中语句,如果有finally,最后还需要执行finally里面的语句

        2)如果出现异常,则try块中异常发生后,try块剩下的语句不再执行。将执行catch块中的语句,如果有finally, 最后还需要执行finally里面的语句

课后练习

        如果用户输入的不是一个整数,就提示他反复输入,直到输入一一个整数为止

使用try catch来控制,再用Integer来获取String转成Int        试试

/*** @author 银海* @version 1.0*/
public class TryCatchExcerise {public static void main(String[] args) {String name = "";Scanner scanner = new Scanner(System.in);while(true){try {System.out.println("请输入一个整数");name = scanner.next();System.out.println("输入的信息为" + name);int num = Integer.parseInt(name);//因为执行到这里如果为错误会报错 下面的语句不会执行 跳转到catch语句块System.out.println("成功获取整数=" + num);break;} catch (NumberFormatException e) {System.out.println("错误信息为" + e.getMessage() + "请重试");continue;//跳到while继续循环}}}
}

九、throws异常处理

1.基本介绍

1)如果一个方法(中的语句执行时)可能生成某种异常,但是并不能确定如何处理这种异常,则此方法应显示地声明抛出异常,表明该方法将不对这些异常进行处理,而由该方法的调用者负责处理。

2)在方法声明中用throws语句可以声明抛出异常的列表(抛出多个异常),throws后面的异常类型可以是方法中产生的异常类型,也可以是它的父类。
 

public class Throw01 {public static void main(String[] args) {}//public void f1() throws Exception{public void f1() throws FileNotFoundException{// public void f1() throws ArithmeticException,NullPointerException{//创建一个文件流对象//这里的异常是FileNotFoundException//这里可以使用两种异常处理方法//1.try catch//2.throws 抛出异常,让调用这个f1方法的调用者(方法)处理//使用throws可以抛给调用者,也可以抛给父类//throws 关键字后也可以是异常列表,即可以抛出多个异常FileInputStream fi = new FileInputStream("e://aa.txt");}
}

2.throws的细节处理和注意事项 

1)对于编译异常,程序中必须处理,比如try-catch或者throws
2)对于运行时异常,程序中如果没有处理,默认就是throws的方式处理

3)子类重写父类的方法时,对抛出异常的规定:子类重写的方法,所抛出的异常类型要么和父类抛出的异常一致, 要么为父类抛出的异常的类型的子类型
class Father{//父类public void method() throws RuntimeException{}
}
class Son extends Father{//子类重写父类的方法时,对抛出异常的规定:// 子类重写的方法,所抛出的异常类型要么和父类抛出的异常一致,要么为父类方法抛出的异常的类型的子类型@Overridepublic void method() throws NullPointerException{//Null 是Runtime 的子类所以没有报错// public void method() throws Exception{//Null 是Runtime 的子类所以没有报错}
}

 如果异常类型不是子类则会报错

4)在throws过程中,如果有方法try-catch,就相当于处理异常,就可以不必throws(二选一)
5)对于调用已经throws的方法,什么都不做会报错异常,需要将调用者(方法)再显式的throws一次

                

注意只要throws就需要再显式调用,不然会报错        

6)对于抛出的是RunTime时的异常,编译器并不会报错,不需要再显式的定义throws

        在java中有默认处理,及JVM默认报错退出程序

public class ThrowsDetail {public static void main(String[] args) throws FileNotFoundException {f1();f4();}public static void f1()throws FileNotFoundException{f3();//抛出异常 因为这个f3()方法抛出的是编译异常// 即这时要求f1也必须显式的处理这个编译异常可以throw抛给父类}public static void f3()throws FileNotFoundException{// FileInputStream fi = new FileInputStream("e://aa.txt");}public static void f4(){f5();}public static void f5() throws RuntimeException{//对于抛出的是RunTime时的异常,f4调用f5编译器并不会报错,不需要再显式的定义throws}
}
class Father{//父类public void method() throws RuntimeException{}
}
class Son extends Father{//子类重写父类的方法时,对抛出异常的规定:// 子类重写的方法,所抛出的异常类型要么和父类抛出的异常一致,要么为父类方法抛出的异常的类型的子类型@Overridepublic void method() throws NullPointerException{//Null 是Runtime 的子类所以没有报错// public void method() throws Exception{//Null 是Runtime 的子类所以没有报错}
}

十、自定义异常

基本概念

当程序中出现了某些"错误”,但该错误信息并没有在Throwable子类中描述处理,这个时候可以自己设计异常类,用于描述该错误信息。

自定义异常步骤

自定义异常的步骤

1)定义类:自定义异常类名(程序员自己写)继承Exception或RuntimeException

2)如果继承Exception,属于编译异常

3)如果继承RuntimeException,属于运行异常(一般来说,继承RuntimeException)
 

public class CustomException {public static void main(String[] args) {int age = 0;if (!(age >= 18&& age <= 120)) {throw new AgeException("年龄需要在18~120之间");}}
}
//一般继承RuntimeException,把自定义异常做成自定义异常,我们可以使用默认的处理机制
class AgeException extends RuntimeException{public AgeException(String message){super(message);}
}

十一、throw

1.throw和throws的区别

throw表示扔出具体的异常对象,而throws扔出的是异常类型

2.throw的课堂练习

十二、异常的课后练习

1.

a)编写应用程序EcmDefjava,接收命令行的两个参数(整数),计算两数相除。

b)计算两个数相除,要求使用方法cal(int n1, int n2)

c)对数据格式不正确、缺少命令行参数、除0进行异常处理。

 public class Homework01 {public static void main(String[] args) {//验证输入的个数是否正确try {if(args.length != 2){throw new ArrayIndexOutOfBoundsException("数组长度异常");}int n1 = Integer.parseInt(args[0]);int n2 = Integer.parseInt(args[1]);double res = cal(n1,n2);//该方法可能抛出算术异常System.out.println("算术结果是" + res);} catch (ArrayIndexOutOfBoundsException e){System.out.println("参数个数不对");}catch (NumberFormatException e) {System.out.println("参数格式不对,请输入整数");}catch (ArithmeticException e){System.out.println("出现除数为0");}}public static double cal(int n1,int n2){return n1/n2;}
}

 用IDEA多了 命令控制台生疏了,编了几次都是无法加载类名,因为有全限定名在所以定位不到该class文件,更改一下即可参考 Java命令行运行错误: 找不到或无法加载主类_明月几时有666的博客-CSDN博客

2.

3.

4.

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

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

相关文章

Python 编写 Flink 应用程序经验记录(Flink1.17.1)

目录 官方API文档 提交作业到集群运行 官方示例 环境 编写一个 Flink Python Table API 程序 执行一个 Flink Python Table API 程序 实例处理Kafka后入库到Mysql 下载依赖 flink-kafka jar 读取kafka数据 写入mysql数据 flink-mysql jar 官方API文档 https://nigh…

汇编学习(1)

汇编、CPU架构、指令集、硬编码之间的关系 ● 汇编语言&#xff1a;这是一种低级语言&#xff0c;用于与硬件直接交互。它是由人类可读的机器码或指令组成的&#xff0c;这些指令告诉CPU如何执行特定的任务。每条汇编指令都有一个对应的机器码指令&#xff0c;CPU可以理解和执…

css属性clip-path的使用说明

前言 当ui设计上的图片、div等的形状不是长方形&#xff0c;而是多边形的时候&#xff0c;就可以借助clip-path这个css属性来实现。 clip-path CSS 属性使用裁剪方式创建元素的可显示区域。区域内的部分显示&#xff0c;区域外的隐藏。【from: MDN】 clip-path可以理解为一把剪…

Spring Cloud学习:二【详细】

目录 Nacos的配置 Nacos的单机启动 服务注册 Nacos服务分级存储模型 优先访问同集群的服务 根据权重负载均衡 环境隔离Namespace Nacos调用流程 Nacos与Eureka注册对比 Nacos与Eureka的共同点 Nacos与Eureka的区别 Nacos配置管理 统一配置 配置自动刷新 多环境配…

python自动化测试平台开发:自动化测试平台简介

一.测试平台简介 为什么需要测试平台 已有的开源测试平台不能满足需要&#xff0c;不要轻易造轮子 需要公司级别的定制 需要整合公司内部的多套平台 例子&#xff1a;DevOps平台、精准化测试平台、质量监控平台等等 常见的测试平台开发模式 大一统模式&#xff08;适合简单的…

从瀑布模式到水母模式:ChatGPT如何赋能软件研发全流程【文末送书五本】

从瀑布模式到水母模式&#xff1a;ChatGPT如何赋能软件研发全流程 前言内容简介购买链接作者简介专家推荐读者对象参与方式往期赠书回 &#x1f3d8;️&#x1f3d8;️个人简介&#xff1a;以山河作礼。 &#x1f396;️&#x1f396;️:Python领域新星创作者&#xff0c;CSDN实…

【C】关于动态内存的试题及解析

目录 第1题&#xff1a; 第2题&#xff1a; 第3题&#xff1a; 第4题&#xff1a; 第5题&#xff1a; 在学习了关于动态开辟内存的相关知识后&#xff0c;下面是一些涉及到动态开辟内存程序的试题及解析&#xff08;试题部分来自《高质量的C/C编程》、笔试题&#xff09;。 第1…

(1)(1.9) HC-SR04声纳

文章目录 前言 1 连接到自动驾驶仪 2 参数说明 前言 HC-SR04 声纳是一种价格低廉但量程很短&#xff08;最远只有 2m&#xff09;的测距仪&#xff0c;主要设计用于室内&#xff0c;但也成功地在室外的 Copter 上使用过。极短的测距范围使其用途有限。 &#xff01;Warning…

移远通信5G RedCap模组拿下首个中国移动5G物联网开放实验室5G及轻量化产品能力认证

10月21日&#xff0c;在2023世界物联网博览会期间&#xff0c;中国移动举办了以“智融万物 创见未来”为主题的物联网开发者大会暨物联网产业论坛。作为中国移动在物联网领域重要的合作伙伴&#xff0c;移远通信应邀参加论坛。 随着千行百业数智化进程的不断加速&#xff0c;5G…

酷开科技依托酷开系统推动家庭智能化加速发展

为什么越来越多的人会选择智能家居&#xff1f;因为智能家居的出现&#xff0c;大大方便了我们的生活&#xff0c;为生活提供便利舒适的体验&#xff1b;就如同洗衣机与洗碗机解放了我们的双手是一样的道理&#xff0c;智能家居是在生活的方方面面为我们提供更加便利化的可能性…

java代码审计-换行符CRLF注入

CRLF 的缩写是指回车和换行操作&#xff0c;其中 CR 为 ASCII 中的第 13 个字符&#xff0c;也 写作 \r , LF 是 ASCII 中的第 10 个字符&#xff0c;也写作 \n &#xff0c;因此 CRLF 一般翻译为回车换行注入漏洞。 什么是CRLF注入漏洞? CRLF 即【回车\r换行\n】的简…

找游戏外包开发游戏,有哪些好处呢?

游戏外包开发是将游戏开发的一部分或全部工作交给专业的外部开发团队或公司完成的做法。这种方法有许多潜在的好处&#xff0c;包括&#xff1a; 降低成本&#xff1a;游戏外包通常可以降低游戏开发成本&#xff0c;因为外包开发公司通常可以提供更具竞争力的价格。这是因为它…

【2023CANN训练营第二季】——通过一份入门级算子开发代码了解Ascend C算子开发流程

本次博客讲解的代码是Gitee代码仓的Ascend C加法算子开发代码&#xff0c;代码地址为&#xff1a; quick-start 打开Add文件&#xff0c;可以看到文件结构如下&#xff1a; 其中add_custom.cpp是算子开发的核心文件&#xff0c;包括了核函数的实现&#xff0c;展示了如何在Asc…

Spring Cloud之负载均衡与服务调用(Ribbon)

目录 Ribbon 简介 负载均衡 简介 负载均衡方式 服务端负载均衡 工作原理 特点 客户端负载均衡 工作原理 特点 对比 实现 负载均衡策略 切换负载均衡策略 定制负载均衡策略 超时与重试 单个服务配置 全局配置 服务调用 示例 Ribbon 简介 Ribbon 是 Netfli…

WEB使用百度地图展示某地地址

第一步 进入百度地图开发平台 百度地图开放平台 | 百度地图API SDK | 地图开发 第二步注册 获取AK秘钥&#xff0c;点击【创建应用】进入AK申请页面&#xff0c;填写应用名称&#xff0c;务必选择AK类型为“浏览器端”&#xff0c;JS API只支持浏览器端AK进行请求与访问 下面…

最小二乘法,可视化UI界面

import tkinter as tk import numpy as np import matplotlib.pyplot as plt from matplotlib.backends.backend_tkagg import FigureCanvasTkAgg from pylab import mplmpl.rcParams[font.sans-serif] [FangSong] # 指定默认字体 mpl.rcParams[axes.unicode_minus] False …

雪糕冰淇淋经营配送小程序商城效果如何

雪糕冰淇淋是很多年轻人喜欢的食品之一&#xff0c;市面上的雪糕品牌类型众多&#xff0c;销售模式主要为厂家批发、经销商零售等&#xff0c;由于雪糕冰淇淋的易化性&#xff0c;很多用户会选择就近购买&#xff0c;但制作技术升级和长途冷藏技术下&#xff0c;网购成为另一种…

VB.NET 三层登录系统实战:从设计到部署全流程详解

目录 前言&#xff1a; 什么是三层 为什么要用到三层: 饭店→软件 理解: 过程: 1.三层包图: 2.数据库 3.三层项目 4.用户界面 5.添加引用 代码实现: Entity层 BLL层 DAL层 UI层 总结: 前言&#xff1a; 什么是三层 三层就是把各个功能模块划分为表示层&#…

【从瀑布模式到水母模式】ChatGPT如何赋能软件研发全流程

文章目录 &#x1f384;前言&#x1f354;本书概要&#x1f33a;内容简介&#x1f33a;作者简介&#x1f33a;专家推荐&#x1f6f8;读者对象&#x1f354;彩蛋 &#x1f384;前言 计算机技术的发展和互联网的普及&#xff0c;使信息处理和传输变得更加高效&#xff0c;极大地…

安全和便捷:如何将运营商二要素API应用于实名制管理中

引言 随着互联网的快速发展&#xff0c;数字化身份验证和实名制管理变得越来越重要。在金融、电子商务、社交媒体等领域&#xff0c;确保用户身份的安全和准确性至关重要。运营商二要素核验API成为了实名制管理的有力工具&#xff0c;它不仅能够提供高水平的安全性&#xff0c…