【Java异常】干净明了的Java“异常”机制详解

【Java】“异常”详解 Java 异常 阅读详情

异常,即不正常,我们的代码出现的编译或者运行时的错误。本文,将带你了解Java的异常机制的基础语法,为以后的学习和开发打好基础。

异常体系结构

Throwable 类是 Java 语言中所有错误或异常的超类。其下主要分为两种类型:Error、Exception。

辨析错误(Error)和异常(Exception):
Error:程序在运行期间发生了某种错误(XxxError),Error错误通常没有具体的处理方式,程序将会结束运行。Error错误的发生往往都是系统级别的问题,都是jvm所在系统发生的,并反馈给jvm的。我们无法针对处理,只能修正代码。
Exception:指程序在编译、运行期间发生了某种异常(XxxException),我们可以对异常进行具体的处理。若不处理异常,程序将会结束运行。所有的异常类是从 java.lang.Exception 类继承的子类。其有两个主要的子类:IOException 类和 RuntimeException 类。

类比理解:
在这里插入图片描述

用代码理解Error和Exception:

// 异常的产生演示如下:
public static void main(String[] args) {
	int[] arr = new int[3];
	System.out.println(arr[0]);
	System.out.println(arr[3]);
// 该句运行时发生了数组索引越界异常ArrayIndexOutOfBoundsException,由于没有处理异常,导致程序无法继续执行,程序结束。
	System.out.println("over"); // 由于上面代码发生了异常,此句代码不会执行
}

// 错误的产生演示如下:
public static void main(String[] args) {
int[] arr = new int[1024*1024*100];
//该句运行时发生了内存溢出错误OutOfMemoryError,开辟了过大的数组空间,导致JVM在分配数组空间时超出了JVM内存空间,直接发生错误。
}

throwable类

方法:

  1. String getMessage() 对异常信息的详细描述
  2. String toString() 对异常信息的简短描述
  3. void printStackTrace() 将异常信息追踪到标准的错误流

使用示例:

public class ExceptionDemo4 {
	public static void main(String[] args) {
		method();
	}

	private static void method() {
		try {
			System.out.println(2 / 0);
		} catch(ArithmeticException e) {
			//String getMessage() : 异常原因
			System.out.println(e.getMessage());
			
			//String toString(): 异常类型和原因
			System.out.println(e.toString());

			//void printStackTrace(): 异常类型原因和位置
			e.printStackTrace();
		}
	}
}

编译时期异常

定义:

  1. 编译期间就检查异常是否发生,如果有异常,则编译不通过;

体系结构:
在这里插入图片描述

快速理解编译时异常

public class Main {
	public static void main(String[] args) throws Exception { //本方法也没有处理异常,只能继续向外抛
		function(); //调用该方法,就要处理该方法的异常
	}
	public static void function() throws Exception { //本方法没有(或没有能力)处理异常
		throw new Exception(); //产生、制造异常
	}
}

特性:
程序语法正确,但因为外在的环境条件不满足引发。例如:用户错误及I/O问题,程序试图打开一个并不存在的远程Socket端口。这不是程序本身的逻辑错误,而很可能是远程机器名字错误(用户拼写错误)。对商用软件系统,程序开发者必须考虑并处理这个问题。Java编译器强制要求处理这类异常,如果不捕获这类异常,程序将不能被编译。

常见编译时异常:
SQLException
IOexception
FileNotFoundException
ClassNotFoundException
EOFException
IllegaArguementException

运行时期异常

定义:

  1. 运行时期才检查程序是否有异常,有异常则程序终止。

快速理解运行时异常

public class Main {
	public static void main(String[] args) {
		function();
	}
	public static void function() {
		throw new RuntimeException(); //产生、制造异常,运行时异常不用向外抛
	}
}

体系结构:
在这里插入图片描述

特性:

  1. 是哪些可能在Java虚拟机正常运行期间抛出的异常的超类。
  2. 方法内部抛出的异常时运行异常(throw new XxxException),那么在方法的申明上,不需要throws语句。这样设计的原因可能是:运行时异常一般是不会发生的,如果发生了,需要程序员停止程序并修改源代码。
  3. 这意味着程序存在bug,如数组越界,0被除,入参不满足规范…这类异常需要更改程序来避免,Java编译器强制要求处理这类异常。

常见运行时异常:
StringIndexOutOfBoundsException、
ArrayIndexOutOfBoundsException、
ArithmeticException、
IllegaArguementException、
NullPointException

