【Java基础】Java异常处理机制超简单的!!

news2024/11/25 4:54:32

程序在运行时出现的不正常情况

java把程序运行时出现的各种不正常情况提取属性和行为进行描述,从而出现了各种异常类,也就是异常被面向对象了。

异常名称、异常信息、异常发生的位置

Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: 5(数组下标越界异常类)
        at Demo2.main(Demo2.java:6)

体系结构

  • Throwable(父类)

    • Error: 表示严重的问题,合理的应用程序不应该试图捕获。

    • Exception: 可以处理的不严重的问题,指示合理的应用程序想要捕获的条件。

      int[] arr=new int[5];
      System.out.println(arr[5]); 
      //throw new ArrayIndexOutOfBoundsException()
      //(数组下标越界异常类)
      System.out.println("hehe");//程序中断,不打印
      

      当发生数组下标越界异常时:

      因为这种异常(ArrayIndex0utOfBoundsException)java内部已经定义了,所以系统会自动创建一个ArrayIndex0utOfBoundsException类的对象。main无法处理这种异常,抛给了JVM。JVM默认的处理异常的方式是,调用异常类对象的printStackTrace方法,printStackTrace方法会打印异常名字、异常信息、异常发生的位置,然后程序中断。

捕获异常

try{
    可能发生异常的代码
}catch(异常类 参数名){
    处理异常的代码
}

Throwable常用方法

class MyMath{
	public int divide(int a,int b){
		return a/b;//throw new ArithmeticException();
	}
}
class Demo3{
	public static void main(String[] args){
		MyMath math=new MyMath();
		try{
			int result=math.divide(5,0);
			//throw new ArithmeticException();
			System.out.println(result);
		}catch (Exception e){//=new ArithmeticException();
			//System.out.println("除数为0了");
			String msg=e.getMessage();//异常信息
			System.out.println(msg);
			System.out.println(e.toString());//异常类名:异常信息
			e.printStackTrace();//异常类名:异常信息 异常发生的位置
		}
		System.out.println("ok");
	}
}

在这里插入图片描述

throws声明

  • throws: 声明自己可能发生异常。用在方法的后边,throws后边跟的是异常类。
    一个方法使用throws声明了可能发生异常,那么调用者必须处理,处理方式有两种:

    1. 使用try{}catch(){}处理
    2. 调用者继续使用throws声明自己可能异常

    如果不使用try{}catch(){}处理就会出现程序编译正常,运行出问题

    class MyMath{
    	public int divide(int a,int b)throws Exception{
    		return a/b;
    	}
    }
    class Demo4{
    	public static void main(String[] args)//throws Exception
     {
    		MyMath math=new MyMath();
    		int result=math.divide(5,0);
    		System.out.println(result);
    	}
    }
    

    在这里插入图片描述

多重异常

  • 当要捕获多个异常时,子类异常要写在父类异常前面。
  • 声明的才是需要处理的
class MyMath{
    public int divide(int a, int b)throws ArrayIndexOutOfBoundsException,ArithmeticException//声明自己可能发生异常.
    {
        int[] arr=new int[3];
        System.out.println(arr[3]);
        return a/b;
    }
}
class Demo5
{
	public static void main(String[] args)
    {
        MyMath math=new MyMath();
		try{
            int result = math.divide(5,0);
			System.out.println(result);
        }catch(ArrayIndexOutOfBoundsException e){
            System.out.println("下标越界了");
        }catch(ArithmeticException ee){
            System.out.println("除数为0了");
        }//catch(Exception){……} 没有声明的异常不需要处理
        System.out.println("ok");
    }
}

在这里插入图片描述

throw

用来手动创建异常类对象,使用了throw,必须处理,处理方式有两种

//手动创建异常类
class FuShuException extends Exception{
	FuShuException(){}
    //构造方法,定义异常信息
	FuShuException(String message){
		super(message);
	}
}
class MyMath{                  //声明用throws
    public int divide(int a, int b)throws FuShuException{
		if(b<0)
			throw new FuShuException("除数为负数了");
        	//手动创建异常类对象用throw
        return a/b;
    }
}
class Demo5{                             //声明用throws
	public static void main(String[] args) throws FuShuException{
		MyMath math=new MyMath();
		int result=math.divide(5,-4);
		System.out.println("Hello World!");
	}
}

手动抛出异常数据

