JavaSE学习——异常

目录

一、异常概述

二、异常的体系结果

二、异常的处理:抓抛模型

三、try-catch-finally的使用

四、throws + 异常类型  的使用

五、开发中如何选择使用try-catch-finally还是使用throws?

六、自定义异常

自定义异常步骤:

七、总结:异常处理5个关键字 

八、面试题:


一、异常概述

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

java程序在执行过程中所发生的异常事件可分为两类:

Error:Java虚拟机无法解决的严重问题。如:JVM系统内部错误、资源耗尽等严重情况。比如:StaticOverflowError和OOM。一般不边写针对性的代码进行处理。

Exception:其它因编程错误或偶然的外在因素导致的一般性问题,可以使用针对性的代码进行处理。例如:

  • 空指针访问
  • 视图读取不存在的文件
  • 网络连续中断
  • 数组角标越界

对于这些错误,一般有两种解决方法:一是遇到错误就终止程序的运行。另一种方法是由程序员在编写程序时,就考虑到错误的检测、错误消息的提示,以及错误的处理。

捕获错误最理想的是在编译期间,但有的错误只有在运行时才会发生。比如:除数为0,数组下标越界等。 

二、异常的体系结果

二、异常的处理:抓抛模型

过程一:“抛”

        程序在正常执行的过程中,一旦出现异常,就会在异常代码处生成一个对应异常类的对象。并将此对象抛出。一旦抛出对象以后,其后的代码就不再执行。

        关于异常对象的产生:(1)系统自动生成的异常对象

                                            (2)手动地生成一个异常对象,并抛出(throw)

过程二:“抓”

        异常的两种处理方式:1.try-catch-finally    2.throws

三、try-catch-finally的使用

try{

        // 可能出现异常的代码

}catch(异常类型1 变量名1){

        // 处理异常的方式1

}catch(异常类型2 变量名2){

        // 处理异常的方式1

}catch(异常类型3 变量名3){

        // 处理异常的方式3

}

......

fianlly{

        // 一定会执行的代码

}

说明:

1.finally是可选的。

2.使用try将可能出现异常代码包装起来,在执行过程中,一旦出现异常,就会生成一个对应异常类的对象,根据此对象的类型,去catch中进行匹配。

3.一旦try中的异常对象匹配到某一个catch时,就进入catch中进行异常的处理。一旦处理完成,就跳出当前的try-catch结果(在没有写finally的情况),继续执行其后的代码。

4.catch中的异常类型如果没有子父类关系,则谁声明在上,谁声明在下无所谓。

   catch中的异常类型如果满足子父类关系,则要求子类一定声明在父类的上面,否则报错。

5.常用的异常对象处理方式,(1)String getMessage()   (2)printStackTrace()

6.在try结构中声明的变量,在出了try结构以后,就不能再被调用。

7.使用try-catch-finally处理编译时异常,使得程序在编译时就不再报错,但是运行时仍可能报错。相当于我们使用try-catch-finally将一个编译时可能出现的异常,延迟到运行时出现。

8.try-catch-finally结构可以相互嵌套。

   @Testpublic void test2() {FileInputStream fis = null;try {File file = new File("hello.txt");fis = new FileInputStream(file);int data = fis.read();while (data != -1) {System.out.println((char) data);data = fis.read();}} catch (FileNotFoundException e) {e.printStackTrace();} catch (IOException e) {e.printStackTrace();} finally {try {if (fis != null)fis.close();} catch (IOException e) {e.printStackTrace();}}}

9.finally的使用:

(1)finally是可选的。

(2)finally中声明的是一定会被执行的代码。即使catch中又出现异常了,try中有return语句,catch中有return语句等情况。

(3)像数据库连接、输入输出流、网络编程Socket等资源,JVM是不能自动回收的,我们需要自己手动地进行资源的释放。此时的资源释放,就需要声明在finally中

10.开发中,由于运行时异常比较常见,所以我们通常就不针对运行时异常编写try-catch-finally了。针对于编译时异常,一定要考虑异常的处理。

