Java的异常理解

本文围绕Java异常处理展开,介绍了异常的定义,指出Java程序运行时的非正常现象分为错误和异常,异常可由代码调整使程序继续运行。还阐述了异常处理的五个关键字,以及使用时的注意事项。最后提及异常处理中存在的问题及解决办法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1.什么是异常

        在Java程序运行时,常常会出现一些非正常的现象,这种情况称为错误。根据其性质分为错误和异常。Java程序中(无论谁写的代码),所有抛出的(throw)的异常都必须从Throwable派生而来。类Throwable有两个子类:Error和Exception。如下结构图:

      一般来说,最常见的错误有程序进入死循环、内存泄漏等。这种情况下,程序运行时本身无法解决,只能通过其他程序的干预。Java对应的类为Error类。Error类对象由Java虚拟机生成并抛弃(通常情况下Java程序不对这类异常进行处理)。

    异常是程序执行时遇到的非正常情况或意外。一般比如:代码或调用的代码(如共享库)中有错误,操作系统资源不可用,公共语言运行库遇到意外情况(如无法验证代码)等。常见的有数组下标越界、算法溢出(超出数值表达范围)、 除数为零、无效参数、内存溢出等。这种情况不像错误类那样,程序运行时本身无法解决,由异常代码调整程序运行方向,使程序仍可以继续运行,直到正常结束。

       Java异常对应的类为Exception类。Exception类对象是Java程序处理或抛弃的对象,它有各种不同的子类分别对应不同的异常类型。Java编译器要求程序必须捕获或声明所有的非运行时异常,但对运行时异常可以不做处理。其中类RuntimeException代表运行时由Java虚拟机生成的异常,原因是编程错误。其他则为非运行时异常,原因是程序碰到了意外情况,如输入/输出异常IOException等。

2.异常关键字

Java异常处理的关键语句有五个:try、catch、throw、throws、finally。其中,try、catch、finally三个语句注意以下问题:

1)try、catch、finally三个语句块均不能单独使用,三者可以组成try...catch...finally、try...catch、try...finally三种结构,catch语句可以有一个或多个,finally语句最多一个。

2)try、catch、finally三个代码块中变量的作用域为代码块内部,分别独立而不能相互访问。如果要在三个块中都可以访问,则需要将变量定义到这些块的外面。

3)若多个catch块,只会匹配其中一个异常类并执行catch块里的代码,而不会再执行别的catch块,并且匹配catch语句的顺序是由上到下的。

4)执行的返回值会最终被finally中的返回值覆盖掉如下代码:

import org.junit.Test;

/**测试捕获异常的执行顺序
 * @author QuLei
 *
 */
public class TestException {
	@Test
	public void test1() {
		int i =test();
		System.out.println(i);
	}
	/**测试try、catch、finally的执行顺序以及return的返回值,前
	 * 面的返回值会被finally中的覆盖掉
	 * @return 
	 */
	@SuppressWarnings("finally")
	public  int test() {
		int i = 1;
		try {
			i = 1+3;
			//i = 1/0;
			System.out.println(i);
			return i;
		} catch (Exception e) {
			// TODO: handle exception
			e.printStackTrace();
			return 1;
		}finally {
			return 2;
		}
	} 
}

5).throw、throws关键字的区别。

        throw关键在用于方法体内部,用来抛出一个Throwable类型的异常。如果抛出了检查异常,则还应该在头部声明方法可能抛出的异常类型。该方法的调用者也必须检查异常。如果所有的方法都层层上抛获取的异常,最终JVM会进行处理,处理也很简单,就是打印异常消息和对堆栈信息。如果抛出的是Error或RuntimeException,则该方法的调用者可以选则处理该异常。

        throws关键字用于方法外部的方法声明部分,用来声明方法可能会抛出某些异常。仅当抛出了检查异常,该方法的调用者才必须处理或重新抛出该异常。

3.异常处理中的问题

1)过于庞大的try块

          尽可能的设置多个异常抛出点来解决。异常从产生点开始,到被捕获后终止的全过程中,实际是一个传值的过程,所以,应根据实际来合理的控制检测异常个数。catch语句表示会出现某种异常,而且希望能够处理该异常。所以在catch语句中尽量指定具体的异常类型。

2)异常处理的完整性

   在Java中,如果一个函数被调用可能会向上抛一个异常,那么,它就必须在该函数的声明中显示地注明(采用trhrows关键字)。

3)RuntimeException可以捕获处理,也可以交给虚拟机处理。       

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值