class FuShuException extends Exception{
	int num;
	FuShuException(){}
	FuShuException(String message ){
		super(message);
	}
	FuShuException(String message,int num){
		super(message);
		this.num=num;
	}
	public int getNum(){
		return num;
	}
}
class MyMath{
    public int divide(int a, int b)throws FuShuException
    {
		if(b<0)
			throw new FuShuException("除数为负数",b);
        return a/b;
    }
}
class Demo5 
{
	public static void main(String[] args){
		MyMath math=new MyMath();
		try{
			int result=math.divide(5,-4);
			System.out.println(result);
		}catch(FuShuException e){
            	//=new FuShuException("除数为负数",b);
			System.out.println(e.getMessage()+":"+e.getNum());
		}
	}
}

throw后面不能再跟语句,但抛出异常的方法后可以。

class Demo
{
	public static void main(String[] args)
	{
		try
		{
			showExce();
			System.out.println("A");
		}
		catch(Exception e)
		{
			System.out.println("B");
		}
		finally
		{
			System.out.println("C");
		}
		System.out.println("D");
	}

	public static void showExce()throws Exception 
	{
		throw new Exception();
	}
}
// BCD
class Demo
{	
	public static void func()
	{
		try
		{
			throw  new Exception();
			System.out.println("A");//10 0%执行不了
		}
		catch(Exception e)
		{
			System.out.println("B");
		}
	}
	public static void main(String[] args)
	{
		try
		{
		        func();
		}
		catch(Exception e)
		{
		       System.out.println("C");
		}
		System.out.println("D");
	}
}

throws和throw的区别

  1. throws用在函数名的后边,throw用在函数内部
  2. throws后边跟的是类名,throw后边跟的是异常类对象

运行时异常

  • 运行时异常

    • 使用了throw不处理,编译照样通过
    • 使用了throws不处理,编译照样通过
    • 编译时不检测的异常
    • RuntimeException及其子类属于运行时异常
    • 运行时异常,不处理编译也通过,原因是这些异常都是因为数据错误造成的异常。程序就应该中断,处理错误的数据。
  • 非运行时异常

    • 使用了throw,必须处理
    • 使用了throws,必须处理
    • 编译时检测的异常
    • Exception及其子类属于非运行时异常

    非运行异常的练习:老师用电脑上课 day13\Demo10.java

    class LanPingException extends Exception{
    	LanPingException(){}
    	LanPingException(String message){
    		super(message);
    	}
    }
    class MaoYanException extends Exception{
    	MaoYanException(){}
    	MaoYanException(String message){
    		super(message);
    	}
    }
    class TeachProgramException extends Exception{
    	TeachProgramException(){}
    	TeachProgramException(String message){
    		super(message);
    	}
    }
    class Teacher{
    	private String name;
    	private Computer computer;
    	Teacher(){}
    	Teacher(String name){
    		this.name=name;
    		computer=new Computer();
    	}
    	public void teach() throws TeachProgramException{
    		try{
    			System.out.println(name+"老师上课");
    			computer.run();
    		}catch(LanPingException e){
    			System.out.println(e.getMessage());
    			computer.reset();
    		}catch (MaoYanException ee){
    			System.out.println(ee.getMessage());
    			throw new TeachProgramException("上课进度受影响");
    		}
    	}
    }
    class Computer
    {
    	private int state=1;
    	public void run() throws LanPingException,MaoYanException
    	{
    		if(state==1)
    			System.out.println("电脑运行");
    		if(state==2)
    			throw new LanPingException("电脑蓝屏");
    		if(state==3)
    			throw new MaoYanException("电脑冒烟");
    	}
    	public void reset(){
    		System.out.println("电脑重启");
    	}
    }
    class Demo6
    {
    	public static void main(String[] args) 
    	{
    		Teacher teacher=new Teacher("张三");
    		try
    		{
    			teacher.teach();
    		}
    		catch (TeachProgramException e)
    		{
    			System.out.println("老师休息");
    			System.out.println("学生自习");
    		}
    	}
    }
    
try{
    throw new Exception();
}catch(Exception e)
{
	try{
	    throw e;
	}catch(Exception ee)
	{
		throw new RuntimeException();
	}
}

