36、异常(Exception)

news2024/10/7 14:26:50

一、 引入:

不应该出现了一个不算致命的问题就导致整个系统崩溃,所以java设计者提供了一个异常处理机制来解决问题

快速入门:

package exception_;

public class Exception01 {
    public static void main(String[] args) {
        int num1=10;
        int num2=0;
        //异常处理流程:把该代码块——》选中——》快捷键:ctrl+alt+t——》选择try-catch
        //如果进行异常处理,那么即使出现了异常,程序可以继续执行
        try {
            int res=num1/num2;
        } catch (Exception e) {
            throw new RuntimeException("出现异常的原因:"+e.getMessage());//e.getMessage()输出异常信息
        }
        System.out.println("程序继续运行……");
    }
}
//输出:
// Exception in thread "main" java.lang.RuntimeException: 出现异常的原因:/ by zero
//	at exception_.Exception01.main(Exception01.java:12)

二、基本介绍:

1、基本概念:java语言中,将程序执行中发生的不正常情况称为“异常”(开发过程中的语法错误和逻辑错误不是异常)

2、执行过程中所发生的异常事件可分为两类:

(1)Error(错误):java虚拟机无法解决的严重问题

如:JVM系统内部错误、资源耗尽等严重情况,比如:StackOverflowError[栈溢出]和OOM(out of memory),Error是严重错误,程序会崩溃

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

例如空指针访问,试图读取不存在的文件,网络连接中断等等

Exception分为两大类:运行时异常[ 程序运行时发生的异常 ]和编译时异常[ 编程时编译器检查出的异常 ]

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

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

2)编译时异常:编译器要求必须处置的异常(任务不合理,就不干活了)

进入到Throwable的源码后,把光标放在 Throwable上,右击,选择……

 即可得到……,可以在上面画思维导图(嘿嘿)

 右击,选择“显示实现”

 即可开始添加

 

 三、异常体系图:

(虚线是实现,实线是继承)

 三、详细介绍:

1、常见的运行时异常:

(1)NullPointerException空指针异常

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

package exception_;

public class NullPointerException_ {
    public static void main(String[] args) {
        String name=null;
        System.out.println(name.length());
    }
}
//输出:
// Exception in thread "main" java.lang.NullPointerException: Cannot invoke "String.length()" because "name" is null
//	at exception_.NullPointerException_.main(NullPointerException_.java:6)

(2)ArithmeticException数学运算异常

当出现异常的运算条件时,抛出此异常

package exception_;
public class Exception01 {
    public static void main(String[] args) {
        int num1=10;
        int num2=0;
        int res=num1/num2;
        System.out.println(res);
    }
}
//输出:
// Exception in thread "main" java.lang.ArithmeticException: / by zero
//	at exception_.Exception01.main(Exception01.java:7)

(3)ArrayIndexOutOfBoundsException数组下标越界异常

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

package exception_;

public class ArrayIndexOutOfBoundsException_ {
    public static void main(String[] args) {
        int[] arr={1,2,4};
        for(int i=0;i<=arr.length;i++){
            System.out.println(arr[i]);
        }
    }
}
//输出:
//1
//2
//4
//Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: Index 3 out of bounds for length 3
//	at exception_.ArrayIndexOutOfBoundsException_.main(ArrayIndexOutOfBoundsException_.java:7)

(4)ClassCastException类型转换异常

当试图将对象强制转换为不是实例的子类时,抛出该异常

package exception_;

public class ClassCastException_ {
    public static void main(String[] args) {
        A b1=new B();//向上转型,b1指向A对象
        B b2=(B)b1;//向下转型,b1指向B对象
        C c2=(C)b1;//b1不能指向C对象,因为B和C没有关系
    }
}
class A{}
class B extends A{};
class C extends A{};
//输出:
// Exception in thread "main" java.lang.ClassCastException: class exception_.B cannot be cast to class exception_.C (exception_.B and exception_.C are in unnamed module of loader 'app')
//	at exception_.ClassCastException_.main(ClassCastException_.java:7)

(5)NumberFormatException数字格式不正确异常

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

package exception_;

public class NumberFormatException_ {
    public static void main(String[] args) {
        String name="韩顺平";//应该输入数字
        int num=Integer.parseInt(name);
        System.out.println(num);
    }
}
//输出:
// Exception in thread "main" java.lang.NumberFormatException: For input string: "韩顺平"
//	at java.base/java.lang.NumberFormatException.forInputString(NumberFormatException.java:67)
//	at java.base/java.lang.Integer.parseInt(Integer.java:665)
//	at java.base/java.lang.Integer.parseInt(Integer.java:781)
//	at exception_.NumberFormatException_.main(NumberFormatException_.java:6)

2、常见的编译异常:

(1)SQLException,操作数据时,查询表可能发生异常