异常的处理

在开发中,建议使用“try…catch….finallay”,自己检测和捕获异常;而不建议使用“throw、throws”向外抛出异常。

异常的捕获和处理

异常的捕获和处理的三种方式

1、try……catch……
try{
	可能出现异常的代码块;
}catch(异常类型){
	处理异常的代码块;
}

2、多个catch……

try{
	可能出现异常的代码块;
}catch(异常类型){
	处理异常的代码块;
}catch(异常类型){
	处理异常的代码块;
}

多个catch的顺序:平级之间没有顺序关系,如果有子父类,父类异常必须放在后面

3、try……catch……finally……

try{
	可能出现异常的代码块;
}catch(异常类型){
	处理异常的代码块;
}catch(异常类型){
	处理异常的代码块;
}finally{
    代码块: 不管你try代码块里面的内容是否有异常,我finally代码中的内容都会被执行。往往用做释放资源的事情
}

try-catch

法则:
try 代码后不能既没 catch 块也没 finally 块。

初次尝试

public class Main {
	// 快速理解try-catch
	private static void method() {
		try {
			String s = null;
			System.out.println(s.length());
		} catch (NullPointerException e) {
			System.out.println("出现空指针了");
		}

		try {
			int[] arr = new int[5];
			System.out.println(arr[8]);
		} catch (ArrayIndexOutOfBoundsException e) {
			System.out.println("出现数组越界了");
		}
	}

	// 优化以上的异常处理
	public static void method02() {
		try {
			String s = null;
			System.out.println(s.length());
		} catch (ArrayIndexOutOfBoundsException e) { //具体的异常
			System.out.println("出现数组越界了");
		} catch (NullPointerException e) {
			System.out.println("出现空指针了");
		} catch (Exception e) { //Exception可以接收任何类型的异常
			System.out.println("出现异常了");
		}
	}

	public static void main(String[] args) {
		method();
		// method02();
	}
}

try-catch-finally

快速理解使用方式

import java.io.FileWriter;
import java.io.IOException;

public class Main {
	public static void main(String[] args) {
		method();
	}

	public static void method() {
		FileWriter fw = null;
		try {
			System.out.println(2 / 0); //try中一旦发生异常,其后的代码将不会再执行,直接跳转到catch语句开始执行;
			fw = new FileWriter("a.txt");
			fw.write("hello");
			fw.write("world");
			//System.out.println(2 / 0);
			fw.write("java");
			
			//fw.close();
		} catch (IOException e) {
			e.printStackTrace();
		} finally {
			//释放资源
			try {
				if(fw != null) {
					fw.close();
				}
			} catch (IOException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
		}
	}
}

异常的抛出

当我们不想处理异常,或者没有能力处理的时候,我们可以选择抛出异常,谁调用方法谁处理异常。

throw 与throws两个关键字:

  1. throw关键字是用于方法内部的,throws是用于方法声明上的。
  2. throw关键字是用于方法内部抛出一个异常对象的,throws关键字是用于在方法声明上声明抛出异常类型的。
  3. throw关键字后面只能有一个异常对象,throws后面一次可以声明抛出多种类型的异常。

throw和throws在功能上的区别:

  1. throws:处理异常的方式,是在本方法不能够处理才向外抛,由调用者处理该异常;
  2. throw:制造异常的方式,是开发者注意到某句代码可能发生异常,而主动向外抛的异常方式。throw后面必须是“new 一个异常类”,这个异常类必须是Exception或者其子类。
  3. 注意:如果抛出(throw)的是编译时期异常,必须在方法声明处抛出(throws);

快速理解throw和throws

public class Main {
	public static void main(String[] args) {
		int[] arr = null;
		int i = getArray(arr);
		System.out.println(i);
	}
	public static int getArray(int[] arr) {
		int i = arr[arr.length-1]; //发生异常语句
		return i*2;
	}
}
/* 发生异常:
Exception in thread "main" java.lang.NullPointerException
	at Main.getArray(Main.java:12)
	at Main.main(Main.java:8)
*/


public class Main {
	public static void main(String[] args) throws Exception { //抛出异常,main方法抛出的异常由JVM处理
		int[] arr = null;
		int i = getArray(arr);
		System.out.println(i);
	}
	public static int getArray(int[] arr) throws Exception { //抛出异常
		if(arr == null) {
			throw new Exception("数组不存在,为null"); //抛出异常
		}
		int i = arr[arr.length-1]; //发生异常语句
		return i*2;
	}
}
/*运行结果:
	Exception in thread "main" java.lang.Exception: 数组不存在,为null
	at Main.getArray(Main.java:10)
	at Main.main(Main.java:5)
*/

自定义异常类

写一个类去继承Exception或者RuntimeException,然后实现多个构造即可;

快速理解自定义异常的使用

/* 用自定义异常类实现
 * 写一个方法,接受考试成绩,如果考试成绩在0-100之间则属于正常,否则属于异常
 */
public class Main {
	public static void main(String[] args) {
		try {
			checkScore(110);
		} catch (Exception e) {
			e.printStackTrace();
		}
	}

