学习中的菜鸟之异常处理
秋高气爽的今天(嗯.. 今天是哪天呀),我用我近视的眼睛正在看某些该看的东西(别误会,那是老师留的另一个作业),突然宿舍的某某同学说老师在催blog文章了。
本来计划要看那些非常吸引我,让我激动万分的。。。。。网上的一些内容的我,为了解决这个异常 临时决定顶住全宇宙的压力先写blog文章再那啥那啥。(嗯。就是这样)
就像 生活中难免有些意外一样,程序中也会有一些意外的情况导致程序中断,而这些意外的情况就是程序中的异常。
异常的定义 课本版:在程序的运行过程中所发生的不正常的事件,如。。。各种错误等。异常会中断正在运行的程序。
程序员就是写可以运行的程序的,异常居然干掉了程序(让程序中断-_-!)!!!!!
这不是砸人饭碗么。必须跟它分个高下了。
5大绝招 之 try catch finally throw throws
作用为:
throw:在方法体内 抛出异常对象,且只能是一个。 //可以单独使用
throws:在方法的参数列表后面 ,声明方法抛出了异常 ,后面可以跟多个异常的类型。 //不可以单独使用
try-catch-finally一般连用,catch 和finally为可选,但至少有一个。
try:放置有可能出现异常的代码,,如一切正常 则不抛出异常,如出现不合理并且没有用判断限制的情况 抛出异常
catch(异常类型 ):捕获异常,如没有异常不被执行。 注:catch块要捕获异常需要声明的异常类型与发生的异常相符,catch可以有多个,子类在父类的前面(类型相容,作用面积大的那个在后面)。
finally:无论是否有异常或者任何 ( 除退出java虚拟机System.exit(1) )情况都会被执行。
异常类型的简单架构 课本版 :
(图为引用网上)
Throwable:异常类的基类
Error : 严重错误类,一般由虚拟机抛出。这种错误我们除了尽量让程序安全退出外,没有太好的办法(我没有)
Exception :由java程序抛出的异常的直接父类
RuntimeException:运行时错误,不要求程序必须进行异常处理,如出现异常,会终止程序。
Checked异常:非运行时错误,要求必须进行异常处理,否则连编译都无法通过。
常见的几个异常类型:
ArithmeticException:算术错误
ArrayIndexOutOfBoundsException:下标越界
NullPointerException:未将对象实例化 ,或对象为null
InputMismatchException:欲得到的数据类型与实际输入的数据类型不匹配
I(i) ll(L)egalArgumentException:方法具有非法的参数
ClassCastException:对象强制类型转换出错
NumberFormatException:数字格式 转换异常
ClassNotFoundException:不能加载所需的类
下面是老师总结的几种使用try-catch-finally的情况
1、不管有木有出现异常,finally块中代码都会执行;
2、当try和catch中有return时,finally仍然会执行;
3、finally是在return后面的表达式运算后执行的(此时并没有返回运算后的值,
而是先把要返回的值保存起来,不管finally中的代码怎么样,返回的值都不会改变,任然是之前保存的值),
所以函数返回值是在finally执行前确定的;
4、finally中最好不要包含return,否则程序会提前退出,返回值不是try或catch中保存的返回值。
举例:
情况1:try{} catch(){}finally{} return;
显然程序按顺序执行。
情况2:try{ return; }catch(){} finally{} ;
程序执行try块中return之前(包括return语句中的表达式运算)代码;
再执行finally块,最后执行try中return;
finally块之后的语句return,因为程序在try中已经return所以不再执行。
情况3:try{ } catch(){return;} finally{} return;
程序先执行try,如果遇到异常执行catch块,
有异常:则执行catch中return之前(包括return语句中的表达式运算)代码,再执行finally语句中全部代码,
最后执行catch块中return. finally之后也就是4处的代码不再执行。
无异常:执行完try再finally再return.
情况4:try{ return; }catch(){} finally{return;}
程序执行try块中return之前(包括return语句中的表达式运算)代码;
再执行finally块,因为finally块中有return所以提前退出。
情况5:try{} catch(){return;}finally{return;}
程序执行catch块中return之前(包括return语句中的表达式运算)代码;
再执行finally块,因为finally块中有return所以提前退出。
情况6:try{ return;}catch(){return;} finally{return;}
程序执行try块中return之前(包括return语句中的表达式运算)代码;
有异常:执行catch块中return之前(包括return语句中的表达式运算)代码;
则再执行finally块,因为finally块中有return所以提前退出。
无异常:则再执行finally块,因为finally块中有return所以提前退出。
最终结论:任何执行try 或者catch中的return语句之前,都会先执行finally语句,如果finally存在的话。
如果finally中有return语句,那么程序就return了,所以finally中的return是一定会被return的,
编译器把finally中的return实现为一个warning。
下面请看一个面试题做为结尾:
public class FinallyTest
{
public static void main(String[] args) {
System.out.println(new FinallyTest().test());;
}
static int test() {
int x = 1;
try
{
x++;
return x;
}
finally
{
++x;
}
}
}
这题的结果是2。
前边不是说了,只要程序不中断,finally一定会执行么,那么为什么不是3呐?
原因是:finally块虽然会被执行,但是如例所示try块或者catch块中有了return,那么当时要返回的值已经在进入finally之前就确定了,再finally块里就算改变了变量的值,返回的值也不会改变。(如果return的值是固定的如常量或直接就是一个值那么程序不会先到ruturn语句,如为变量是不固定的值那会先到ruturn语句确定了值后再执行finally块的代码)