异常就是程序在运行时出现的错误。
为了程序的健壮性,在出现异常的时候,我们要对异常进行处理。
异常主要产生原因:
1.用户输入数据错误
2.访问的文件不存在
3.网络通信链接中断
4.jvm内存溢出
在发生异常事件的时候,会抛出一个异常对象。该对象封装了一个异常事件的信息,并交给java运行时系统,这个过程叫做:抛出。
Error错误是程序员处理不了的异常。
RuntimeException异常类是可以处理也可以不处理的异常。
IOException异常类是必须要处理的异常,否则编译不过。
Throws与throw用法的区别:
throws是一种方法可能抛出异常的声明。他定义在方法名上:可以写出好多种并行的可能产生的异常类
void test() throws RuntimeException,Exception
{
System.out.println("3/0="+(3/0));
}
但是他真的只是抛出而并没有进行异常处理。。
throw用于主动抛出的异常的语句前。他定义在方法体中。
void test(int i) throws RuntimeException,Exception { if(i==0) { throw new RuntimeException("wrong"); } System.out.println("3/0="+(3/0)); }
throw表示该处抛出了一个异常<后边new了一个异常对象>
而throws表示这个方法可能会抛出一个异常。
两者都没有进行异常处理。那产生异常该交给谁处理呢?
try--catch语句:用来处理异常的语句
try
{ ...可能会产生异常的语句...
语句一 //哪句出异常的话,下面的语句就不会再执行了,直接跳转到指定异常类型的catch语句
语句二
...
}
catch(...异常类1和对象名...){
...处理异常的方法... //通常是 getMessage(); printStackTrace();
}catch(...异常类2和对象名...){
...处理异常的方法... //通常是 getMessage(); printStackTrace();
}
finally{
...该异常机制的统一出口,肯定会被执行<即使有return语句>... //通常为关闭文件删除临时文件等方法
}
这里有个小tip:
/* void test1() { try { System.out.println("3/0="+3/0); }catch(Exception aw) { //大的异常类型 aw.getMessage(); } catch(RuntimeException ae){ //小的异常类型 System.out.println(ae.getMessage()); } }*/ 》》》报错喽 -----------------------------------华丽的分割线--------------------------- /* void test1() { try { System.out.println("3/0="+3/0); }catch(RuntimeException ae){ //小的异常类型 System.out.println(ae.getMessage()); }catch(Exception aw) { //大的异常类型 aw.getMessage(); } 》》》安逸啊 }*/
上面有两组try-catch语句,都拥有两个catch语句,只是位置不同。
大的异常类型在前,小的在后的话,会报错。
发现个有趣的代码可以加深对异常对象的理解:
void test(int i) { if(i==1) { throw new RuntimeException("wrong"); } try { System.out.println("3/0="+3/0); }catch(RuntimeException ae){ //小的异常类型 System.out.println("小异常"); System.out.println(ae.getMessage()); ae.printStackTrace(); }catch(Exception aw) { System.out.println("大异常"); System.out.println(aw.getMessage());//大的异常类型
aw.printStackTrace();}}测试代码:
public static void main(String[] args) { // TODO Auto-generated method stub TestE d = new TestE(); try { d.test(0); }catch(Exception ar) { ar.printStackTrace(); System.out.println("here is wrong"); } System.out.println("oula"); }运行结果:
异常处理完后,异常对象就被垃圾回收器回收啦!<测试代码中catch都捕获不到异常了,所以没运行>。
总之:throws抛出异常------try-catch解决异常变得正常------finally必须做善后工作
关于重写与异常的理解:
记住两句话:
1,子类重写父类方法要抛出与父类一致的异常,或者不抛出异常
2,子类重写父类方法所抛出的异常不能超过父类的范畴
个人理解是一种约束力。比如孩子继承了父亲的缺点<异常>,因为父亲可能会意识到自己的部分缺点,教育并约束自己的孩子。所以孩纸的缺点只会比父亲少,最坏的情况是和父亲的缺点一样。
yes,Zard! 异常部分,完结撒花~ 明天搞多线程的基础知识部分。