【学习笔记】JAVA基础——异常处理部分

文章目录

  • 前言
  • 简介
  • 一. try、catch与finally
    • ① try && catch
    • ② finally
    • ③ throws
      • 补充:JVM 相关
  • 二. 异常的分类
    • ① 分类解释与思维导图
  • 三. 自定义异常
    • 例子:Hero类的attack方法的isDeadException。
  • 四. 上传代码到GIT
    • ① 首先在github新建一个仓库Java_Exception_Learn。
    • ② 然后在IDEA的项目中设置

前言

摸鱼了几天,重新开始学习= =。

这次是摸回JAVA基础的异常控制。之前一直都是直接用的IDEA的自动补全异常语句,但是隐约觉得这玩意还是得好好学习,所以今天抽空补补课。

学习网站是how2j,顺便复习复习IDEA上传到GIT的操作。(‾◡◝)

代码上传到git上了

简介

异常的定义:导致程序的正常流程被终端的事件。

为啥要整这玩意:进行某个程序操作时,可能是一个潜在的错误操作,如果不预先做好异常处理,那么就会导致编译错误。

一. try、catch与finally

① try && catch

  • 一个try对应一或多个catch。
  • try的代码块中只要遇到一个异常,就会直接中断。
  • 一组try && catch语句一般情况下只能抛出一个异常:因为遇到一个异常时,try代码块的运行就会直接中断,后面的触发异常语句不会被运行。不过可以通过其他方法来抛出多个异常,此处不展开说明。
  • Exception类是所有异常类的父类。
    因此,可以直接catch(Exception e),但是只限于只有一种异常的情况。
  • 多异常代码块的处理:多个catch、一个catch

以上内容及更多内容可见以下两份代码块内容

public class one {public static void main(String[] args){// 此处不会报错,因为此时f只是一个定义了文件路径的File类,并没有真正访问这个路径File f = new File("/Users/fwy/Downloads/jojo.jpg");try{System.out.println("试图打开不存在的文件jojo.jpg");new FileInputStream(f);System.out.println("成功打开");// }catch (FileNotFoundException e){ // FileNotFoundException:文件不存在 异常}catch (Exception e){ // Exception:所有异常的父类,可以直接用于捕捉异常。System.out.println("jojo.jpg不存在噢!");// printStackTrace():这玩意是用来打印方法的调用痕迹的// 控制台的橙色部分就是该函数的打印内容// 在此例子中打印出了异常起始位置为第15行e.printStackTrace();// 打印 堆栈 痕迹}}
}
// 多异常捕捉
public class two {public static void main(String[] args){// 方法一:分别对不同异常进行catchFile f = new File("/Users/fwy/Downloads/QAQ.jpg");try{System.out.println("试图打开不存在的文件QAQ.jpg");new FileInputStream(f);System.out.println("成功打开!");int[] arr = new int[10];System.out.println(arr[10]);// 实际上只能捕捉到一个异常,捕捉到异常后就会直接中断// 比如本例中运行到18行就会直接中断,数组越界部分不会涉及到} catch (FileNotFoundException e){System.out.println("文件不存在");e.printStackTrace();} catch (IndexOutOfBoundsException e){System.out.println("数组访问越界");e.printStackTrace();}// 方法二:直接放在同一个catch里f = new File("/Users/fwy/Downloads/QVQ.jpg");try{System.out.println("试图打开存在的文件QVQ.jpg");new FileInputStream(f);System.out.println("成功打开!");int[] arr = new int[10];System.out.println(arr[10]);} catch (FileNotFoundException | IndexOutOfBoundsException e){// 格式为 Exception1 | Exception2 e, IDE可以报出具体错误// 使用 instanceof 来区分异常,用于进行不同异常的处理if (e instanceof FileNotFoundException)System.out.println("文件不存在");else if (e instanceof IndexOutOfBoundsException)System.out.println("数组访问越界");e.printStackTrace();}}
}

② finally

  • 可以不写
  • 无论如何最后都会被执行

③ throws