	public static void checkScore(int score) throws Exception {
		if(score < 0 || score > 100) {
			throw new MyException("考试成绩不符合要求"); //
		} 
		System.out.println("考试成绩符合要求");
	}
}

//如果继承Exception就是编译时异常,如果继承RuntimeException就是运行时异常;
class MyException extends /*RuntimeException*/ Exception{
	//使用工具直接生成:"source","Generatre xxXx"
	public MyException() {
		super();
	}

	public MyException(String message) {
		super(message);
	}
}

单周期CPU设计【Verilog】 第一章 单周期CPU的设计原理 为实现单周期CPU,本文首先研究了单周期CPU的相关理论和工作原理。本章首先简要介绍单周期CPU的基本概念,然后对CPU的工作原理进行简要分析,以便为单周期CPU的设计和开发提供理论基础。 1.1 单周期CPU概述 中央处理器,即CPU,作为计算机系统的运算和控制核心,是信息处理、程序运行的最终执行单元。在CPU内部,电平从低到高变化的瞬间称为时钟上升沿,两个相邻时钟上升沿之间的时间间隔称为一个时钟周期。单周期CPU指的是一条指令的执行在一个时钟周期内完成,然后开始下一 阅读详情

相关推荐

RK3588视频转码实战:如何用FFmpeg+MPP实现16路1080P硬解压(附完整命令)

本文详细介绍了如何在RK3588处理器上使用FFmpeg和MPP框架实现16路1080P视频的硬件加速转码。通过解析RK3588的视频处理架构、环境搭建步骤和实战配置,提供了完整的命令示例和性能调优建议,帮助开发者高效处理多路视频转码任务。

weixin_29233333的博客 556

【Java】解决Java报错:IllegalArgumentException

在某些情况下,使用自定义异常可以提供更有意义的错误信息和处理逻辑。System.out.println("捕获到自定义异常: " + e.getMessage());throw new InvalidAgeException("年龄必须在0到150之间");System.out.println("年龄设置为: " + age);理解并有效处理对于编写健壮的Java程序至关重要。

Easonmax的博客 5448

半导体领域知识 - 初级入门

半导体领域知识 - 初级入门 知识问答 1. 一个晶圆上根据芯片的大小,可以生产几百、几千、几万个芯片。如下图: 2. 8寸晶圆指的是什么?5nm工艺指的是什么? 8寸晶圆指的是直径为175mm(17.5cm)的晶圆,下面是6/812/18寸晶圆的尺寸以及相关发展历程。目前拥有12寸线的厂商只有5家,一个12寸晶圆厂的成本需要上百亿美金。 5nm工艺指的是在一个具体的芯片上,有很多微型结构(千万、亿级别的晶体管),这些核心基本单元MOS管的栅极宽度尺寸来衡量工艺的精细程度,如果是5nm就被称为5nm工艺

Hello World! 2万+

java中处理异常的9个注意事项

异常: 检查异常(编译时异常:try catch或声明抛出) 非检查异常(运行时异常:比如:除0异常,事务中默认回滚的都是“非检查异常”) 1、清理 Finally 块中的资源,或使用 Try-With-Resource 语句 在 try 块中使用资源时常发生,比如 InputStream ,是需要在用完之后关掉的。一个通常发生的错误是,在 try 块的末尾关掉资源: 顺利的话,只要...

Winn~ 2365

中兴交换机配置SSH登录

SSH是在传统的Telnet协议基础上发展起来的一种安全的远程登录协议。发送和接收数据时, SSH会自动对数据进行加密及解密。相比于Telnet,SSH能防止“中间人”攻击、DNS欺骗、IP 欺骗等,无论是在认证方式或者数据传输的安全性上都有很大的提高。SSH用户认证方式有3种,分别为本地(Local)认证、RADIUS认证和TACACS+认证。以表规划数据为例,说明配置SSH登录的步骤。

才怪的博客 7922

使用freesurfer和3Dslicer进行脑区分割和电极定点(详细版)

1、安装好matlab和freesurfer2、在目标位置创建文件夹3、开放权限4、将需要计算的nii文件放入文件夹。

zQIANYUN的博客 5623

数据库查询时报IllegalArgumentException异常是什么原因?

javaweb项目在使用方法时抛出IllegalArgumentException是什么原因呢?哪里出了问题呢?有类似问题的可以参考此文章,希望对各位程序员小伙伴有所帮助!!

weixin_61016066的博客 2万+

点餐系统数据库设计--SQL Server

友情链接 1、学生成绩管理系统数据库设计–MySQL 学生成绩管理系统数据库设计–MySQL 2、医疗信息管理系统数据库–MySQL 医疗信息管理系统数据库–MySQL 3、邮件管理数据库设计–MySQL 邮件管理数据库设计–MySQL 4、SQL Server医疗信息管理系统数据库【英文版-源码】–(Medical Management System Database) SQL Server医疗信息管理系统数据库【英文版-源码】–(Medical Management System Database) 5

若如初见 8万+

跳过异常运行下面的代码

一行代码抛出异常,然而这个异常自己i知道,或者这个地方本来就要抛出异常,然而我们还是想继续执行下面的程序。最好的办法就是try,catch,catch住这个异常(要准确抓住异常),然后程序就可以继续执行下面的代码 仅为记录自己学习的历程 ...

weixin_44289552的博客 506

华为od 面试八股文_C语言_02_含答案

华为od 面试八股文_C语言_02_含答案

MISAYAONE的博客 2230

5、基于模型的系统工程(MBSE)全面解析

本文全面解析了基于模型的系统工程(MBSE),介绍了模型在系统工程中的核心地位,以及如何通过视图和符号表示法实现信息的可视化。文章还详细阐述了MBSE的方法构成,包括框架(本体和视图点)和流程集,探讨了MBSE的实施流程、关键要素、应用策略以及未来发展趋势。通过合理应用MBSE,组织可以提高系统开发的效率和质量,降低成本与风险,实现成功部署。

nft7creator的博客 127

eclipse上一次没有正确关闭,导致启动的时候卡死异常解决办法解决办法

我的情况在项目上一点右键就卡死半天   到\.metadata\.plugins\org.eclipse.core.resources目录 删除文件 .snap   注意是隐藏文件夹   删除后项目要重新导入   其他的 在 eclipse.ini文件中增加最大内存 取消各种文件的validation 原文:htt

moyunfei1987的专栏 2201

基于单片机的按键加1数码管显示(仿真+程序)5046

1、51+Proteus8.10;2、学习计数统计、数码管显示驱动;

理论结合实践,开启你的电子学习新方案! 1324

Java异常机制详解

异常(Exception)的概念 异常指程序运行过程中出现的非正常现象,例如用户输入错误、除数为零、需要处理的文件不存在、数组下标越界等。 在Java的异常处理机制中,引进了很多用来描述和处理异常的类,称为异常类。异常类定义中包含了该类异常的信息和对异常进行处理的方法。 所谓异常处理,就是指程序在出现问题时依然可以正确的执行完。 Java是采用面向对象的方式来处理异常的。处理过程: 抛出异常:在...

一介白衣入江南 3652

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

IDEA的使用指南

IDEA基于java的使用手册,可以最快速的上手,在使用中不断的丰富自己的使用技巧.

java的异常处理机制详解

Java异常的处理主要依赖于try,catch,finally,throws,throw这五个关键字。下面分别介绍它们:

jingwen的博客 1万+

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

Java 异常处理机制详解

在 Java 编程中,异常处理是一个至关重要的概念。它帮助我们处理程序执行过程中可能出现的错误或异常情况,从而提高程序的可靠性和稳定性。本文将详细介绍 Java 异常处理机制,包括异常的定义、分类、处理方式以及一些最佳实践。

专注Java和MySQL领域知识分享 1989

pscad IEEE标准系统搭建说明

pscad IEEE标准系统搭建说明,包含典型的IEEE 9节点、14节点、30节点、39节点和118节点系统。内含标准测试系统的原始数据和潮流结果。

Java 基础 - 异常机制详解

本文综合多篇文章后,总结了Java 异常的相关知识,希望可以提升你对Java中异常的认知效率。

qq_63353796的博客 1178

【Java ——异常机制详解】

super(msg);// ...try、catch和finally都不能单独使用,只能是try-catch、try-finally或者try-catch-finally。try语句块监控代码,出现异常就停止执行下面的代码,然后将异常移交给catch语句块来处理。finally语句块中的代码一定会被执行,常用于回收资源。throws:声明一个异常,告知方法调用者。throw :抛出一个异常,至于该异常被捕获还是继续抛出都与它无关。Java编程思想一书中,对异常的总结。

abclyq的博客 1017

Java 异常机制详解

在 Java 中可以自定义异常。编写自定义异常类时需要注意以下几点。所有异常都必须是 Throwable 的子类。如果希望自定义一个检查性异常类,则需继承 Exception 类。如果希望自定义一个运行时异常类,则需要继承 RuntimeException 类。可以像下面这样定义自己的异常类:}// ...}如果想要成为架构师或想突破20~30K薪资范畴,那就不要局限在编码,业务,要会选型、扩展,提升编程思维。

