java异常处理
Posted 爽走不解释
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了java异常处理相关的知识,希望对你有一定的参考价值。
java异常简介
程序运行过程中出现不可以预料的错误和bug,导致程序中止或产生了错误的结果,这个现象就叫异常
一、为什么要有异常处理机制?
Java异常机制可以使程序中异常处理代码和正常业务代码分离,保证程序代码更加优雅,并提高程序健壮性。在有效使用异常的情况下,异常能清晰的回答what, where, why这3个问题:异常类型回答了“什么”被抛出,异常堆栈跟踪回答了“在哪”抛出,异常信息回答了“为什么”会抛出。
异常体系图
如图可以看出所有的异常跟错误都继承与Throwable类,也就是说所有的异常都是一个对象。
从大体来分异常为两块:
1、error—错误 : 是指程序无法处理的错误,表示应用程序运行时出现的重大错误。例如jvm运行时出现的OutOfMemoryError以及Socket编程时出现的端口占用等程序无法处理的错误。
2、Exception — 异常 :异常可分为运行时异常跟编译异常
1)运行时异常:即RuntimeException及其之类的异常。这类异常在代码编写的时候不会被编译器所检测出来,是可以不需要被捕获,但是程序员也可以根据需要进行捕获抛出。常见的RUNtimeException有:NullpointException(空指针异常),ClassCastException(类型转换异常),IndexOutOfBoundsException(数组越界异常)等。
2)编译异常:RuntimeException以外的异常。这类异常在编译时编译器会提示需要捕获,如果不进行捕获则编译错误。常见编译异常有:IOException(流传输异常),SQLException(数据库操作异常)等。
java处理异常的机制:抛出异常以及捕获异常 ,一个方法所能捕捉的异常,一定是Java代码在某处所抛出的异常。简单地说,异常总是先被抛出,后被捕捉的。
二、接下来看一下异常的捕获:
(1) try-catch
A:捕获单个异常
try
//程序代码
catch (ExceptionName e1)
//Catch块
B:多重捕获块
try
//程序代码
catch (异常类型1 异常的变量名1)
......
catch (异常类型2 异常的变量名2)
......
catch (异常类型3 异常的变量名3)
......
try:用于监听异常
catch:用于捕获处理异常
try后面的一对大括号内的内容即受到监控的程序,也就是说这一段代码是可能存在异常的,而Catch中由开发者,根据自身推断可能存在的异常,书写对应异常类型以及处理方式,当程序发生异常时,会创建异常对象,并且将异常抛出到此环境外,Java运行时系统会寻找与发生异常所匹配的catch子句,当找到一个对应语句后则不再寻找其他catch块
示例:
public class Demo
public static void main(String[] args)
int a = 520;
int b = 0;
int c;
try
System.out.println("这是一个被除数为0的式子");
c = a / b;
catch (ArithmeticException e)
System.out.println("除数不能为0");
//运行结果
这是一个被除数为0的式子
除数不能为0
(2) try-catch-finally
finally 关键字用来创建在 try 代码块后面执行的代码块无论是否发生异常,finally 代码块中的代码总会被执行,在 finally 代码块中,可以运行清理类型等收尾善后性质的语句,finally 代码块出现在 catch 代码块最后,语法如下:
try
......
catch(异常类型1 异常的变量名1)
......
catch(异常类型2 异常的变量名2)
......
finally
......
无论是否发生异常,fianlly始终都是会运行的
这里就不得不提一个非常重要的注意点,那就是当return遇到finally!
在catch里面有一个return,那么finally会不会被执行呢?
看代码
try
//待捕获代码
catch(Exception e)
System.out.println("catch is begin");
return 1 ;
finally
System.out.println("finally is begin");
======
输出结果:
catch is begin
finally is begin
也就是说会先执行catch里面的代码后执行finally里面的代码最后才return1 ;
再看代码:
try
//待捕获代码
catch(Exception e)
System.out.println("catch is begin");
return 1 ;
finally
System.out.println("finally is begin");
return 2 ;
这次代码中输出结果跟上面是一样的,然而返回的是return 2 ; 原因很明显,就是执行了finally后已经return了,所以catch里面的return不会被执行到。也就是说finally永远都会在catch的return前被执行。(这个是面试经常问到的问题哦!)
注意1、:
对于异常的捕获不应该觉得方便而将几个异常合成一个Exception进行捕获,比如有IO的异常跟SQL的异常,这样完全不同的两个异常应该分开处理!而且在catch里处理异常的时候不要简单的e.printStackTrace(),而是应该进行详细的处理。比如进行console打印详情或者进行日志记录。
注意2、:
异常和错误的区别:异常能被程序本身可以处理,错误是无法处理。
(3) throw/throws
将自己处理不了的,在方法或者语句上声明,告诉调用者,这里有问题
如果一个方法没有捕获到检查性异常,那么该方法就必须使用throws关键字声明(声明抛出多个异常,之间使用逗号隔开),也可以在语句中使用throw关键字抛出一个异常。
public void test() throws Exception
throw new Exception();
从上面这一段代码可以明显的看出两者的区别。throws表示一个方法声明可能抛出一个异常,throw表示此处抛出一个已定义的异常(可以是自定义需继承Exception,也可以是java自己给出的异常类)。
throw跟throws的区别:
A:throws
用在方法声明后,跟的是异常类名
可以跟多个异常类名,用逗号隔开
表示抛出异常,由该方法的调用者来处理
throws表示出现异常的一种可能性,不一定会发生这些异常
B:throw
用在方法体内,跟的是异常对象名
只能抛出一个异常对象名
表示抛出异常,由方法体内的语句处理
执行throw则一定抛出了某种异常
三、自定义异常
Java内置的异常类,基本可以满足我们在编程中遇到的大部分异常情况,此外我们还可以自定义异常类,只需要继承Exception类即可
基本步骤:
- 创建自定义异常类
- 在方法中通过throw抛出异常对象
- 在当前抛出异常的方法中处理异常,可以使用try-catch语句捕获处理
也可以在方法声明处使用throws将异常抛给方法调用者 - 在出现异常方法的调用者中捕获并且处理异常
class MyException extends Exception // 自定义的类
MyException(String s)
super(s);
class Demo
void method() throws MyException
throw new MyException("Wrong"); // 抛出自定义的类
class DemoTest
public static void main(String[] args)
try
new Demo().method();
catch(MyException e)
System.out.println(e.getMessage());
//运行结果
Wrong
总结一波
异常就是在程序发生异常时,强制终止程序运行,并且将异常信息返回,由开发者决定是否处理异常 简单说一下这个异常机制的过程:
当程序无法运行后,它会从当前环境中跳出,并且抛出异常,之后,它会先new一个异常对象,然后在异常位置终止程序,并且将异常对象的引用从当前环境中返回,这时候异常处理机制接管程序,并且开始寻找可以继续执行程序的恰当位置
欢迎留言评论
以上是关于java异常处理的主要内容,如果未能解决你的问题,请参考以下文章