  • throw与throws区别:
    throws:用于方法声明,代表异常出现的可能性,不一定会发生。
    throw: 出现于方法体内,实际上地抛出了异常对象
  • throws的使用情况:
    方法一调用方法二,方法二有异常但是选择不处理,而是抛出给方法一,让方法一处理。
    理解起来可能比较绕,可以参考以下代码:
    这里是主函数调用方法一,方法一调用方法二的嵌套关系。
    方法二出现异常后,由于方法二老渣男了,不想处理这个麻烦玩意,所以直接抛出给方法一。
    方法一也不想当老实人,但是无奈打不过主函数,所以不能抛出给主函数,只能自己默默处理。
public class three {// 同样不处理异常public static void main(String[] args){method1();/*try{method1();} catch (FileNotFoundException e){e.printStackTrace();}*/}// 选择在method1中处理异常private static void method1() //throws FileNotFoundException{//method2();try{method2();} catch (FileNotFoundException e){e.printStackTrace();}}// 不处理异常,而是抛出异常private static void method2() throws FileNotFoundException{File f = new File("/Users/fwy/Downloads/QAQ.jpg");System.out.println("试图打开不存在的文件QAQ.jpg");new FileInputStream(f);System.out.println("成功打开");}
}

不过其实我们也可以选择方法一继续抛出给主函数,最终只要有一个地方进行try-catch的异常处理即可。

补充:JVM 相关

  • 抛出异常语句(throw)都是通过 athrow 指令来实现(指令码)。抛指令
  • 异常捕获语句(catch)早期也是指令,但现在是通过异常表实现。抓打表

二. 异常的分类

① 分类解释与思维导图

  • Exception是所有异常的父类,Throwable是Exception和Error的父类
  • Exception 异常:是程序本身可以处理的异常
  • Error 错误:是程序无法处理的错误,大多为JVM出现的问题
  • Throwable可以被throws抛出,但是catch的也要是Throwable类
// 异常分类:1. 可查异常
//         2. 非可查异常:a.运行时异常  b.错误
public class one {public static void main(String[] args){// 1. 可查异常 CheckedException:必须处理的异常,catch | throws,否则编译错误//    比如FileNotFoundExceptionFile f = new File("/Users/fwy/Downloads/QAQ.jpg");try{new FileInputStream(f);System.out.println("打开成功");}catch (FileNotFoundException e){e.printStackTrace();}// 2. 运行时异常 RuntimeException:不是必须处理的异常,不用catch | throws也可以编译//    比如NullPointException,ArrayIndexOutOfBoundsException等//    设计原因:Java中此类错误太过普遍,都进行捕捉的话,代码可读性不好int k = 5/0;String s = null;s.length();// 3. 错误 Error:系统级别的异常,通常是内存溢出。同2一样不要求强制捕捉StringBuffer sb = new StringBuffer();for (int i = 0; i < Integer.MAX_VALUE; i++){// 不断增加字符导致内存用光,OutOfMemoryErrorsb.append('a');}}
}

思维导图
图源how2j

图片截自how2j

三. 自定义异常

定义:自定义一个异常类,继承Exception。
用途:用于自定义类中需要的异常,比如定义银行卡类,取款时可以抛出余额不足异常。

  • 有参构造与无参构造:见代码,主要是Exception的getMessage()的使用。
class Hero{String name;float hp;Hero(String name,float hp){this.name = name;this.hp=hp;}public void attack(Hero h) throws HeroIsDeadException{if(h.hp == 0)throw new HeroIsDeadException(h.name + "已经死了,别鞭尸了"); //使用throw而非throws抛出异常}class HeroIsDeadException extends Exception{public HeroIsDeadException() { } // 默认构造,信息更少,但是更方便public HeroIsDeadException(String msg) // 有参构造,导入异常原因,分析异常更方便{super(msg); // 可以使用getMessage()函数来获取具体异常信息}}
}public class one {public static void main(String[] args){Hero garen = new Hero("盖伦",600);Hero teemo = new Hero("提莫",0);try{garen.attack(teemo);}catch (Hero.HeroIsDeadException e){System.out.println("异常的具体原因:" + e.getMessage());e.printStackTrace();}}
}

例子:Hero类的attack方法的isDeadException。

四. 上传代码到GIT

说明:记录一下操作步骤= =,还是不太熟悉。

① 首先在github新建一个仓库Java_Exception_Learn。

然后得到这个仓库的地址(URL),用于IDEA中设置

② 然后在IDEA的项目中设置