try-catch-finally

  • try {
        // 可能会发生异常的语句
    } catch(ExceptionType e) {
        // 处理异常语句
    } finally {
        // 必须执行的代码(清理代码块)
    }
    
  • try{//正常代码}
    finally{
        //必须执行的代码(释放资源)
    }
    
  • 使用 try-catch-finally 语句时需注意以下几点:

    1. 异常处理语法结构中只有 try 块是必需的,也就是说,如果没有 try 块,则不能有后面的 catch 块和 finally 块;
    2. catch 块和 finally 块都是可选的,但 catch 块和 finally 块至少出现其中之一,也可以同时出现;
    3. 可以有多个 catch 块,捕获父类异常的 catch 块必须位于捕获子类异常的后面;
    4. 不能只有 try 块,既没有 catch 块,也没有 finally 块;
    5. 多个 catch 块必须位于 try 块之后,finally 块必须位于所有的 catch 块之后。
    6. finally 与 try 语句块匹配的语法格式,此种情况会导致异常丢失,所以不常见。

    一般情况下,无论是否有异常拋出,都会执行 finally 语句块中的语句:

    ​ finally{……}子句是异常处理的出口

    在这里插入图片描述

finally与return的执行顺序

  • 当 try 代码块和 catch 代码块中有 return 语句时,finally 仍然会被执行。
  • 执行 try 代码块或 catch 代码块中的 return 语句之前,都会先执行 finally 语句。
  • 无论在 finally 代码块中是否修改返回值,返回值都不会改变,仍然是执行 finally 代码块之前的值。
  • finally 代码块中的 return 语句一定会执行。当 finally 有返回值时,会直接返回该值,不会去返回 try 代码块或者 catch 代码块中的返回值。

在这里插入图片描述

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

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

相关文章

Saving Environment to FAT... Card did not respond to voltage select!

在移植uboot到全志H3时&#xff0c;出现了错误&#xff1a; Saving Environment to FAT… Card did not respond to voltage select! 判定与MMC有关。 同时还有报错&#xff1a; Error: ethernet1c30000 address not set. No ethernet found. 查看源码发现这与环境变量有关&am…

01-xss基本原理

核心:攻击的是前端&#xff0c; 一、课程引入 1、开发一个简单的PHP页面&#xff0c;代码如下&#xff1a; <?php // xss 基础演示代码&#xff1a;从浏览器中接受一个URL地址参数名为content if(isset($_GET[content])){$content$_GET[content];echo "你输入的内容…

LeetCode 每日一题 Day 144-157

2385. 感染二叉树需要的总时间 给你一棵二叉树的根节点 root &#xff0c;二叉树中节点的值 互不相同 。另给你一个整数 start 。在第 0 分钟&#xff0c;感染 将会从值为 start 的节点开始爆发。 每分钟&#xff0c;如果节点满足以下全部条件&#xff0c;就会被感染&#xf…

浏览器的使用心得和探索

文章目录 前言一、浏览器二、个人推荐2.1 3602.2 猎豹2.3 火狐2.4 chorme2.5 Opera2.6 QQ浏览器2.7 猫眼&#xff08;Catsxp&#xff09;2.8 edge 三、Browser plugin3.1 AdGuard 广告拦截器3.2 Axure RP 查看器3.3 Edge深度清理者3.4 FeHelper(前端助手)3.5 MarkDownload - Ma…

Echarts之桑基图的配置,带你感受数据流动之美。

一、桑基图的作用 ECharts中的桑基图&#xff08;Sankey diagram&#xff09;是一种用于显示数据流量、能量转移、材料流动等复杂关系的图表类型。它可以反映不同节点之间的流动关系、数量、比例等信息。 桑基图可以用于展示各种复杂的关系&#xff0c;比如流程图、资源分配、…

算法基础01一快速排序,归并排序,二分

一.排序 1.快速 排序 基于分治 确定分界点 左 右 中间 随机划分区间 左半边<x >x在右半边递归处理左右两端 #include<iostream>using namespace std;const int N 1e6 10;int n; int q[N]; void quick_sort(int q[],int l,int r) {if(l>r)return;//边界&…

【微机原理及接口技术】8086/8088系统时序和微机总线

【微机原理及接口技术】8086/8088系统时序和微机总线 文章目录 【微机原理及接口技术】8086/8088系统时序和微机总线前言一、8086/8088引脚信号和工作模式1.8088 的两种组态模式2.最小组态的引脚信号3.最小组态的总线形成4.最大组态的总线形成 二、8086/8088典型时序1.三种周期…

九州金榜|孩子出现焦虑情绪应该怎么家庭教育?

当下社会&#xff0c;生活节奏快&#xff0c;生活压力大&#xff0c;同时孩子学习压力也在加大&#xff0c;这就造成孩子会出现焦虑情绪。那么作为家长&#xff0c;我们不仅仅只关注孩子的身体健康&#xff0c;还要重视孩子心理健康问题。当孩子出现焦虑情绪时&#xff0c;那么…

鞋店小程序商城的作用是什么

鞋与服装一样其购买/复购属性都非常足&#xff0c;每个人生活所需无疑促进了品牌多样化、工厂/店铺商家/个人都有很多&#xff0c;其目的都是为了品牌宣传和将更多货卖给下游/客户。 对消费者来说&#xff0c;买鞋渠道线上线下选择比较多&#xff0c;普遍会以品牌为主&#xf…

Centos7 安装 MySQL5.7 使用 RPM 方式

1 访问网站 https://downloads.mysql.com/archives/community/ 选择合适的版本&#xff0c;点击 Download。 2 上传下载好的 mysql-5.7.44-1.el7.x86_64.rpm-bundle.tar 文件到 Centos7 机器&#xff0c;这里放到了 下载 目录。 3 解压 mysql-5.7.44-1.el7.x86_64.rpm-bundle.…

FileLink跨网文件交换的交换方式:满足不同场景下的文件交换需求

FileLink&#xff0c;作为一款创新的文件交换工具&#xff0c;不仅满足了用户在日常生活中对文件传输的需求&#xff0c;更在技术上实现了跨网文件交换的突破。其独特之处在于支持邮件方式投递、文件中转站、网盘模式共享三种交换方式&#xff0c;这使得FileLink能够适应不同场…

《intel开发手册卷1》学习笔记2

1、栈 堆栈&#xff08;见图 6-1&#xff09;是一个连续的内存位置数组。它包含在一个段中&#xff0c;并由 SS 寄存器中的段选择器标识。使用平面内存模型时&#xff0c;堆栈可以位于程序线性地址空间中的任何位置。堆栈最长可达 4 GB&#xff0c;这是段的最大大小。 使用 P…

【SpringBoot 项目 加密】你会对Spring项目的接口进行加密吗?

这里写目录标题 加密/加盐加密介绍加密算法分类加密思路 测试类写加密/解密工具类修改数据库密码修改登录接口 加密/加盐 加密介绍 在MySQL数据库中, 我们常常需要对密码, ⾝份证号, ⼿机号等敏感信息进⾏加密, 以保证数据的安全性。如果使⽤明⽂存储, 当⿊客⼊侵了数据库时,…

springboot本地文件同步到nacos 本地文件上传到nacos 使用nacos

导入依赖 <!--配置文件使用nacos--><dependency><groupId>com.alibaba.cloud</groupId><artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId><version>nacos版本</version></dependency><dependency…

深入解析Python中的`add_argument`用法

深入解析Python中的add_argument用法 在Python编程中&#xff0c;add_argument通常与命令行参数解析库argparse有关。这个库主要用于编写用户友好的命令行接口&#xff0c;其核心功能之一就是通过add_argument方法来指定程序可以接受哪些命令行参数。本篇博客将详细介绍argpar…

留学资讯 | 曼大突然官宣接受雅思单科重考!单科重考体验大揭秘!

雅思单科重考于昨日&#xff08;5月6日&#xff09;进行了大陆地区的首场考试&#xff0c;不少烤鸭都在观望状态&#xff0c;表示&#xff1a;虽然我很心动&#xff0c;但是学校们可不心动&#xff01;&#xff01; 别急&#xff01;好消息这不就来了&#xff01;曼大官网明确表…

geoHelper

个人博客&#xff1a;无奈何杨&#xff08;wnhyang&#xff09; 个人语雀&#xff1a;wnhyang 共享语雀&#xff1a;在线知识共享 Github&#xff1a;wnhyang - Overview 简介 GitHub - wnhyang/geoHelper 无奈何杨/geoHelper geoHelper整合了身份证、手机号、IP、GPS解析…

Java云商城系统 云端商城 一站式系统Java源码 云商城自助下单平台 云商城虚拟交易网

内容目录 一、详细介绍二、效果展示2.效果图展示 三、学习资料下载 一、详细介绍 云商城系统&#xff0c;无后门&#xff0c;一站式系统Java源码&#xff0c;心权益商品数量不限数量 系统对接 手动发货 自动发货 兑 换 码 订单监控 商品监控 对象存储 邮箱提醒 加价模板 密价…

智慧园区能耗管控系统,3D可视化开发都需要哪些技术栈?

数据可视化&#xff1a; 数据可视化是将数据通过图表、图形、地图等可视化方式展示&#xff0c;使得数据更加直观、易于理解和分析。在智慧园区能耗管控系统中&#xff0c;可以使用各种图表库&#xff08;如Echarts、Highcharts&#xff09;和可视化工具&#xff08;如Tableau…

首个ICLR时间检验奖出炉,机器学习大牛Max Welling和OpenAI创始团队成员Diederik Kingma获奖

国际表征学习大会&#xff08;ICLR&#xff09;是机器学习领域的一个学术会议&#xff0c;每年一次&#xff0c;通常在每年四月底或五月初举行。会议包括特邀演讲以及经评审论文的口头和海报展示。 ICLR 由 Yann LeCun&#xff08;杨立昆&#xff09;和 Yoshua Bengio 两位图灵…