四、throws + 异常类型  的使用

public static void main(String[] args){try{method();}catch(IOException e){e.printStackTrace();}
}public static void method() throws IOEception{test3();
}public static void test3() throws FileNotFoundException, IOException {File file = new File("hello.txt");FileInputStream fis = new FileInputStream(file);int data = fis.read();while (data != -1) {System.out.println((char) data);data = fis.read();}fis.close();}

1."throws+异常类型"写在方法的声明处。指明此方法执行时,可能会抛出的异常类型。

一旦当方法体执行时,出现异常,仍会在异常代码处生成一个异常类的对象,此对象满足throws后异常类型时,就会被抛出。异常代码后续的代码,就不再执行!

2.try-catch-finally:真正地将异常给处理掉了。

   throws的方式知识将异常抛给了方法的调用者,并没有真正将异常处理掉。

五、开发中如何选择使用try-catch-finally还是使用throws?

1.如果父类中被重写的方法没有throws方式处理异常,则子类重写的方法也不能使用throws,意味着如果子类重写的方法中有异常,必须使用try-catch-finally方式处理

2.执行的方法a中,先后有调用了另外的几个方法,这几个方法是递归关系执行的。建议这几个方法使用throws的方式进行处理。而执行的方法a可以考虑使用try-catch-finally方式进行处理。

3.通常情况下,建议在方法内部使用try-catch-finally来捕获和处理异常,以提供更精确的异常处理逻辑,并在可能发生异常的地方立即进行处理。而将异常向上层方法抛出则是相对较少使用的情况,通常用于在当前方法无法处理异常或无法提供合适的异常处理逻辑时。

六、自定义异常

自定义异常步骤:

1.一般地,用户自定义异常类都是RuntimeException的子类。

2.自定义异常类通常需要编写几个重载的构造器。

3.自定义异常需要提供serialVersionUID

4.自定义的异常通过throw抛出。

5.自定义异常最重要的是异常类的名字,当异常出现时,可以根据名字判断异常类型。