Eqiqi的博客 2520

Java异常处理机制详解

本文将全面解析Java中的异常处理机制,帮助开发者更好地理解和应用这一强大工具。

YT的博客 938

Java异常处理机制相关疑问

本篇博客着重讲解运行时异常和检查型异常。异常类的继承的讲解。运行时异常和检查型异常和自定义异常为什么会设计和使用场景。捕获和处理异常的多种写法。异常抛出中throw和throws相关疑问。

weixin_46485886的博客 2674

java异常机制详解

java的基本概念是:结构不佳的代码不能运行。 发现错误的理想时机是在编译阶段,也就是在试图运行程序之前。然而编译器并不能找出所有的错误,余下的问题必须在运行期间解决。 异常情形是指阻止当前方法或者作用域继续执行的问题。在这里一定要明确一点:异常代码某种程度的错误,尽管Java有异常处理机制,但是我们不能以“正常”的眼光来看待异常,异常处理机制的原因就是告诉你:这里可能会或者已经产生了错误,您的程序出现了不正常的情况,可能会导致程序失败!

topdeveloperr的博客 997

JAVA异常类(简单明了)

在生活中我们也经常会感到异常,比如我们身体的某个地方疼,那指定是有什么地方做了不对的事情,对于计算机来说,也是这样,当你的程序运行的不对了,也是有一些做的不好的事情锁导致的.所以我们就能得到定义。受查异常:又叫编译时异常,程序在编译的时候就会报错的异常,不能通过编译.例如我们前面说的clone接口,使用的时候需要处理异常,这种就是受查异常。在这里我们可以看到,当我们哪一步出现异常的时候,我们在后面解决了异常,这样后面只要能执行,就没异常了,即使有,也会在里面处理了。