  • VCS - 导入到版本控制 - 创建Git存储库:选择要上传的项目
  • 右键项目 - Git - 添加
  • 右键项目 - Git - Commit目录… :弹出窗口,在提交信息输入想备注的东西,然后Commit
  • 继续弹出窗口,点击定义远程,在URL中输入步骤①的URL即可

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

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

相关文章

【学习笔记】数据链路层的差错控制——检错编码与纠错编码(海明码、奇偶检验码与CRC循环冗余码)

文章目录前言一. 差错控制简介二.补充知识三. 检错编码&#xff08;1&#xff09;奇偶检验码组成&#xff1a;构造方法&#xff1a;以奇检验码为例。举个例子&#xff1a;检验码求法&#xff1a;错误检测方法&#xff1a;特点&#xff08;2&#xff09;CRC循环冗余检验码三要素…

【学习笔记】数据链路层——流量控制:停止等待协议、后退N帧协议(GBN)、选择重传协议(SR)

文章目录一. 流量控制① 必要性② 数据链路层 VS 传输层③ 定义④ 方法1&#xff09;停止等待协议2&#xff09;滑动窗口协议关系&#xff1a;包括&#xff1a;3&#xff09;协议对比二. 停止-等待协议必要性应用情况① 无差错情况② 有差错情况1&#xff09;数据帧丢失&#x…

java线程唤醒与等待_Java线程的等待与唤醒

生产者和消费者必须使用同步代码块包裹起来&#xff0c;保证等待和唤醒只能有一个执行&#xff0c;同步使用的锁对象必须保证唯一Thread中重要方法void wait() 在其他线程调用此对象的notify()方法或notifyall()方法前&#xff0c;导致当前线程等待void notify() 唤醒在此对象监…

【学习笔记】数据链路层——信道划分访问控制(FDM、TDM、STDM、WDM、CDM CDMA)

PPT截自王道考研B站教程 一. 铺垫知识 ① 传输数据使用的两种链路 星型、总线型都是广播式结构。 星型更有容错率&#xff0c;总线型断一个则全断。 ② 介质访问控制 定义 采取一定措施&#xff0c;使得两对节点之间的通信不会发生互相干扰的情况。 分类 多路复用&…

【学习笔记】数据链路层——随机访问介质访问控制(ALOHA、CSMA、CSMA/CD、CSMA/CA),截断二进制指数规避算法

文章目录小前言一. ALOHA协议纯ALOHA协议时隙ALOHA协议ALOHA对比CSMA协议定义与分类① 1-坚持CSMA② 非坚持CSMA③ p-坚持CSMA总结CSMA/CD协议传播时延对载波监听的影响确定重传时机&#xff1a;截断二进制指数规避算法最小帧长问题CSMA/CA协议工作原理CSMA/CD 与 CSMA/CA的对比…

pca算法介绍及java实现_PCA算法原理及实现

众所周知&#xff0c;PCA(principal component analysis)是一种数据降维的方式&#xff0c;能够有效的将高维数据转换为低维数据&#xff0c;进而降低模型训练所需要的计算资源。以上是比较官方的说法&#xff0c;下面是人话(正常人讲的话)版。pca就是一种能够有效压缩数据的方…

【学习笔记】数据链路层——轮询访问介质控制(轮询协议、令牌传递协议)

文章目录一. 轮询访问介质控制二. 轮询协议三. 令牌传递协议结束语PPT截自王道考研B站教程 一. 轮询访问介质控制 结合了前面的信道划分访问控制、随机访问MAC协议的优点&#xff1a; 既要不产生冲突&#xff0c;又要发送时占全部带宽。 二. 轮询协议 轮询开销&#xff1a;…

【学习笔记】局域网基本概念和体系结构,以太网、无线局域网与PPP协议、HDLC协议

文章目录一. 局域网&#xff1a;特点与要素① 拓扑结构② 传输介质③ 介质访问控制方法④ 局域网的分类⑤ IEEE 802标准⑥ MAC子层和LLC子层二. 以太网① 概述② 提供无连接、不可靠的服务③ 传输介质与拓扑结构的发展④ 10BAST-T以太网⑤ 适配器与MAC地址⑥ 以太网MAC帧⑦ 高速…

【学习笔记】数据链路层——链路层设备:物理层拓展以太网、链路层拓展以太网与冲突域和广播域

文章目录一. 冲突域与广播域① 定义与对比图② 例子二. 物理层扩展以太网三. 链路层扩展以太网① 网桥定义透明网桥源路由网桥② 以太网交换机PPT截自B站王道考研教程 本文内容导图 一. 冲突域与广播域 可以先只是简单看看定义&#xff0c;然后看完二、三后再回来看对比图和…

【学习笔记】网络层——概述、数据交换方式:电路交换、报文交换与分组交换(数据报与虚电路)

文章目录一. 概述二. 数据交换方式① 电路交换② 报文交换③ 分组交换④ 分组交换 && 报文交换举例对比⑤ 三种数据交换方式比较总结三. 分组交换的两种方式① 定义传输单元名词辨析② 数据报③ 虚电路④ 数据报与虚电路的对比ppt截自王道考研B站教程 太不容易了&#…

【学习记录】网络层——IP数据报(格式与分片)

文章目录一. IP数据报格式二. IP数据报分片① 为什么要分片?② 标识、标志与片偏移③ 例题单位为nB小结PPT截自王道考研教程 tips&#xff1a;b是位&#xff0c;B是字节。 一. IP数据报格式 在本章节中&#xff0c;暂时不区分IP数据报与分组。 生存时间(Time To Live)&#xf…

自动驾驶学习笔记(二十二)——自动泊车算法

#Apollo开发者# 学习课程的传送门如下&#xff0c;当您也准备学习自动驾驶时&#xff0c;可以和我一同前往&#xff1a; 《自动驾驶新人之旅》免费课程—> 传送门 《Apollo开放平台9.0专项技术公开课》免费报名—>传送门 文章目录 前言 感知算法 定位算法 规划算法…

【学习笔记】 IPv4地址、NAT与子网掩码、子网划分

文章目录一. IP地址① 在例子中理解③ IP地址的分类④ 特殊IP地址⑤ 私有IP地址⑥ 各类IP的对比二. NAT三. 子网划分与子网掩码① 子网划分② 子网掩码例题1例题2③ 使用子网时路由的转发PPT截自王道考研教程 一. IP地址 可以理解成上网设备的身份证号唯一点分十进制&#xff…

java对象底层原存储结构图解_图解图库JanusGraph系列-一文知晓“图数据“底层存储结构...

大家好&#xff0c;我是洋仔&#xff0c;JanusGraph图解系列文章&#xff0c;实时更新~图数据库文章总目录&#xff1a;转载文章请保留以下声明&#xff1a;一&#xff1a;存储模式留言或私信我&#xff0c;邀请你加入“图数据库交流”微信群&#xff01;1、图内容本文以下所有…

【学习笔记】网络层——无分类编址CIDR、ARP协议、DHCP协议和ICMP协议

文章目录一. CIDR① 定义② 构成超网③ 最长前缀匹配二. ARP协议① 定义② 例题三. DHCP协议① 主机如何获取IP②DHCP协议四. ICMP协议① ICMP差错报告报文类型&#xff08;5种&#xff09;数据字段不发送的情况② ICMP询问报告报文类型应用一. CIDR ① 定义 在点分十进制后加…

【学习笔记】网络层——IPv6:地址表示、IPv4的对比、IPv4过渡到IPv6、基本地址类型等

文章目录一.1) 为什么要有IPv62&#xff09;数据报格式3&#xff09;IPv4和IPv6的区别4&#xff09;IPv6地址表示形式5&#xff09;IPv6基本地址类型6&#xff09;IPv4到IPv6的过渡方法一. 1) 为什么要有IPv6 CIDR、NAT只是缓解IPv4空间殆尽&#xff0c;治标不治本。 而IPv6可…

【学习笔记】网络层——网络层设备、移动IP、IP组播

文章目录一. 网络层设备1&#xff09;三层设备的区别2&#xff09;路由表与路由转发二. 移动IP① 定义相关术语&#xff1a;实际过程&#xff1a;三. IP组播① IP数据报的三种传输方式② IP组播地址③ IGMP协议与组播路由选择协议网际组管理协议IGMP组播路由选择协议一. 网络层…

larval+mysql+不等于_MySQL学习日记(19)比较运算符

比较运算符比较对象 比较运算符 子查询mysql> SELECT * FROM 运算符例子;----------| id | 数值 |----------| 1 | 1 || 2 | 3 || 3 | 5 || 4 | 7 || 5 | 9 || 6 | 11 || 7 | 13 |----------7 rows in set (0.01 sec)mysql> SELECT * FROM 运算符例子2;----------| id | …

【学习笔记】路由算法与路由协议:RIP协议与距离向量算法、OSPF协议与链路状态算法、BGP协议

文章目录一. 路由算法与路由协议概述① 路由算法的分类② 分层次的路由选择协议二. RIP协议和距离向量算法① RIP协议定义② RIP协议&#xff1a;交换对象、交换周期、交换内容③ 距离向量算法例题1例题2④ RIP协议的报文格式⑤ RIP协议&#xff1a;好消息传得快&#xff0c;坏…

【学习笔记】传输层:概述、UDP协议

文章目录一. 概述1&#xff09;传输层的寻址与接口二. UDP协议1&#xff09;定义2&#xff09;首部格式3&#xff09;UDP检验一. 概述 是主机才有的层次 两个协议&#xff1a;TCP & UDPTCP面向连接&#xff0c;UDP则不是QQ发一条信息(UDP)&#xff1b;发一个大文件(TCP&am…