java --- 异常

目录

一、异常体系介绍

二、异常的作用

三、异常处理方式

3.1 捕获异常

2.1 灵魂一问: 如果try中没有遇到问题,如何执行?

2.2 灵魂二问:如果try中可能会遇到多个问题,怎么执行?

2.3 灵魂三问:如果try中遇到的问题没有被捕获,怎么执行?

2.4 灵魂四问:如果try中遇到了问题,那么try下面的其他代码还会执行吗?

3. 抛出异常

四、 异常中常见方法


一、异常体系介绍

Exception:叫做异常,代表程序可能出现的问题。

                     我们通常会用Exception以及他的子类来封装程序出现的问题。

运行时异常:RuntimeException及其子类,编译阶段不会出现异常提醒。

                     运行时出现的异常。(如:数组索引越界异常

编译时异常:没有继承RuntimeException的异常,直接继承与Exception。

                      编译阶段就会出现异常提醒。(如:日期解析异常

二、异常的作用

  • 作用一:异常时用来查询bug的关键参考信息
  • 作用二:异常可以作为方法内部的一种特殊返回值,以便通知调试者底层的执行情况。

三、异常处理方式

  1. JVM默认的处理方式:把异常信息以红色字体打印在控制台,并结束程序
  2. 捕获异常 try...catch:一般用在调用处,能让代码继续往下运行。
  3. 抛出异常 throw、throws:
  4. 在方法中,出现异常了。
  5. 方法就没有继续运行下去的意义了,采取抛出处理。
  6. 让该方法结束运行并告诉调用者出现了问题。

3.1 捕获异常

格式:

try{
    可能出现的异常代码
}
catch(异常类名 变量名){
    异常处理代码
}

目的:当代码出现异常时,可以让程序继续往下执行。

 public static void main(String[] args) {
        int[] arr = {1,2,3,4,5,6};
        //System.out.println(arr[10]);

        try{
            System.out.println(arr[10]);
        }
        catch (ArrayIndexOutOfBoundsException e){
            System.out.println("数组越界");
        }

        System.out.println("hhhhhhhh");
    }
2.1 灵魂一问: 如果try中没有遇到问题,如何执行?
  • 会把try里面的所有的代码执行完毕,不会执行catch里面的代码。

注意:只有当出现了异常,才会执行catch里面的代码

这就相当于没有触发异常一样。

2.2 灵魂二问:如果try中可能会遇到多个问题,怎么执行?
  • 会写多个catch与之对应。

细节如果我们要捕获多个异常,这些异常中如果存在父子关系的话,那么父类一定要写在下面。

了解性:在JDK7之后,我们可以在catch中同时捕获多个异常,中间用 | 进行隔开。

public class ExceptionDemo07 {
	public static void main(String[] args) {
		int[] arr = { 1, 2, 3, 4, 5 };
 
		try {
			System.out.println(arr[10]); // ArrayIndexOutOfBoundsException
			System.out.println(2 / 0); // ArithmeticException
			String s = null;
			System.out.println(s.equals("abc"));
		} catch (ArrayIndexOutOfBoundsException e) {
			System.out.println("索引越界");
		} catch (ArithmeticException e) {
			System.out.println("除数不能为0");
		} catch (NullPointerException e) {
			System.out.println("空指针异常");
		} catch (Exception e) {
			//父类异常
			System.out.println("exception");
		}
		System.out.println("看看我执行了吗");
		// 索引越界
		// 看看我执行了吗
	}
}
2.3 灵魂三问:如果try中遇到的问题没有被捕获,怎么执行?
  • 相当于try...catch代码没有执行,最终还是会交给虚拟机进行处理。
public class ExceptionDemo08 {
	public static void main(String[] args) {
		int[] arr = { 1, 2, 3, 4, 5 ,6};
 
		try {
			System.out.println(arr[10]); //ArrayIndexOutOfBoundsException
			// new ArrayIndexOutOfBoundsException();
		} catch (NullPointerException e) {
			System.out.println("空指针异常");
		}
		System.out.println("看看我执行了吗");
	}
}
2.4 灵魂四问:如果try中遇到了问题,那么try下面的其他代码还会执行吗?
  • 不会执行,直接跳转到对应的catch当中,执行catch里面的语句体。
  • 但是如果没有对应的语句体,那么还是会交给虚拟机进行处理。
public class ExceptionDemo09 {
	public static void main(String[] args) {
		int[] arr = { 1, 2, 3, 4, 5 ,6};
 
		try {
			System.out.println(arr[10]); 
			System.out.println("看看我执行了吗...try");
		} catch (ArrayIndexOutOfBoundsException e) {
			System.out.println("索引越界");
		}
		System.out.println("看看我执行了吗...其他代码");
		//索引越界
		//看看我执行了吗...其他代码
	}
}

3. 抛出异常

例子:求一个数组中的最大数

public class ExceptionDemo10 {
	public static void main(String[] args) {
		// 需求:定义一个方法求数组最大值
 
		// int[] arr = { 1, 2, 3, 4, 5 };
		// 以下两种数组代码无法运行
		int[] arr = null;
		int max = 0;
		// int[] arr = {};
		// 进行捕获
		try {
			max = getMax(arr);
		} catch (NullPointerException e) {
			System.out.println("空指针异常");
		} catch (ArrayIndexOutOfBoundsException e) {
			System.out.println("索引越界异常");
		}
		System.out.println(max);
	}
 
	// public static int getMax(int[] arr) throws
	// NullPointerException,ArrayIndexOutOfBoundsException{
	// 都属于RuntimeException 运行时异常 可以不写
	public static int getMax(int[] arr) {
		if (arr == null) {
			// 手动创建一个异常对象 并把这个异常交给方法的调用者处理
			// 此时方法结束,下面代码不再执行
			throw new NullPointerException();
		}
 
		if (arr.length == 0) {
			throw new ArrayIndexOutOfBoundsException();
		}
		System.out.println("看看我执行了吗");
		int max = arr[0];
		for (int i = 1; i < arr.length; i++) {
			if (arr[i] > max) {
				max = arr[i];
			}
		}
		return max;
	}
}

四、 异常中常见方法

Throwable的成员方法:

方法名称说明
public String getMessage ( )返回此throwable的详细消息字符串
public String toString ( )返回此可抛出的简短描述
public void printstackTrace ( )把异常的错误信息输出在控制台
public class ExceptionDemo11 {
	public static void main(String[] args) {
		int[] arr = { 1, 2, 3, 4, 5 };
 
		try {
			System.out.println(arr[10]);
		} catch (ArrayIndexOutOfBoundsException e) {
			String message = e.getMessage();
			System.out.println(message); // Index 10 out of bounds for length 6
 
			String str = e.toString();
			System.out.println(str); // java.lang.ArrayIndexOutOfBoundsException:10
 
			e.printStackTrace(); // at Exception.ExceptionDemo11.main(ExceptionDemo11.java:8)
			// 仅仅打印信息,不会停止程序运行
		}
 
		System.out.println("看看我执行了吗");
	}
}

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

动态规划优化技巧

一、斐波那契系列 1、滚动数组优化空间复杂度 2、dp数组初始化/处理边界优化 力扣&#xff08;LeetCode&#xff09;官网 - 全球极客挚爱的技术成长平台

NtripShare Mos监测平台边缘计算终端与自动优化平差算法

忙忙乎乎23年又要过去了&#xff0c;回头看今年做的事&#xff0c;只有两件事值得一提&#xff1a; 1、自动化监测边缘计算终端&#xff1b; 2、自动优化平差算法。 自动化监测边缘计算终端 终端采用全国产硬件方案终端支持全站仪供电控制终端支持远程控制终端支持数据缓存技…

WebLangChain_ChatGLM:结合 WebLangChain 和 ChatGLM3 的中文 RAG 系统

WebLangChain_ChatGLM 介绍 本文将详细介绍基于网络检索信息的检索增强生成系统&#xff0c;即 WebLangChain。通过整合 LangChain&#xff0c;成功将大型语言模型与最受欢迎的外部知识库之一——互联网紧密结合。鉴于中文社区中大型语言模型的蓬勃发展&#xff0c;有许多可供利…

arcgis更改服务注册数据库账号及密码

最近服务器数据库密码换了&#xff0c;gis服务也得换下数据库连接密码。传统官方的更改方式&#xff08;上传连接配置文件&#xff09;&#xff1a; ArcGIS Server数据库注册篇(I) — 更新数据库密码_arcgis server sde换密码-CSDN博客 方式太麻烦了&#xff0c;需要安装ArcG…

PyTorch自动梯度计算(注意点)

if params.grad is not None: params.grad.zero_() 我们实际的运算往往会涉及到若干个requires-grad为true的张量进行运算&#xff0c;在这种情况下&#xff0c;Pytorch会计算整个计算图上的损失的导数&#xff0c;并把这些结果累加到grad属性中。多次调用backward()会导致梯度…

数据结构与算法—哈希表

哈希表 文章目录 哈希表1. 问题引出2. 基本介绍3. 应用实例 1. 问题引出 看一个实际需求&#xff0c;google公司的一个上机题:有一个公司&#xff0c;当有新的员工来报道时&#xff0c;要求将该员工的信息加入(id,性别&#xff0c;年龄等)&#xff0c;当输入该员工的id时&#…

CodeBlocks定义异常:multiple definition of 和 first defined here

基于链表实现贪吃蛇案例时候&#xff0c;在CodeBlocks的CPP源文件定义函数和全局变量均报错 异常现象 在**自定义的cpp**文件定义全局变量、对象、函数等均出现重复定义和首次定义 multiple definition of Controller::showCopy() first defined here 异常解决方案 正确代码…

RabbitMQ手动应答与持久化

1.SleepUtil线程睡眠工具类 package com.hong.utils;/*** Description: 线程睡眠工具类* Author: hong* Date: 2023-12-16 23:10* Version: 1.0**/ public class SleepUtil {public static void sleep(int second) {try {Thread.sleep(1000*second);} catch (InterruptedExcep…

HashMap构造函数解析与应用场景

目录 1. HashMap简介 2. HashMap的构造函数 2.1 默认构造函数 2.2 指定初始容量和加载因子的构造函数 3. 构造函数参数的影响 3.1 初始容量的选择 3.2 加载因子的选择 4. 构造函数的应用场景 4.1 默认构造函数的应用场景 4.2 指定初始容量和加载因子的构造函数的应用…

海安行车记录仪avi杀病毒导致文件丢失的恢复案例

海安行车记录仪&#xff0c;听名字就知道是个小小小品牌&#xff0c;而且用的文件格式是比较古老的AVI&#xff0c;这种文件格式是微软设计的&#xff0c;后来并没有普及&#xff08;不支持4G以上大文件而且结构过于松散&#xff09;。这个恢复案例比较特殊的地方是不太清楚做过…

教师如何维护学生的自尊心

作为教师&#xff0c;我们不仅要传授知识&#xff0c;更要关心学生的身心健康&#xff0c;特别是他们的自尊心。自尊心是个人自我价值的重要体现&#xff0c;对学生的学习、生活和未来的发展都有深远的影响。因此&#xff0c;维护学生的自尊心是教师的重要责任。 教师要尊重每…

[Verilog] Verilog 操作符与表达式

主页&#xff1a; 元存储博客 文章目录 前言1. 操作符2. 操作数3 表达式总结 前言 1. 操作符 图片来源&#xff1a; https://www.runoob.com/ Verilog语言中使用的操作符包括&#xff1a; 算术操作符&#xff1a;加法()、减法(-)、乘法(*)、除法(/)、取模(%)、自增()、自减(–…

常用网安渗透工具及命令(扫目录、解密爆破、漏洞信息搜索)

目录 dirsearch&#xff1a; dirmap&#xff1a; 输入目标 文件读取 ciphey&#xff08;很强的一个自动解密工具&#xff09;&#xff1a; john(破解密码)&#xff1a; whatweb指纹识别&#xff1a; searchsploit&#xff1a; 例1&#xff1a; 例2&#xff1a; 例3&…

no module named ‘xxx‘

目录结构如下 我想在GCNmodel的model里引入layers的GraphConvolution&#xff1a;from GCNmodel.layers import GraphConvolution&#xff0c;但这样却报错no module named GCNmodel&#xff0c;而且用from layers import GraphConvolution也不行。然后用sys.path.appen(xxx)…

MySQL数据库,表的增量备份与恢复

1. 从物理与逻辑的角度 数据库备份可以分为物理备份和逻辑备份。物理备份是对数据库操作系统的物理文件&#xff08;如数据 文件&#xff0c;日志文件等&#xff09;的备份。这种类型的备份适用于在出现问题时需要快速恢复的大型重要数据库。 物理备份又可以分为冷备份&#xf…

Redis Cluster集群搭建 三主三从

Redis包下载 Linux&#xff1a; http://download.redis.io/releases/ Mac or Windows: https://redis.io/download/ 2.下载后解压进入文件夹&#xff08;本次我的Redis版本是6.2.14版本&#xff09; /redis/redis-6.2.14 开始安装 make instarll修改配置文件复制redis.conf 6…

Ubuntu 常用命令之 chmod 命令用法介绍

chmod是Linux系统下的一个命令&#xff0c;用于改变文件或目录的权限。它的名称是“change mode”的缩写。在Linux中&#xff0c;文件或目录的权限分为读&#xff08;r&#xff09;、写&#xff08;w&#xff09;和执行&#xff08;x&#xff09;三种&#xff0c;分别对应数字4…

Python redis安装使用教程

一、项目环境 Python 3.8.xredis-5.0.14 二、Redis 安装 下载地址&#xff1a;https://github.com/tporadowski/redis/releases 下载 Redis-x64-xxx.zip压缩包到你要安装的文件夹&#xff0c;解压即可 三、使用redis 打开一个 cmd 窗口&#xff0c;使用 cd 命令切换redis…

(5)shell命令以及Linux的权限

写在前面 本章我们将重点讲解 Linux 权限&#xff0c;这是 Linux 基础部分中非常重要的一部分。内容比较干&#xff0c;我会稍稍正经些去讲解。话不多说&#xff0c;我们直接切入正题。 shell 命令及运行原理 严格意义上说的是一个操作系统&#xff0c;我们称之为 —— &…

MDK编译过程和文件类型

MDK是一款IDE软件&#xff0c;具有&#xff0c;编辑&#xff0c;编译&#xff0c;链接&#xff0c;下载&#xff0c;调试等等的功能。 1.编译器介绍&#xff1a; MDK可以编译C/C文件和汇编文件&#xff0c;MDK只是一款IDE软件&#xff0c;那他内部使用的是什么编译器呢&#x…