qq_55546526的博客 2909

Java 中的异常处理机制详解

异常是程序执行期间发生的问题,它中断了程序的正常流程。异常可以由多种原因引起,比如除数为零、数组越界访问、文件找不到等。在 Java 中,所有异常都是从Throwable类派生出来的。Java 的异常处理机制是一个强大的工具,它可以帮助我们编写更加健壮和可维护的代码。正确理解和运用异常处理,不仅能够提高程序的稳定性,还能简化调试过程。希望这篇文章能够为读者提供有价值的指导,帮助大家在日常开发中有效地管理和应对异常情况。

m0_56896669的博客 1241

6、Java 异常处理机制详解

Java异常ogel异常处理体系摘要 Java异常处理体系包含两大异常类型:检查异常(强制处理)和非检查异常(运行时异常)。通过try-catch-finally结构实现异常捕获和处理,Java 7+引入的try-with-resources语法可自动管理资源关闭。关键点包括:异常分类体系、处理语法结构和最佳实践,如日志记录、异常传递等。合理运用异常处理能提升程序健壮性,避免资源泄漏。

python15397的博客 1042

Java必知必会:异常机制详解

一、Java异常概述 在Java中,所有的事件都能由类描述,Java中的异常就是由java.lang包下的异常类描述的。1、Throwable(可抛出):异常类的最终父类,它有两个子类,Error与Exception。 Throwable中常用方法有: getCause():返回抛出异常的原因。如果 cause 不存在或未知,则返回 null。 getMeage():返回异常的消息信息。

Leeon的博客 1万+
上一篇: 【Python初识】Python解释器
下一篇: 【Java文件流】管理文件和文件夹:File类
ALGO阿狗
博客等级 码龄9年 64粉丝 149原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值