当前位置: 首页 > news >正文

Java中异常处理机制

异常可能是在程序执行过程中产生的,也可能是程序中throw主动抛出的。异常产生后,会使用一个对应类型的异常对象包装该异常,尝试寻找异常处理程序来处理异常。异常处理机制可以在程序发生异常时,对其执行预先设定的异常处理逻辑。

Java标准库内建了一些通用的异常。Throwable派生Error、Exception。Error类及其子类代表的是JVM本身的错误,并非程序的问题,不能由程序员通过代码进行处理。Exception及其子类代表的是在程序运行过程中产生的不期望发生的异常事件,可以被Java异常处理机制进行处理,是异常处理的核心。

1.异常被成功catch之后,代码会继续向后执行

package com.cb;

public class TestOne {
	
	public static void main(String args[]){
		
		int a=5;
		int b=0;
		try {
			int c=a/b;
		} catch (Exception e) {
			e.printStackTrace();
		}
		
		System.out.println("end");
	}
	
}

ArithmeticException是Exception的子类,能被ArithmeticException捕获的异常,使用Exception一定也可以捕获到。

执行结果:

 

2.异常未被成功catch,则不会继续向下执行代码

package com.cb;

public class TestOne {
	
	public static void main(String args[]){
		
		int a=5;
		int b=0;
		try {
			int c=a/b;
		} catch (NullPointerException e) {
			e.printStackTrace();
		}
		
		System.out.println("end");
	}
	
}

在上述代码中,异常未被成功捕获,继续向上抛,后续代码不会继续执行。

执行结果:

3.成功捕获异常后默默吞掉,代码继续向后执行

package com.cb;

public class TestOne {
	
	public static void main(String args[]){
		
		int a=5;
		int b=0;
		try {
			int c=a/b;
		} catch(ArithmeticException e) {
			//e.printStackTrace();
			//throw e;
		}
		
		System.out.println("end");
	}
}

异常被捕获并被默默吞掉,此种方式不可取。正常情况下要输出错误相关堆栈信息,或输出可以帮助定位问题的日志信息。

执行结果:

 

4.成功捕获异常后使用throw直接抛出,不对异常进行处理,代码不会继续向下执行

package com.cb;

public class TestOne {
	
	public static void main(String args[]){
		
		int a=5;
		int b=0;
		try {
			int c=a/b;
		} catch(ArithmeticException e) {
			//e.printStackTrace();
			throw e;
		}
		
		System.out.println("end");
	}
}

捕获异常后直接throw抛出

执行结果:

 

5.方法名后使用throws声明可能会抛出的异常,异常产生后交给上层调用方法处理

package com.cb;

public class TestOne {
	
	public static void main(String args[]){
		
		try {
			TestOne testOne=new TestOne();
			testOne.myMethod();
		} catch (ArithmeticException e) {
			e.printStackTrace();
		}
		
		System.out.println("main end");
	}
	
	public void myMethod() throws ArithmeticException{
		int a=5;
		int b=0;
		int c=a/b;
		
		System.out.println("myMethod end");
	}
}

myMethod方法执行代码抛出异常后,myMethod后续代码停止向下执行,异常抛出交给main处理,main成功捕获并进行处理,继续执行main方法后续代码,输出"main end"

执行结果:

 

6.try-catch-finally成功捕获异常,执行finally中代码,并继续执行try-catch-finally块后面的代码

package com.cb;

public class TestOne {
	
	public static void main(String args[]){
		int a=5;
		int b=0;
		try {
			int c=a/b;
			System.out.println("d=10");
		} catch (ArithmeticException e) {
			e.printStackTrace();
		}finally{
			System.out.println("execute finally code block");
		}
		
		System.out.println("main end");
	}
	
}

执行结果:

 

7.try-catch-finally未成功捕获异常,执行finally中代码,停止执行try-catch-finally块后面的代码

package com.cb;

public class TestOne {
	
