Java16-java语法基础——异常

Java16-java语法基础——异常

一、异常概念

1、异常:应用程序在运行过程中出现的错误或非正常的意外情况,即虚拟机的通常操作中可能遇到的异常,是一种常见的运行错误。

2、原因:数组越界、空指针的访问、试图读取不存在的文件、数学除零

3、异常处理机制由编译器强制执行

4、Java编译器要求方法必须声明跑出可能发生的非运行时异常,但并不要求必须声明抛出未捕获的运行时异常。

5、完全不出错是不可能的,不要刻意回避,要多想意外发生后如何去处理它。

二、为什么用异常

1、运行时发生错误,如果没有异常处理机制,程序将会终止并是使所有已分配资源的状态保持不变,这样会导致资源泄露

  如:不能收回某个程序分配的内存,以供其它程序使用。

例子:

public class ExceptionRaised{

   public ExceptionRaised(){

  }

  public int calculate(int operand1,int operand2){
     int result = operand1/operand2;  //第5行
     return result;
  }

  public static void main(String[] args){
     ExceptionRaised obj = new ExceptionRaised();
     int result = boj.calculate(9,0);
     System.out.println(result);
  }
}

解析:在运行到第五行时,发生错误,程序突然终止并将控制交给操作系统。

三、异常的分类

  在java语言中,“异常”可以看作是一个类,异常类的根是Throwable。Throwable是类库java.lang包中的一个类,并派生出Exception类和Error类两个子类。

    异常分为:Error和Exception(Exception包括RuntimeException和其他Exception等)

      Error——Java运行系统中的内部错误以及资源耗尽的情况。
      Exception——RuntimeException及其子类(编程导致的异常)、其它Exception类。

1、Error体系 :

  Error类体系描述了Java运行系统中的内部错误以及资源耗尽的情形。应用程序不应该抛出这种类型的对象(一般是由虚拟机抛出)。如果出现这种错误,除了尽力使程序安全退出外,在其他方面是无能为力的。所以,在进行程序设计时,应该更关注Exception体系。

2、Exception体系包括RuntimeException体系和其他非RuntimeException的体系 :

  (1)RuntimeException:RuntimeException体系包括错误的类型转换数组越界访问试图访问空指针等等。处理RuntimeException的原则是:如果出现RuntimeException,那么一定是程序员的错误。例如,可以通过检查数组下标和数组边界来避免数组越界访问异常。

  (2)其他非RuntimeException(IOException等等):这类异常一般是外部错误,例如试图从文件尾后读取数据等,这并不是程序本身的错误,而是在应用环境中出现的外部错误。

四、异常的层次结构

 

五、Java异常类

 

六、异常的捕获

1、捕获异常。通过try catch方法,catch子句中防止处理异常的语句。

2、声明异常。在方法名后面加上throws Exceptionname,..., 方法本身只是抛出异常,由函数调用者来捕获异常。

注意:

(1)Java程序在执行过程中如出现异常,会自动生成一个异常类对象,该异常对象将被提交给Java运行时系统,这个过程称为抛出(throw)异常。

(2)当Java运行时系统接收到异常对象时,会寻找能处理这一异常的代码并把当前异常对象交给其处理,这一过程称为捕获(catch)异常。

(3)如果Java运行时系统找不到可以捕获异常的方法,则运行时系统将终止,相应的Java程序也将退出。

(4)对于RuntimeException,通常不需要我们去捕获,这类异常由Java运行系统自动抛出并自动处理。

七、处理异常

 

1、try和catch块

 

1、try-catch异常处理语句:

try{
    程序段;
}catch(异常类对象名){
    异常处理代码;
}

2、嵌套try-catch块

try{
    程序段;
    try{
        程序段;
    }catch(异常类对象名){
        异常处理代码;
    }
}catch(异常类对象名){
    异常处理代码;
}

(1)有时块的一部分导致一个错误,而块本身也可能导致一个错误,必须将一个异常嵌套在另一个异常处理机制中

(2)从内层try语句寻找与异常匹配的catch语句,如无,检查下一个,从里到外,直到最后一个catch

3、多重catch块

try{
   程序段;
}catch(异常类1 对象名){
   处理代码;
} catch(异常类2 对象名){
   处理代码;
} catch(异常类3 对象名){
   处理代码;
}

注意:

(1)一段代码可能会生成多个异常

(2)当引发异常时,会按顺序来查看每个 catch 语句,并执行第一个类型与异常类型匹配的语句

(3)执行其中的一条 catch 语句之后,其他的 catch 语句将被忽略    

(4)使用多重 catch 语句时,异常子类一定要位于异常父类之前 ,否则,控制权将永远传不到子类,将产生一个不能到达的代码,即产生错误

4、finally块

  finally 是java异常处理提供的另一个关键字,通俗的说finally是异常处理语句结构的一部分,表示无论什么情况都要执行的模块。finally语句的主要作用是在try或catch转到其他部分前做的一些“善后”工作。比如:关闭打开的文件,释放链接、内存等系统资源。

  finally语句的执行是一种无条件的操作,无论在哪种异常下都会执行,即使try或catch模块中有continue、return、break等关键字,或者是有throw语句,程序都会执行finally 语句。

  有时需要清理代码,但程序已经停止运行,使用finally 块可使程序不管发生什么异常都将执行清理代码操作。

  每个try语句至少有一个catch子句或finally子句。

猜你喜欢

转载自www.cnblogs.com/luoyu113/p/9466394.html