java异常那些事

异常的基本定义:

异常情形是指阻止当前方法或者作用域继续执行的问题。在这里一定要明确一点:异常代码某种程度的错误,尽管Java有异常处理机制,但是我们不能以“正常”的眼光来看待异常,异常处理机制的原因就是告诉你:这里可能会或者已经产生了错误,您的程序出现了不正常的情况,可能会导致程序失败!

异常的体系:

  • Java中所有的异常类都继承自父类Throwable
  • Throwable下有两个之类Error(错误)和Exception(异常)
  • 错误:Error类以及他的子类的实例,代表了JVM本身的错误。错误不能被程序员通过代码处理,Error很少出现。因此,程序员应该关注Exception为父类的分支下的各种异常类。
  • 异常:Exception以及他的子类,代表程序运行时发送的各种不期望发生的事件。可以被Java异常处理机制使用,是异常处理的核心。

Java中异常主要有两种:检查异常和非检查异常

非检查异常:

Error和RuntimeException类及其之类,javac在编译时,不会提示和发现这样的异常,不要求在程序处理这些异常

检查异常:

除非检查异常外,其他都是检查异常,检查异常需要你在编译阶段就需要处理的

初始异常:

public class DivTest {

	public static void main(String[] args) {
		try {
			//下面两行代码可以发生数组越界异常
			int a = Integer.parseInt(args[0]);
			int b = Integer.parseInt(args[1]);
			int c = a / b;//可能发生算数异常(除0)
			System.out.println("两个数相除的结果是" + c);
		} catch (IndexOutOfBoundsException | NumberFormatException | ArithmeticException ie) {
			System.out.println("数组越界");
		} catch (Exception e) {
			System.out.println("未知异常");
			e = null;
		}finally {
			System.out.println("finally代码块中语句一定会执行");
		}
	}

}

上面的代码展示了最简单的异常,try语句中放着可能会发生异常的代码,catch语句块中放着发生异常后的处理代码。

注意:

  • 在异常处理中,try代码块必不可少,catch和finally块至少出现其中一个,也可以都出现,此外catch块可以有一个或者多个。
  • 当出现多个catch块时,一定要保证放在前面的catch处理的异常范围比放在较后面catch块的异常范围要小

上图代码中第一个catch块处理的是Exception异常,第二个catch块中处理的异常时RuntimeException异常,第一个异常范围比第二个大,所以会出错。因为如果你把Exception放在前面的时候,后面的根本就得不到处理了。

finally:

思考一下这段代码的结果是什么:

public class Test01 {
	
	public static void main(String[] args) {
		try {
			int a=9/0;
		}catch(Exception e) {
			System.out.println("除0异常");
			return;
		}finally {
			System.out.println("我是finally");
		}
	}

}

try块中的代码是int a=9/0,会发生算术异常,于是来到catch中,这时输出除0异常,然后我们看到了return语句,这时程序结束,这时我们通常的理解

我们来看一下运行结果:

除0异常
我是finally

我们看到我是finally正常输出

在异常处理中不管前面try块还是catch块中是否出现return语句,finally块中的代码都会正常执行,除非在前面遇到System.exit(1),这行代码会直接退出虚拟机,所以finally不会执行

如果finally中也出现了return语句,那么finally中的return语句会覆盖前面try块中的return语句,尽量不要在finally中写return语句

我们一般在finally语句中释放一些物理资源,如数据库连接,文件流等

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • [译]区域设置更改和 AndroidViewModel 反面模式

    在 ViewModel 中,如果要公开来自资源(字符串、可绘制文件、颜色……)的数据,则必须着重考虑 ViewModel 对象而忽视配置更改,例如区域设置更改。...

    Android 开发者
  • Netty系列之Netty线程模型

    最近发现极客时间的很多课程中,都穿插到了 Netty,可见 Netty 的重要性。基于此,给大家推荐一下这篇文章!

    业余草
  • ASP.NET Core 中的 ServiceProvider

    在 ASP.NET Core 中,微软提供了一套默认的依赖注入实现,该实现对应的包为:Microsoft.Extensions.DependencyInject...

    Edison.Ma
  • QT QJsonObject 与 QJsonArray 中insert()方法 插入值的顺序问题

    本文链接:https://blog.csdn.net/acoolgiser/article/details/99442177

    acoolgiser
  • 聊聊dubbo的ServiceBeanExportedEvent

    dubbo-2.7.3/dubbo-config/dubbo-config-spring/src/main/java/org/apache/dubbo/conf...

    codecraft
  • Redis 与序列化

    序列化只是一种拆装组装对象的规则,那么这种规则肯定也可能有多种多样,比如现在常见的序列化方式有:JDK(不支持跨语言)、JSON、XML、Hessian、Kry...

    业余草
  • 迭代器模式

    java中的迭代器想必大家都用过,但是大家知道他的性能以及实现原理吗?今天就来介绍一波 实际上foreach封装了迭代器,迭代器又封装了for循环,这样一来,...

    gfu
  • 聊聊dubbo的DubboComponentScanRegistrar

    本文主要研究一下dubbo的DubboComponentScanRegistrar

    codecraft
  • servlet中的IllegalStateException

    本文链接:https://blog.csdn.net/u014427391/article/details/97397116

    用户1208223
  • 聊聊dubbo的ConfigChangeEvent

    dubbo-2.7.3/dubbo-configcenter/dubbo-configcenter-api/src/main/java/org/apache/d...

    codecraft

扫码关注云+社区

领取腾讯云代金券