您的位置:首页 > 编程语言 > Java开发

Java异常处理机制以及try-catch-finally-return执行顺序

2017-05-12 23:33 1866 查看

一、异常:

在Java语言中,将程序执行中发生的不正常情况称为“异常”,异常是一种对程序运行过程中发生错误时进行通知的机制。

如:网络连接失败、用户输入错误或打开文件失败等。异常以对象的形式出现,不同的异常对象中封装了相应的错误信息

  

二、JAVA异常类:

  



Java语言提供了两大类异常:

编译时异常(受检异常)

运行时异常(非受检异常)

编译时异常:指程序中必须接受检查和处理的异常,由Exception 类表示。

运行时异常:程序中可以不接受检查和处理,或致命性错误异常,由RuntimeException类或Error类表示。

  

检查性异常——程序正确,但因为外在的环境条件不满足引发。例如:用户错误及I/O问题—-程序试图打开一个并不存在的远程Socket端口。这不是程序本身的逻辑错误,而很可能是远程机器名字错误(用户拼写错误)。对商用软件系统,程序开发者必须考虑并处理这个问题。JAVA编译器强制要求处理这类异常,如果不捕获这类异常,程序将不能被编译。

运行期异常——这意味着程序存在bug,如数组越界,0被除,入参不满足规范…..这类异常需要更改程序来避免,JAVA编译器强制要求处理这类异常。

 

错误——一般很少见,也很难通过程序解决。它可能源于程序的bug,但一般更可能源于环境问题,如内存耗尽。错误在程序中无须处理,而由运行环境处理。

三、try-catch-finally-return执行顺序:

public class TextException {

public static void main(String[] args) {
Object handler = handler();
System.out.println(handler.toString());
}

public static Object handler(){
try {
System.out.println("执行方法");
//System.out.println("执行方法"+5/0);

return "方法正常运行结果";

}catch (Exception e){

//System.out.println("方法异常");
System.out.println("方法异常"+5/0);

return "方法异常运行结果";
}finally {

System.out.println("执行方法finally");
//System.out.println("执行方法finally"+5/0);

//return "方法finally结果";
}
}
}


1、try正常执行,finally中无return

运行结果:

执行方法
执行方法finally
方法正常运行结果

Process finished with exit code 0


2、try正常执行,finally中有return或者异常

运行结果:

执行方法
执行方法finally
方法finally结果

Process finished with exit code 0


小结:try代码块里的东西正常执行,在return之前一定会执行finally里的代码块,如果finally里return了或者异常,那方法就结束啦,不会再执行try里的return.

剩下的就不一一列举啦,运行代码就知道啦,总结如下:

不管有没有发生异常,finally里的代码块一定会在try或者catch之后执行,不管try或者catch中是否return或者异常,如果finally中发生return或者异常等结束方法的行为,那方法就结束啦,否则finally执行完后,再正常执行。

在线程中通过UncaughtExceptionHandler来处理未受控制的异常,不过tomcat和SpringMVC 都对未受控制的异常做了默认处理,

当我们使用自己的线程或者线程池的时候注意对未受控制的异常进行统一处理,默认异常的处理机制如下:

1、未受控制的异常会首先找当前线程的UncaughtExceptionHandler,可以通过setUncaughtExceptionHandler设置线程的异常处理器。

2、如果没在当前线程找到UncaughtExceptionHandler,就会去ThreadGroup中去找。

3、如果没在ThreadGroup中找到,就会去JVM中去找,如果还没找到,就会结束程序,打印错误信息。

注:将实现UncaughtExceptionHandler函数式接口的对象,传递给setUncaughtExceptionHandler方法,可设置线程的异常处理器。

@FunctionalInterface
public interface UncaughtExceptionHandler {
void uncaughtException(Thread t, Throwable e);
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: