java异常

一、异常继承结构

java异常_第1张图片

Error错误,一般指虚拟机相关的问题,如系统崩溃、虚拟机出错误等,应用程序无法处理这些错误

一般说的异常处理指的是Exception


二、使用finally回收资源

除非在try块、catch块中调用了退出虚拟机的方法(System.exit(0)),否则不管在try块、catch块中执行怎样的代码,出现怎样的情况,异常处理的finally总会被执行


三、Checked异常和Runtime异常体系

不是RuntimeException类及其子类的异常被称为Checked异常;

只有Java提供了Cheched异常,Checked异常体现了Java的设计哲学:没有完善错误处理的代码根本不会被执行;

       Checked异常的处理有两种:(1)try....catch(2)定义方法时声明抛出该异常


四、使用throws抛出异常

当前方法不知道应该如何处理这种异常,应该有上一级调用者处理;如果main方法不知道应该如何处理这种异常,也可以使用throws声明抛出异常,该异常将交给JVM进行处理(打印异常跟踪站信息、并终止程序运行)。 throws可以抛出多个可能存在的异常


五、使用throw抛出异常

当程序出现错误时,系统会自动抛出异常;除此之外,Java也允许程序自行抛出异常,自行抛出异常使用throw语句完成,throw语句抛出的不是异常类,而是一个异常实例,而且每次只能抛出一个异常实例

try{
	if("有错误"){//是应用程序错误,不是系统错误
		throw new Exception("....");
	}
}
catch(Exception e){
	....
}
如果throw语句抛出的异常是Checked异常,则该throw语句要么处于try块中,显示抓捕该异常,要么放在一个带throws声明抛出的方法里,即把该异常交给该方法的调用者处理


finally块里面的代码什么时候被执行?

 (1)finally保证无论出现什么情况,finally块里面的代码总会被执行,因此一般用来回收资源;

   (2)当tr、catch都有return语句时,先执行finally里面的代码,然后执行try里面的return

finally块是不是一定会执行?

     不一定会执行。

(1)当程序进入try语句之前就有异常时,会直接结束

int i=5/0;//出现异常,没有执行try块
try{}
catch(){}
finally{}
(2)当程序在try块中强制退出也不会去执行finally块中的内容

try{
     System.exit(0);
}
catch(){}
finally{}//finally块没有被执行


Error与Exception的区别

     Error表示程序在运行期间出现了非常严重的错误,并且错误是不可以恢复的,属于JVM层次的严重错误,编译器不会去检查Error是否被处理,会导致程序终止执行。如OutOfMemoryError、ThreadDeath等错误;   Exception表示可以恢复的异常,是编译器可以捕捉到的,包括Runtime exception和Checked exception

 

checked异常和Runtime异常的区别

      checked 异常也就是我们经常遇到的IO异常,以及SQL异常都是这种异常。对于这种异常,JAVA编译器强制要求我们必需对出现的这些异常进行catch。所以,面对这种异常不管我们是否愿意,只能自己去写一大堆catch块去处理可能的异常。

      runtime exception,也称运行时异常,我们可以不处理。当出现这样的异常时,总是由虚拟机接管。出现运行时异常后,系统会把异常一直往上层抛,一直遇到处理代码。如果没有处理块,到最上层,如果是多线程就由Thread.run()抛出,如果是单线程就被main()抛出抛出之后,如果是线程,这个线程也就退出了。如果是主程序抛出的异常,那么这整个程序也就退出了

      如果不想终止,则必须扑捉所有的运行时异常,决不让这个处理线程退出。队列里面出现异常数据了,正常的处理应该是把异常数据舍弃,然后记录日志。不应该由于异常数据而影响下面对正常数据的处理。在这个场景这样处理可能是一个比较好的应用,但并不代表在所有的场景你都应该如此。如果在其它场景,遇到了一些错误,如果退出程序比较好,这时你就可以不太理会运行时异常,或者是通过对异常的处理显式的控制程序退出。


你可能感兴趣的:(java异常)