(2)IOException,操作文件时,异常

(3)FileNotFoundException,当操作一个不存在的文件时,异常

(4)ClassNotFoundException,加载类,而该类不存在时,异常

(5)EOFException,操作文件,到文件末尾,异常

(6) IllegalArgumentException,参数异常

四、异常处理:

1、异常处理方式:

(1)try-catch-finally(可以没有finally)

1)程序员在代码中捕获发生的异常,自行处理(try用于包含可能出错的代码,catch用于处理try块中发生的异常)

2)

·如果异常发生了,则异常后面的代码不会执行,直接进入到catch块

·如果异常没有发生,则顺序执行try的代码块,不会进入到catch

·如果希望不管是否发生异常,都执行某段代码(比如关闭连接,释放资源等),则使用finally

·可以有多个catch语句,捕获不同的异常(进行不同的业务处理),要求父类异常在后,子灰异常在前(因为如果父类在前,就可以囊括后面子类的异常处理,那后面子类异常处理的存在也就没有意义了),如果发生异常,只会匹配一个catch

package exception_;

import project20221109.Person;

public class TryCatchDetail02 {
    public static void main(String[] args) {
        try {
            Person_ person=new Person_();
            System.out.println(person.getName());//NullPointerException
            int num1=10;
            int num2=0;
            int res=num1/num2;//ArithmeticException
        } 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 {

        }
    }
}
class Person_{
    private String name;

    public String getName() {
        return name;
    }
}
//输出:
//null
//算术异常=/ by zero

·可以进行try-finally配合使用,这种用法相当于没有捕获异常,因此程序会直接崩掉 /退出

(应用场景:执行一段代码,不管是否发生异常,都必须执行某个业务逻辑)

package exception_;

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("程序继续执行...");
    }
}
//输出:
// 执行了finally...
//Exception in thread "main" java.lang.ArithmeticException: / by zero
//	at exception_.TryCatchDetail03.main(TryCatchDetail03.java:8)
//练习题
class ExceptionExe01{
     public static int method(){
         int i=1;
         try {
            i++;
            String[] name=new String[3];
            if(name[1].equals("tom")){
                System.out.println(name[1]);
            }else{
                name[3]="hspedu";
            }
            return 1;
        } catch (ArrayIndexOutOfBoundsException e) {
            return 2;
        }catch (NullPointerException e){
            return ++i;
            //程序执行到这里时i=3,但不会马上返回,因为还有finally没有执行,
            //所以用了一个临时变量temp来保存3
        } finally{
            ++i;
            System.out.println("i="+i);
            //输出i=4后,因为没有return语句,无法退出程序,又返回上面去返回3
        }
    }public static void main(String[] args) {
        System.out.println(method());
    }
}
//输出
//i=4
//3
//题目:如果用户输入的不是一个整数,就提示他反复输入,直到输入一个整数为止
//思路:
//1、创建Scanner对象
//2、使用无限循环,去接收一个输入
//3、然后将该输入的值,转成一个int
//4、如果在转换时,抛出异常,说明输入的内容不是一个可以转成int的内容
//5、如果没有抛出异常,则break该循环
package exception_;
import java.util.Scanner;
public class TryCatchDetail04 {
    public static void main(String[] args) {
        Scanner scanner=new Scanner(System.in);
        int num=0;
        String inputStr="";
        while(true){
            System.out.println("请输入一个整数:");
            inputStr=scanner.next();
            try {
                num=Integer.parseInt(inputStr);//这里可能抛出异常k
                break;
            } catch (NumberFormatException e) {
                System.out.println("你输入的不是一个整数:");
            }
        }
        System.out.println("你输入的值是="+num);
    }
}
//输出:
//请输入一个整数:
//tom
//你输入的不是一个整数:
//请输入一个整数:
//1
//你输入的值是=1

(2)throws

1)将发生的异常抛出,交给调用者(方法)来处理,最顶级的处理者就是JVM

 如果程序员没有显示是处理异常,则默认是throws

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

public void f2() throws FileNotFoundException,NullPointerException,ArithmeticException{}
//也可以写成
public void f2() throws Exception{}

3)子类重写父类的方法时,对抛出异常的规定:

子类重写的方法,所抛出的异常类型要么和父类抛出的异常一致,要么为父类抛出的异常的类型的子类型(如果子类抛出的异常比父类大,那子类抛完到父类抛出异常时就没有必要抛了)

class Father{
    public void method() throws RuntimeException{}
}
class Son extends Father{
    public void method() throws ArithmeticException{}
}

4)在throws过程中,如果有方法try-catch,就相当于处理异常,就可以不必throws

5)细节:

