Java中的异常

Java中的异常


初识异常
异常是指在程序的运行过程中发生的不正常事件,比如所需要的文件找不到、数据源无法连接、网络连接不通或连接中断、算术被零除运算错误、数组下标越界、空指针异常,类型转换异常等。
下面通过下面的代码来认识程序中的异常:
1.png-29.7kB
代码分析:
这段代码中,用户输入2个数字,除数不能为零,正常情况下,运行结果如下:
2.png-6.9kB

但是,如果用户没有按照要求进行输入,如果被除数没有输入数字,而是输入了“abc”,则程序将会发生异常,运行结果如下:
3.png-22.7kB
输出告诉我们:在ExTest类的main函数中,出现了输入格式不匹配(例如要数字但实际输入不是数字)异常(java.util.InputMismatchException)。

若除数输入为“0”,则程序运行时也将发生异常,运行结果如下:
4.png-12.7kB
输出告诉我们:在ExTest类的main函数中,出现了算术错误(被除数被零除)异常(java.lang.ArithmeticException)。

以上代码如果通过if-else语句进行异常处理,有以下缺点。

  • 代码臃肿,增加了大量处理异常的代码。
  • 浪费时间,有一些时间分散到异常处理上,影响开放效率。
  • 很难穷举所有的异常,程序不健壮。
  • 异常处理代码和业务代码交织在一起,影响可读性,增加维护难度。

Java提供了专门的异常处理机制,刻服了以上通过if-else来解决的异常的缺点。

异常类
Java中的异常有很多类型,所有类型都有一个共同的父类Throwable。以Throwable为根,Java定义了非常多的异常类,表示各种类型的异常。
link.png-187kB
Throwable是所有异常的基类,它有两个子类:Error和Exception。

  1. Error类:表示系统错误或资源不足,如内存溢出、虚拟机错误。由Java系统使用,应用程序不应该抛出这种类型的错误。
  2. Exception类:表示应用程序错误,如算术被零除运算错误、数组下标越界、空指针异常等。Exception又可分为两大类异常。

运行时异常:包括RuntimeException及其所有子类。不要求程序必须对它们进行处理。
编译(checked)异常(非运行时异常)除了运行时异常外的其他从Exception类继承来的异常类。

以下为一些常见的异常类。

  • NullPointerException
    空指针异常,操作一个 null 对象的方法或属性时会抛出这个异常。

  • OutofOutofMemoryError
    内存出现异常的一种异常,这不是程序能控制的。

  • IOException
    在读写磁盘文件、网络内容的时候经常会生的一种异常,这种异常是受检查异常,需要进行手工捕获。

  • FileNotFoundException
    文件找不到异常,如果文件不存在就会抛出这种异常。

  • ClassNotFoundException
    类找不到异常,这是在加载类的时候抛出来的,即在类路径下不能加载指定的类。

  • ClassCastException
    类转换异常,将一个不是该类的实例转换成这个类就会抛出这个异常。

  • NoSuchMethodException
    没有这个方法异常。

  • ArrayIndexOutOfBoundsException
    数组下标越界异常。

  • ArithmeticException
    算术异常,发生在数字的算术运算时的异常,如一个数字除以 0 就会报这个错。

  • SQLException
    SQL异常,操作数据库时发生的异常。

异常处理机制

  • 使用try-catch处理异常

代码如下:
5.png-36.5kB
这段代码中,我们使用try/catch捕获异常,如果用户按照要求输入正确,程序执行完try语句块的代码,没有发生异常,则catch语句块中的代码被忽略。如果在try语句块中发生异常,那么造成异常的那一行剩下的代码都将被忽略,而相应的catch语句块将会被执行。

如果用户在控制台中输入了被除数为“abc”,运行结果如下:
6.png-5.1kB