public class MyException extends RuntimeException {static final long serialVersionUID = -70489991561564898L;public MyException() {}public MyException(String message) {super(message);}
}
public class StudentTest {public static void main(String[] args) {try {Student student = new Student();student.regist(-2);System.out.println(student);} catch (Exception e) {System.out.println(e.getMessage());}}
}class Student {private int id;public void regist(int id) {if (id > 0) {this.id = id;} else {
//            throw new RuntimeException("您输入的数据非法!");throw new MyException("您输入的数据非法!");}}
}

 输出结果:

public class EcmDef {public static void main(String[] args) {try {int i = Integer.parseInt(args[0]);int j = Integer.parseInt(args[1]);int result = ecm(i, j);System.out.println(result);} catch (NumberFormatException e) {System.out.println("数据类型不一致!");} catch (ArrayIndexOutOfBoundsException e) {System.out.println("缺少命令行参数");} catch (ArithmeticException e) {System.out.println("除以0");} catch (EcDef e) {System.out.println(e.getMessage());}}public static int ecm(int i, int j) throws EcDef {if (i < 0 || j < 0) {throw new EcDef("分子或分母为负数了!");}return i / j;}

七、总结:异常处理5个关键字 

 

八、面试题:

throw与throws的区别?

throw:抛出异常。用来抛出一个具体的异常(自己定义异常的行为)

1.在方法体的内部,用在方法体后面抛出的是异常的对象

2.只能抛出一个异常对象名

3.表示抛出的异常,有方法体中的语句来进行处理

4.throw表示一定抛出了某种异常
throws:声明异常。在写方法时候用于给自己声明检查异常,可以不用做任何处理,直接往上面抛,谁来调用谁就来处理。

1.在方法声明的后面,抛出的是异常的类型

2.可以包含有多个异常类型,用“,”隔开

3.抛出的异常由调用者来进行处理

4.throws表示可能抛出了某种异常。 

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

如若内容造成侵权/违法违规/事实不符,请联系瞎胡闹网进行投诉反馈,一经查实,立即删除!

相关文章

CAN总线学习——物理层、数据链路层、CANopen协议

1、CAN总线介绍 1.1、CAN总线描述 (1)CAN总线支持多节点通信&#xff0c;但是节点不分区主从&#xff0c;也就是不存在一个节点来负责维护总线的通信&#xff1b;这点可以和I2C总线对对比&#xff0c;I2C是一主多从模式&#xff1b; (2)是差分、异步、串行总线&#xff0c;采用…

MybatisPlus拦截器实战之数据的加解密和脱敏

文章目录 一、前言二、拦截器简介三、代码目录结构简介四、核心代码讲解4.1 application.yml文件4.2 自定义注解4.2.1 SensitiveEntity4.2.2 SensitiveData4.2.3 MaskedEntity4.2.4 MaskedField4.2.5 MaskedMethod 4.3 Mybatis-Plus 拦截器数据自动加密4.4 Mybatis 打印完整sql…

ChromeOS 的 Linux 操作系统和 Chrome 浏览器分离

导读科技媒体 Ars Technica 报道称&#xff0c;谷歌正在将 ChromeOS 的浏览器从操作系统中分离出来 —— 让它变得更像 Linux。虽然目前还没有任何官方消息&#xff0c;但这项变化可能会在本月的版本更新中推出。 据介绍&#xff0c;谷歌将该项目命名为 "Lacros"——…

strcat函数

目录 函数介绍&#xff1a; 函数声明&#xff1a; 具体使用&#xff1a; 注意事项&#xff1a; 字符串⾃⼰给⾃⼰追加&#xff0c;如何&#xff1f; 模拟实现strcat函数&#xff1a; 函数介绍&#xff1a; 被称为字符串的追加/链接函数&#xff0c;它的功能就是在一个字符…

【LeetCode-中等题】19. 删除链表的倒数第 N 个结点

文章目录 题目方法一&#xff1a;节点加入集合找索引方法二&#xff1a;直接计算长度,然后找出要删除的节点的前一个节点方法三&#xff1a;栈方法四&#xff1a;前后双指针 题目 这题的关键在与两个点 一定要设置一个哑结点&#xff0c;防止删除第一个元素时&#xff0c;导致空…

技能按钮CD效果

废话不多说&#xff0c;直接上代码&#xff01; using System; using System.Collections; using System.Collections.Generic; using UnityEngine; using UnityEngine.UI;public class Skill : MonoBehaviour//技能 {Button but;//技能按钮 Button组件Image img;//CD遮罩图片…

雷电模拟器9.0.56安装Magisk+LSPosd

雷电模拟器9.0.56安装MagiskLSPosd 一.准备软件1.MagiskLSPosd 我会放在文档资源那给你买下载2.雷电模拟器可以直接官网下载&#xff08;我这里最新9.0.56版本&#xff09;[https://www.ldmnq.com/](https://www.ldmnq.com/) 二.开始安装1. 先配置好模拟器2.安装软件3.配置 Mag…

挖数据四周年庆典,壕礼不断,惊喜不停!

挖数据四周岁啦&#xff01;为了感谢广大用户们一路以来的支持与陪伴&#xff0c;我们特地准备了丰富的优惠活动&#xff0c;希望能够用最实际的行动来回馈您们的厚爱。四年的成长与蜕变&#xff0c;都是因为有您们的陪伴与鼓励&#xff0c;我们期待与您们一同分享这份喜悦与成…

当面临在职备考不确定性的结果时,你可能需要闭着眼冲一下

提前批面试在某种程度上像是联考分流幕后的那只无形之手&#xff0c;既助长了拿到优秀资格考生的备考热情&#xff0c;又打击了提面落榜考生的笔试自信心。就在这样的局面下&#xff0c;使得项目最终完成了联考前的分流操作。但如果你还是遵从自己的本心的话&#xff0c;就应该…

电脑编程自学(零基础自学编程怎么入门)

电脑编程自学入手:确定编程学习的方向。编程语言有多种:php,C++,C,C#,JAVA,Python等,每种语言都有不同的优缺点,可以根据自己的兴趣方向选择一门编程语言作为自己的学习目标。 基础阶段的语法学习。学习任何一门编程语言,都需要掌握其编程的语法规则,可以通过阅读一…

git入门教程

git入门教程 一、工作流程二、获取本地仓库三、Git常用指令1、查看文件状态2、查看提交日志3、版本回退4、添加文件至忽略列表 三、分支1、查看本地分支2、创建分支3、切换分支4、合并分支5、删除分支6、解决冲突 四、Git远程仓库1、常用的托管服务[远程仓库]2、注册码云3、创建…

gcc/linux下的c++异常实现

概述 本文不一定具有很好的说教性&#xff0c;仅作为自我学习的笔记。不妨可参阅国外大神博文C exceptions under the hood链接中包含了大量的例子。 偶有在对ELF做分析的时候看到如下图一些注释&#xff0c;部分关键字看不懂&#xff0c;比如什么FDE, unwind , __gxx_perso…

万字长文解析AQS抽象同步器核心原理(深入阅读AQS源码)

AQS抽象同步器核心原理 在争用激烈的场景下使用基于CAS自旋实现的轻量级锁有两个大的问题&#xff1a; CAS恶性空自旋会浪费大量的CPU资源。在SMP架构的CPU上会导致“总线风暴”。 解决CAS恶性空自旋的有效方式之一是以空间换时间&#xff0c;较为常见的方案有两种&#xff…

哔哩哔哩 B站 bilibili 视频倍速设置 视频倍速可自定义

目录 一、复制如下代码 二、在B站视频播放页面进入控制台 三、将复制的代码粘贴到下方输入框&#xff0c;并 回车Enter 即可 四、然后就可以了 一、复制如下代码 &#xff08;该代码用于设置倍速为3&#xff0c;最后的数值是多少就是多少倍速&#xff0c;可以带小数点&#…

Kafka为什么这么快?

Kafka 是一个基于发布-订阅模式的消息系统&#xff0c;它可以在多个生产者和消费者之间传递大量的数据。Kafka 的一个显著特点是它的高吞吐率&#xff0c;即每秒可以处理百万级别的消息。那么 Kafka 是如何实现这样高得性能呢&#xff1f;本文将从七个方面来分析 Kafka 的速度优…

PCI控制器扫描PCI总线过程解析

1、PCI的三种地址空间介绍 地址空间描述命令说明I/O空间供给设备驱动程序使用I/O操作命令对设备对应的I/O地址空间进行访问&#xff0c;此类访问不可预取存储空间供给设备驱动程序使用memory操作命令对设备的Memory空间进行访问&#xff0c;其中Memory操作命令又可分为Prefech…

从PC传输文件到ipad

首先从PC上进入iTunes。剩下步骤如图所示。

【iPhone和iPad设备管理和文件传输工具】iMazing 2.9.9 for Mac

文章来源于&#xff1a;风云社区 iMazing 2.9.9 for Mac iMazing- 管理你的iPhone。获取可信赖的软件来传输和保存您的音乐&#xff0c;消息&#xff0c;文件和数据。安全备份任何iPhone&#xff0c;iPad或iPod touch。iMazing功能强大且用户友好&#xff0c;是Mac和PC的最佳…

ipad如何投屏到xbmc_询问操作技巧:在iPad上设置文件传输拖放区,XBMC,并使用控制台模拟器享受复古游戏...

ipad如何投屏到xbmc Once a week we round up some of the reader questions we’ve answered and share them with everyone; this week we’re taking a look at setting up file transfer drop zones, installing XBMC on the iPad, and setting up a console emulator. 每周…

iOS系统与Windows电脑如何做到无线传输文件?

iOS系统与Windows电脑传输文件&#xff0c;大多数人可能会选择使用微信或QQ的 “文件传输助手”&#xff0c;今天我教大家一种一分钟设置&#xff0c;便可永久传输的简单方法。快点赞收藏起来吧&#xff01;&#xff01; &#xff08;此处用iPad 第8代 2020为例子&#xff09;…