public static void f1(){
            f3();
            //报错原因:因为f3()方法抛出的是一个编译异常,即这时f1()必须处理这个编译异常
        //方法一:public static void f1() throws FileNotFoundException{}
        //方法二:
            //            try {
            //                f3();
            //            } catch (Exception e) {
            //                throw new RuntimeException(e);
            //            }
        }
        public static void f3() throws FileNotFoundException{
            FileInputStream fis=new FileInputStream("d://aa.txt");
        }
public static void f1(){
   f3();//因为f3()抛出的是运行异常,不要求程序员显示处理,因为有默认处理机制
}
public static void f3() throws ArithmeticException{
}

五、自定义异常

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

2、步骤:

(1)定义类:自己写类名,继承Exception或RuntimeException

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

(3)如果继承RuntimeException,属于运行异常(一般是继承RuntimeException),好处在于可以使用默认的处理机制

六、throw 和 throws的区别:

七、练习题

package exception_;
import java.util.Scanner;
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(e.getMessage());
        } catch (NumberFormatException e) {
            System.out.println("参数格式不正确,需要输出整数");;
        }catch (ArithmeticException e){
            System.out.println("出现了除0的异常");
        }
    }
    public static double cal(int n1,int n2){
        return n1/n2;
    }
}
//在编辑配置处输入

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

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

相关文章

软件工程复习

文章目录&#xff08;一&#xff09;软件软件发展三阶段软件的概念什么是软件危机&#xff1f;内容包括&#xff1a;软件危机的表现&#xff1a;软件危机的原因(4)消除软件危机的途径&#xff1a;软件工程软件工程定义&#xff08;要背&#xff09;简称&#xff1a;软件工程的基…

【Java基础】第六章 | IO流

目录 | 总框架 | 文件路径相关知识 | Peoperties类与IO流、配置文件* | 1.文件流 文件字节输入流&#xff08;标准输入流&#xff09; FileInputStream 文件字节输出流 FileOutputStream 文件字符输入流 FileReader 文件字符输出流 FileWriter 应用&#xff1a;使用字…

MMDetection库中的一些模块介绍

本文目前仅包含1个主干网络和1个颈部网络。如果有机会&#xff0c;会继续补充更多模型。 若发现内容有误&#xff0c;欢迎指出。 MMDetection的图像数据一般会经历如下步骤/模块&#xff1a; #mermaid-svg-XxM18Ychr9OSpdV6 {font-family:"trebuchet ms",verdana,ari…

JavaScript 防抖与节流

目录1 函数1.1 调用函数1.2 闭包2 防抖与节流2.1 定义2.2 区别2.3 应用场景3 防抖3.1 非立即执行3.1.1 一般写法3.1.2 Vue2 中写法3.1.3 过程3.2 立即执行3.2.1 一般写法3.2.2 Vue2 中写法3.2.3 过程1 函数 应用防抖节流首先需理解以下知识 1.1 调用函数 js 函数内部 return…

电影售票系统

项目介绍 基于SpringBoot &#xff0c;Mybatis&#xff0c; Vue 的电影售票及影院管理系统&#xff08;前后端分离&#xff09;&#xff0c;具体功能见 下面演示截图 需要安装的软件 Java8 MySQL5.7或以上 Navicat或者其他管理工具 IDEA或者Eclipse Node.js 14或以上 运行项…

PLC学习笔记(三):PLC结构(2)

目录&#xff1a; PLC学习笔记&#xff08;一&#xff09;&#xff1a;概述 PLC学习笔记&#xff08;二&#xff09;&#xff1a;PLC结构&#xff08;1&#xff09; PLC学习笔记&#xff08;三&#xff09;&#xff1a;PLC结构&#xff08;2&#xff09; &#x1f981;&…

SpringBoot+Mybaits搭建通用管理系统实例八:系统权限控制实现

一、本章内容 实现自定义权限控制,通过自定义PermissionEvaluator实现操作权限的检测及控制,关于权限控制模型有ACL, DAC, MAC, RBAC, ABAC等,具体原理可参考:【权限系统设计】ACL, DAC, MAC, RBAC, ABAC 模型的不同应用场景 完整课程地址 二、开发视频 SpringBoot+Mybaits…

《操作系统-真象还原》12. 进一步完善内核

文章目录Linux 的系统调用系统调用的实现 —— 图解系统调用的实现 —— 代码触发中断寻找 IDT 中断描述符执行对应的中断例程中断例程中通过用户传入的功能号去执行对应的功能函数关于 printf你需要知道可变参数的原理Linux 中的可变参数原理Linux 中的可变参数实现printf 只是…

【微服务】SpringCloud轮询拉取注册表及服务发现源码解析

&#x1f496; Spring家族及微服务系列文章 ✨【微服务】SpringCloud微服务剔除下线源码解析 ✨【微服务】SpringCloud微服务续约源码解析 ✨【微服务】SpringCloud微服务注册源码解析 ✨【微服务】Nacos2.x服务发现&#xff1f;RPC调用&#xff1f;重试机制&#xff1f; ✨【微…