如果用户在控制台中输入了除数为“0”,运行结果如下:
7.png-6.7kB

  • 使用try-catch-finally处理异常
    代码如下:
    8.png-37.7kB
    try-catch-finally语句块的执行流程大致分为如下两种情况:如果在try语句块中没有发生异常,finally语句块也会被执行。如果try语句块在执行过程中发生异常,无论这种异常能否被catch语句块捕获到,都将执行fianlly语句中的代码。即使在catch语句中存在return语句,finally语句块中的语句也会执行。发生异常时的执行顺序是,先执行catch语句块中return之前的语句,再执行finally语句块中的语句,最后执行catch语句块中的return语句退出。运行结果如下:
    9.png-7.3kB

  • 使用多重catch处理异常
    代码如下:
    10.png-54.1kB
    这个程序已知在运行时可能会引发多个异常,这时可以在一个try语句块后面跟多个catch语句块分别处理不同的异常。排列顺序必须是从子类到父类,最后一个一般都是Excteption类。

  • 使用throws抛出异常
    Java中用throws声明某个方法可能抛出的各种异常以通知方法调用者。throws可以同时声明多个异常,异常之间用逗号隔开。
    代码如下:
    11.png-61kB

  • 使用throw抛出异常
    代码如下:
    12.png-49.1kB
    运行结果如下:
    13.png-4kB

这里注意一点,throw 和 throws的区别:
a.作用不同:throw用于程序员自行产生并抛出异常,throws用于声明该方法内抛出异常。
b.使用的位置不同:throw位于方法体内部,可以作为单独语句使用;throws必须跟在方法参数列表的后面,不能单独使用。
c.内容不同:throw抛出一个异常对象,是能是一个;throws后面跟异常类,可以跟多个。

  • 自定义异常
    除了Java API中的异常类型,我们可以自定义异常类。自定义异常类,方法是继承Exception或者RuntimeException。代码如下:
    MyException类
    14.png-31.2kB
    Person类
    15.png-25.5kB
    AppExTest类
    16.png-24kB
    运行结果如下:
    13.png-4kB

  • 异常链
    在异常处理时,常常会在捕获一个异常后抛出另外一个异常,并且希望把异常原始信息保存下来,这被称为异常链。在JDK1.4以前,程序员必须自己编写代码来保存原始异常信息。JDK1.4推出以后,正好解决了这个问题,它虽然创建了新的异常,但却保留了原有异常的信息。例如:
    17.png-51kB
    运行结果如下:
    18.png-5.3kB

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Java异常机制是一种用于处理程序执行期间可能出现的错误情况的机制。Java异常分为两类:受检异常(Checked Exception)和非受检异常(Unchecked Exception)。其,受检异常必须在代码进行捕获和处理,否则编译器将会报错。而非受检异常则不需要在代码进行捕获和处理,但是如果不进行处理,会导致程序的异常终止。 Java异常机制通过抛出异常对象来表示程序出现的异常情况,通常情况下,异常对象包含了异常的类型、异常的消息以及异常发生的位置等信息。当程序执行过程出现异常情况时,就会抛出相应的异常对象,这个异常对象会被传递给调用栈上的上层方法,直到被捕获或者到达程序的顶层方法。 Java异常机制主要由三个关键字来实现:try、catch和finally。try包含可能抛出异常的代码,catch用于捕获并处理异常finally则用于执行一些必须要完成的代码,无论是否抛出异常都会执行。 下面是一个简单的Java异常处理的例子: ``` public class ExceptionDemo { public static void main(String[] args) { try { int num = Integer.parseInt(args[0]); System.out.println("10 / " + num + " = " + (10 / num)); } catch (ArithmeticException e) { System.out.println("除数不能为0"); } catch (NumberFormatException e) { System.out.println("请输入数字"); } catch (ArrayIndexOutOfBoundsException e) { System.out.println("请至少输入一个参数"); } finally { System.out.println("程序执行完毕"); } } } ``` 在这个例子,我们使用了try-catch-finally关键字来处理用户输入的参数,当输入参数不满足条件时,就会抛出相应的异常。catch用于捕获并处理异常finally则用于执行一些必须要完成的代码,无论是否抛出异常都会执行。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值