	public static void main(String args[]){
		int a=5;
		int b=0;
		try {
			int c=a/b;
			System.out.println("d=10");
		} catch (NullPointerException e) {
			e.printStackTrace();
		}finally{
			System.out.println("execute finally code block");
		}
		
		System.out.println("main end");
	}
	
}

执行结果:

 

欢迎关注个人微信公众号“我爱编程持之以恒”。

 

相关文章:

  • Linux操作命令总结(六)
  • MySQL中的表连接(外连接、内连接、交叉连接、自连接)
  • location.href的用法
  • MySQL中不相关子查询和相关子查询
  • Linux-eth0 eth0:1 和eth0.1关系、ifconfig以及虚拟IP实现介绍
  • Windows中查看8080端口的占用情况并关闭相关进程
  • Java中使用HttpClient封装post请求和get请求工具方法
  • Tomcat的JVM参数配置
  • java.lang.OutOfMemoryError及解决方案
  • Eclipse中新建maven项目注意事项
  • MyEclipse web项目导入Eclipse需要修改的地方
  • Java中相对路径与绝对路径区别
  • java.lang.ClassNotFoundException: org.hibernate.engine.FilterDefinition
  • Spring中Constructor、@Autowired、@PostConstruct的顺序
  • Thymeleaf学习—Standard Dialects
  • 时间复杂度分析经典问题——最大子序列和
  • 【React系列】如何构建React应用程序
  • Java新版本的开发已正式进入轨道,版本号18.3
  • MySQL用户中的%到底包不包括localhost?
  • PHP的Ev教程三(Periodic watcher)
  • 读懂package.json -- 依赖管理
  • 搞机器学习要哪些技能
  • 个人博客开发系列:评论功能之GitHub账号OAuth授权
  • 我感觉这是史上最牛的防sql注入方法类
  • 我建了一个叫Hello World的项目
  • 学习笔记TF060:图像语音结合,看图说话
  • Mac 上flink的安装与启动
  • ​你们这样子,耽误我的工作进度怎么办?
  • # Java NIO(一)FileChannel
  • #include<初见C语言之指针(5)>
  • #我与Java虚拟机的故事#连载02:“小蓝”陪伴的日日夜夜
  • (3)(3.2) MAVLink2数据包签名(安全)
  • (M)unity2D敌人的创建、人物属性设置,遇敌掉血
  • (Matlab)使用竞争神经网络实现数据聚类
  • (六)Hibernate的二级缓存
  • (十)DDRC架构组成、效率Efficiency及功能实现
  • (转)Java socket中关闭IO流后,发生什么事?(以关闭输出流为例) .
  • * CIL library *(* CIL module *) : error LNK2005: _DllMain@12 already defined in mfcs120u.lib(dllmodu
  • .bat批处理(八):各种形式的变量%0、%i、%%i、var、%var%、!var!的含义和区别
  • .NET 8.0 发布到 IIS
  • .NET CLR Hosting 简介
  • .net core 控制台应用程序读取配置文件app.config
  • .net mvc 获取url中controller和action
  • .NET 中使用 Mutex 进行跨越进程边界的同步
  • .Net6使用WebSocket与前端进行通信
  • .NET开源的一个小而快并且功能强大的 Windows 动态桌面软件 - DreamScene2
  • .secret勒索病毒数据恢复|金蝶、用友、管家婆、OA、速达、ERP等软件数据库恢复
  • /dev下添加设备节点的方法步骤(通过device_create)
  • [ vulhub漏洞复现篇 ] GhostScript 沙箱绕过(任意命令执行)漏洞CVE-2019-6116
  • []使用 Tortoise SVN 创建 Externals 外部引用目录
  • [20190113]四校联考
  • [BZOJ 2142]礼物(扩展Lucas定理)
  • [CakePHP] 在Controller中使用Helper
  • [CISCN 2019华东南]Web11
  • [DM复习]Apriori算法-国会投票记录关联规则挖掘(上)