机器学习:支持向量机SVM的SVC和SVR

支持向量机SVMSVM的工作原理及分类支持向量机的原理线性可分的SVM非线性可分的支持向量机支持向量机分类SVC支持向量机回归SVRSVR原理SVR模型时间序列曲线预测SVM的工作原理及分类 支持向量机的原理 支持向量机(Support Vector Machine&#xff0c;SVM)是一种二类分类器&…

积极融入信创生态 | 思腾合力软件产品完成多个信创产品适配

从2019年我国提出发展信创产业&#xff0c;2020年迈入信创发展元年&#xff0c;到2022信创开始向行业深水区迈进&#xff0c;逐渐延伸到金融、电信等重点行业、核心业务中&#xff0c;开启了“行业信创元年”。一个真正的“大信创”时代已开启&#xff0c;一个数万亿规模的市场…

MybatisPlus---从入门到深化

目录 MyBatisPlus入门 MyBatisPlus介绍 ​编辑Spring集成MyBatisPlus SpringBoot集成MyBatisPlus MyBatisPlus_CRUD 添加 CRUD_相关注解 修改 删除 查询 条件构造器 全局配置 ActiveRecord_概念 ActiveRecord_增删改查 MyBatisPlus插件_插件概述 MyBatisPlus插件_…

超神之路 数据结构 3 —— Stack栈实现及应用

栈也是一种线性表结构&#xff0c;相较于数组&#xff0c;栈对应的操作是数组的子集&#xff0c;我们只要实现从一端添加元素&#xff0c;并从这个一端取出元素&#xff0c;这一端我们称呼它为栈顶&#xff0c;正是由于这种结构&#xff0c;它具有“后入先出”&#xff08;LIFO…

PTA题目 计算工资

某公司员工的工资计算方法如下&#xff1a;一周内工作时间不超过40小时&#xff0c;按正常工作时间计酬&#xff1b;超出40小时的工作时间部分&#xff0c;按正常工作时间报酬的1.5倍计酬。员工按进公司时间分为新职工和老职工&#xff0c;进公司不少于5年的员工为老职工&#…

基于jsp+mysql+ssm健身信息交流网站-计算机毕业设计

项目介绍 随着全民健身运动的兴起&#xff0c;越来越多的人走进了健身房&#xff0c;而传统的管理模式已不能适应现代健身机构的发展趋势&#xff0c;如何增强健身房会员卡的管理和完善客户服务&#xff0c;成了健身房发展的当务之急。健身信息管理系统的研究与开发&#xff0…

文本摘要实战:基于句子相似度矩阵构建图结构实现文本摘要 代码+数据

任务描述: 自动文本摘要(Text Summarization)是指给出一段文本,我们从中提取出要点,然后再形成一个短的概括性的文本。自动的文本摘要是非常具有挑战性的,当我们作为人类总结一篇文章时,我们通常会完整地阅读它以发展我们的理解,然后写一个摘要突出其要点。由于计算机缺乏…

计算机毕业设计springboot+vue基本微信小程序的码高教育课后在线小程序

项目介绍 随着我国经济迅速发展,人们对手机的需求越来越大,各种手机软件也都在被广泛应用,但是对于手机进行数据信息管理,对于手机的各种软件也是备受用户的喜爱,码高教育课后在线小程序的设计与开发被用户普遍使用,为方便用户能够可以随时进行码高教育课后在线小程序的设计与开…

HTML期末大学生网页设计作业----锤子手机 1页

⛵ 源码获取 文末联系 ✈ Web前端开发技术 描述 网页设计题材&#xff0c;DIVCSS 布局制作,HTMLCSS网页设计期末课程大作业 | 在线商城购物 | 水果商城 | 商城系统建设 | 多平台移动商城 | H5微商城购物商城项目 | HTML期末大学生网页设计作业&#xff0c;Web大学生网页 HTML&a…

java计算机毕业设计ssm基于JAVA的网上购物系统-商城购物网站

项目介绍 本网上购物网站是针对目前商城的实际需求,从实际工作出发,对过去的网上购物存在的问题进行分析,完善用户的使用体会。采用计算机系统来管理信息,取代人工管理模式,查询便利,信息准确率高,节省了开支,提高了工作的效率。 本系统结合计算机系统的结构、概念、模型、原理…

【机器学习】红酒数据集和加利福尼亚的房价数据的随机森林算法详解

一.随机森林 1.1随机森林的构建 bootstrap参数代表的是bootstrap sample&#xff0c;也就是“有放回抽样”的意思&#xff0c;指每次从样本空间中可以重复抽取同一个样本&#xff08;因为样本在第一次被抽取之后又被放回去了&#xff09; 假设&#xff0c;原始样本是”苹果&…