欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

Java异常与处理机制

程序员文章站 2022-06-05 20:21:30
Java的异常层次体系 Java的所有异常对象都派生自Throwable类,下层有两个分支:error和exception。 Error分支描述Java运行时系统内部错误或资源耗尽错误,遇到派生自Error的错误,程序除了通告给用户并尽量安全退出外也无能为力。 Exception分支才是程序员主要在 ......

java的异常层次体系

Java异常与处理机制

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

  • error分支描述java运行时系统内部错误或资源耗尽错误,遇到派生自error的错误,程序除了通告给用户并尽量安全退出外也无能为力。
  • exception分支才是程序员主要在意的异常,它又分为runtimeexception和ioexception两个分支。
    1. runtimeexception通常是由于程序错误导致的。
    2. 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
  1. try块代码无异常,执行顺序为1,2,5,6
  2. try块代码中出现异常,catch语句中没有出现异常,执行顺序为1,3,4,5,6
  3. 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虚拟机默认断言是关闭的,因此在项目发布后不影响程序的运行。

断言的使用

  1. assert 条件;
  2. 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);

Java异常与处理机制


如果文章有错的地方欢迎指正,大家互相交流。感谢关注公众号jsjcoding

Java异常与处理机制