Java异常与处理机制

简介: Java异常与处理机制Java的异常层次体系Java的所有异常对象都派生自Throwable类,下层有两个分支:error和exception。Error分支描述Java运行时系统内部错误或资源耗尽错误,遇到派生自Error的错误,程序除了通告给用户并尽量安全退出外也无能为力。

Java异常与处理机制
Java的异常层次体系

Java的所有异常对象都派生自Throwable类,下层有两个分支:error和exception。

Error分支描述Java运行时系统内部错误或资源耗尽错误,遇到派生自Error的错误,程序除了通告给用户并尽量安全退出外也无能为力。
Exception分支才是程序员主要在意的异常,它又分为RuntimeException和IOException两个分支。
RuntimeException通常是由于程序错误导致的。
IOException通常程序本身没有问题,但由于像I/O错误等问题导致的。
Java规范将Error分支和RuntimeException分支的异常称为非受查异常,其他异常称为受查异常。

抛出异常
程序员在编写代码时若遇到无法处理的情况(受查异常),可以选择抛出异常,将问题交给程序的调用者解决。

在方法名后用throws语句声明异常告诉调用者代码会抛出什么异常,若需抛出多个异常时就必须列出所有的异常类用逗号隔开。一个方法必须声明所有肯抛出的受查异常。例如:

public void read()throws FileNotFoundException,EOFException
在方法中使用throw语句抛出异常,例如:

throw new IOException();
捕获异常
抛出异常是一种异常的解决方案,但不是最终方案。如果异常没有得到处理程序就会崩溃终止,因此需要捕获异常。Java提供了try/catch语句捕获异常。

如果try语句中发生了异常,则停止执行try块中的代码转而执行catch块中的代码,捕获读个异常时需为每个异常提供catch语句处理且catch语句自上到下要与异常继承链相同由子到父,还可以合并catch语句用‘|’合并捕获多个异常。

复制代码
try {
code
} catch (FileNotFoundException | UnknownHostException e) {

exception handler

} catch (IOException e){

exception handler

}
复制代码
finally语句:若程序出现异常时,就会终止方法中剩余的代码并退出方法。如果方法获得了一些资源并且只有方法自己知道,就会产生资源回收问题。Java提出finally子句的解决方案,不管异常如何处理,finally子句一定会被执行。

处理异常时的几种代码执行顺序:

复制代码
try{

code1
code that might throw exceptions
code2

}catch(Exception e){

code3
code that might throw exceptions
code4

}finally{

code5

}
code6
复制代码
try块代码无异常,执行顺序为1,2,5,6
try块代码中出现异常,catch语句中没有出现异常,执行顺序为1,3,4,5,6
try块代码中出现异常,catch语句中也出现异常,执行顺序为1,3,5
带资源的try语句

对于实现了AutoCloseable或Closeable接口的资源,Java提供了带资源的try语句,当try块退出时,资源自动调用close()方法。

带资源的try语句(try-with-resources)的形式为:

try(Resource res = ...){

// code work with res

}
AutoCloseable接口有一个close方法,它抛出一个Exception异常

void close() throws Exception;
Closeable接口继承自AutoCloseable接口 也有一个close方法,它抛出一个IOException异常

public void close() throws IOException;
断言
在检查受查异常时,通常会使用大量输出语句进行测试,这些语句在测试完毕后依然会留在程序中,如果程序中留有这些大量的检查语句会导致程序运行变慢。

在jdk1.4中引入了断言机制,它允许在开发和测试阶段在代码中插入一些检查语句检测异常。由于Java虚拟机默认断言是关闭的,因此在项目发布后不影响程序的运行。

断言的使用

assert 条件;
assert 条件:表达式;
当条件结果为false时,抛出AssertionError异常,在第二种形式中表达式会传入AssertionError类的构造器中形成一个消息字符串。

在测试中使用-enableassertions或-ea开启断言。

举个栗子:

Scanner in = new Scanner(System.in);
int x = in.nextInt();
assert x>0:x;
double y = Math.sqrt(x);

原文地址https://www.cnblogs.com/LeoCoding/p/11220381.html

相关文章
|
1月前
|
Java
Java并发编程中的锁机制
【2月更文挑战第22天】 在Java并发编程中,锁机制是一种重要的同步手段,用于保证多个线程在访问共享资源时的安全性。本文将介绍Java锁机制的基本概念、种类以及使用方法,帮助读者深入理解并发编程中的锁机制。
|
1月前
|
Java 程序员
Java中的异常处理机制
【2月更文挑战第22天】在Java编程中,异常处理是一个重要的概念。它允许程序员在程序执行过程中遇到错误时,对错误进行处理,而不是让程序崩溃。本文将介绍Java中的异常处理机制,包括异常的分类、如何捕获和处理异常以及自定义异常等内容。
17 1
|
1月前
|
Java
Java中的异常链:从根源到解决方案
Java中的异常链:从根源到解决方案
35 0
|
1月前
|
存储 Java 数据库
|
1月前
|
Java
深入了解Java中的锁机制
深入了解Java中的锁机制
|
1月前
|
Java 程序员 编译器
认识Java 的反射机制
反射Reflection被视为动态语言的关键,反射机制允许程序在执行期间借助于Reflection API取得任何类的内部信息,并能直接操作任意对象的内部属性及方法。反射是一种功能强大且复杂的机制。使用它的主要人员是工具构造者,而不是应用程序员。
27 5
|
25天前
|
开发框架 Java API
java反射机制的原理与简单使用
java反射机制的原理与简单使用
17 1
|
13天前
|
安全 Java 调度
深入理解Java中的线程安全与锁机制
【4月更文挑战第6天】 在并发编程领域,Java语言提供了强大的线程支持和同步机制来确保多线程环境下的数据一致性和线程安全性。本文将深入探讨Java中线程安全的概念、常见的线程安全问题以及如何使用不同的锁机制来解决这些问题。我们将从基本的synchronized关键字开始,到显式锁(如ReentrantLock),再到读写锁(ReadWriteLock)的讨论,并结合实例代码来展示它们在实际开发中的应用。通过本文,读者不仅能够理解线程安全的重要性,还能掌握如何有效地在Java中应用各种锁机制以保障程序的稳定运行。
|
18天前
|
Java 程序员 开发者
深入理解Java异常处理机制
在Java编程中,异常处理是确保程序健壮性与稳定性的重要组成部分。本文旨在深度剖析Java异常处理机制的核心概念、结构及其实际应用策略,帮助开发者更好地理解并运用异常处理来优化程序设计。我们将从Java异常体系结构入手,探讨try-catch-finally语句块的执行流程,分析自定义异常的必要性与实现方式,并通过实例演示如何有效地管理和处理异常情况。
23 3
|
25天前
|
设计模式 XML 存储
java中的反射机制
java中的反射机制
12 1