浅谈Java异常

来源:互联网 发布:淘宝店主怎么开直播 编辑:程序博客网 时间:2024/06/05 08:31

异常的基本概念

所谓异常就是程序在运行的过程中发生的一些不正常的事件(除零溢出,下标越界...)

异常导致的结果:Java程序的执行过程中如果出现异常事件,可以生成一个异常类,该异常对象封装了异常事件的信息。并将其提交给Java的运行时系统,这个过程成为抛出异常,不处理直接导致程序中断。

良好的程序应该在程序异常发生时提供处理这些异常的方法,使得程序不会因为异常的发生而阻断或产生不可预见的结果。
上图为异常的大致体系,由上图我们可以看出,Throwable是所有异常的祖先,同时异常又根据其继承体系产生Error和异常,随后我们看到最底下的又把Error和RuntimeException指向UncheckedException。因此,在Java中异常主要分为两大类:UncheckedException和CheckedException。

CheckedException
异常名称:编译异常,非运行时异常,又名受查异常
包含范围:Exception及其子类(不包括RuntimeException及其子类)
异常的来源:由代码控制能力之外的因素导致的运行时错误,例如编写代码时关键字单词写错
是否需要处理:必须要处理,否则编译不通过

UncheckedException
异常名称:运行时异常,又名非受查异常
包含范围:Error和RuntimeException及其子类
异常的来源:RuntimeException一般代表编程错误
是否需要处理:可以不处理

异常处理机制

Java的异常通过两种机制来处理
1.捕获:try(监控区域)-catch(捕获处理异常)-finally(善后处理)
2.抛出:throw(抛出异常,手动抛出异常)  throws(声明异常,声明方法可能要抛出的异常)

try-catch-finally格式:
try{
       //此方法块中放的是要检测的Java代码,可能会抛出异常,也可能运行正常
}catch(异常类型){
  //当try代码块中出现异常时,此处接收抛出的异常对象,寻找能处理这一异常catch块来进行处理,
   可以有多个 catch代码块
}finally{
  //不管系统有没有抛出异常,都会执行的部分,一般用来释放资源
}

下面说三个一下几个关键字的优先级:
System.exit(0)   >   finally    >return

package com.pyj.exception;import java.util.InputMismatchException;import java.util.Scanner;public class TryCatchFinallyDemo {public static void main(String[] args) {//testTryFinally(null);System.out.println("输入一个数字");Scanner input = new Scanner(System.in);int res = 0;try {int number = input.nextInt();res = 10/number;}catch(InputMismatchException e) {//这是对用户键盘输入字符的异常处理,如果用户输入的字符不是数字,就输入错误System.out.println(e.getMessage());}catch(ArithmeticException e) {//这是算术错误,即在相除的时候,如果number=0,则会报错System.out.println(e.getMessage());}catch(Exception e) {//其他异常System.out.println(e.getMessage());}finally {//释放资源,比如关闭打开的文件,删除一些临时文件System.out.println(res);}}public static void testTryFinally(String context) {try {System.out.println(context.length());}finally {System.out.println("END");}}}

1.throw用于手动抛出异常,可以在任意位置手动抛出异常
2.throws用于在方法上标识要暴露的异常,抛出的异常交由调用者处理

区别:
throw用在方法内,后面跟上的要出的异常类对象
throws修饰方法,告诉调用者此方法可能会抛出异常,后面跟上可能要抛出的异常类名
package com.pyj.exception;public class ExceptionDemo {public static void main(String[] args) {Car car = new Car();try {car.drive(16);}catch(Exception e) {System.out.println("错误信息:"+e.getMessage());}System.out.println("Come on baby!");}}class Car{public void drive(int age) throws Exception {if(age < 16) {throw new Exception("未成年,不能开车");}else {System.out.println("开车了");}}}


自定义异常
自定义异常必须从已有异常类继承,新建的异常类型最简单的方法就是让编译器产生默认的构造方法,对于一场来说最重要的就是异常类名。
通常为异常类定义一个接收字符串参数的构造犯法,字符串参数描述异常信息
public class CustomException extends Exception{private String message;//描述异常信息public CustomException(String message) {this.message = message;}public String getMessage() {return message;}}


原创粉丝点击