java异常

基本概念

java 程序运行发生了错误,导致程序不能按照预期的进行下去。这时候java异常机制就是为了程序不发生崩溃而提供的一种处理方法,使得在发生异常时,不再按照原先的逻辑进行下去,而是按照异常的处理逻辑执行下去。

程序发生的错误可能包括以下几种:

1、程序在编译的时候发生错误,这种错误一般由于没有按照语法规则要求导致的常见错误

2、程序在运行时发生的错误,这种错误一般在程序的实现时不可见的,但是在程序执行的时候可能会发生的

错误

异常类型

java中所有的java异常类型都是继承于Throwable类型。Throwable有两个子类,分别是Error和Exception,并且也提供了许多常用的方法,如getMessage()toString()printStackTrace()等等。下面对Error和Exception进行解释。

java不同的错误码对应的含义 java错误处理机制_java不同的错误码对应的含义

Error

Error产生的原因一般是由于虚拟机发生错误导致所导致,与程序本身没有关系,程序本身也没有办法进行处理。常见的错误包括,当虚拟机没有资源时,会出现错误OutOfMemoryError,此外,还有NotClassDeFountError,StackOverFlowError等错误。

Exception

Exception分别包括确定性异常和运行时异常(也叫不确定性异常)

  • 非运行时异常:通常包括IOException类,ClassNotFoundException等及其的异常类型,这种异常属于语法范畴内,如果在语法上不进行处理,就会导致编译不能通过,基本上是除RuntimeException及其子类之外的异常。这种异常的处理方式有两种,如果在方法内部自身能处理的就使用try-catch进行捕获,如果自身不能处理的并且是被调用的方法,则可以通过在方法上加上throws进行声明,让调用方进行处理。
  • 运行时异常:是包括RuntimeException及其子类的异常,如ArithmeticException,NullPointerException等等异常,这些异常等均属于运行时发生的异常,即使不加以处理,编译时也能通过,所以可以处理,也可以不处理,这类问题一般是由于程序实现过程中的逻辑问题,和语法没有关系。

异常处理

  • 可查异常:包括非运行时异常,编译器会检查可查异常,如果没有对可查异常进行往上抛出或者try catch,会编译错误。因此,对于可查异常,必须进行捕获或者声明抛出。
  • 不可查异常:包括运行时异常和Error,这些异常不会影响到程序的编译,应该尽可能找出办法解决异常出现的问题,如分母为零时进行除法运算产生的异常。在一些特殊情况下,可以对这种异常进行try catch捕获。因此,对于这些可能导致的不可查异常,可以不进行处理,但如果在一些特殊的情况下发生了这种异常而又不想修改逻辑时,可以进行捕获处理。
  • 异常抛出:
  • throws:当方法内部没办法处理异常时,就需要在方法声明时,使用throws进行抛出异常,让调用者进行异常处理,声明方式如下所示,如果抛出多个异常,则需要用逗号进行隔开,如果直接throws Exception,则表示抛出所有的异常。这种方法是将异常处理交给调用者,但是如果调用者还不能处理的话,可以继续使用throws往上抛出。
public void read() throws Exception1,Exception2{
    //方法逻辑
}
  • 上面所说的throws抛出异常是在可查异常的情况下进行处理,如果是不可查异常,可以不使用throws往上抛出,不影响编译的通过,系统会自动将不可查异常抛出。
  • throw:通过抛出一个实例化异常对象,比如throw new IOException来进行异常处理。当使用throw抛出一个实例化异常对象时,会自动跳过原来要执行的语句,跳转到包含其待捕获的catch语句中(可能是调用者方法内)。当然了,如果在方法内部使用了throw抛出实例化对象,则需要在声明方法时,加上这种实例化对象的异常类型。
  • 异常捕获:
  • try catch:使用方法如下,当在try语句中发生了某个异常时,会自动不执行try语句中后面的语句。从第一个catch开始,进行捕获,当发生的异常与catch括号中捕获的异常一致时,就会自动进入到catch语句中执行异常处理,处理完后,就自动结束整个异常处理过程,后面其它的catch语句不会进行处理了。所以,在进行catch捕获的时候,尽量将一些特定的异常尽量放在上面,将一些异常的父类类型放在后面,这样不会导致一些特定的异常被执行不了。
try {  
	// 可能会发生异常的程序部分 
} catch (Type1 id1){  
	// 捕获并处置try抛出的异常类型Type1  
} catch (Type2 id2){  
	 //捕获并处置try抛出的异常类型Type2  
}
  • try catch finally:使用方法如下,在上面的基础上加了finally处理,当try语句中没有发生异常时,会跳过若干catch语句,直接执行finally语句以及后面的语句;当try语句中发生异常,但是catch括号中没有对应的异常类型时,则捕捉不到这种异常,这时仍然会执行finally中语句,但是不会执行finally后面的语句;当try语句中发生了异常,并且catch语句也进行了捕获,则首先会跳转到对应的catch语句中进行异常处理,执行完后,接着执行finally中的语句,最后执行finally后面的语句。
try {  
	// 可能会发生异常的程序部分 
} catch (Type1 id1){ 
	// 捕获并处置try抛出的异常类型Type1  
} catch (Type2 id2){  
	 //捕获并处置try抛出的异常类型Type2  
} finally {
    //无论try中是不是发生异常,均会执行这里的语句
}

常见java异常

RuntimeException运行时异常

异常类型

描述

ArrayIndexOutOfBoundsException

数组索引越界异常

ArithmeticException

除法运算中,分母为零导致的

IllegalArgumentException

参数非法导致的

NullPointerException

空指针异常

可查异常

异常类型

描述

IOException

输入输出异常

SQLException

数据库操作异常

FileNotFoundException

文件未找到产生的异常