黑马程序员技术交流社区

标题: 异常预习 [打印本页]

作者: zhangwenjin    时间: 2016-7-12 02:01
标题: 异常预习
异常的概念

异常就Java程序在编译和运行时出现的错误

异常的分类

顶层为Throwable 下分为分三种

        Error

          通常出现重大问题如:服务器宕机数据库崩溃等。不编写针对代码对其处理。

Exception

         除了 RuntimeException 和其所有子类,其他所有的异常类都是在编译的时候必须要处理的,要么try,要么抛

RuntimeException

         RuntimeException 和其所有的子类,都不会在编译的时候报异常,而是在运行时报异常,这时候我们就需要回头看看我们的代码是否有问题,比如角标越界,空指针等

jvm是如何处理异常的

      jvm发现运算是已经违反了数学运算规则,java将这种常见的问题进行描述,并封装成了对象叫做ArithmeticException当除0运算发生后,jvm将该问题打包成了一个异常对象.并将对          象抛给调用者main函数,new ArithmeticException("/by zero");

       main函数收到这个问题时,有两种处理方式:1,自己将该问题处理,然后继续运行

                                                                              2,自己没有针对的处理方式,只有交给调用main的jvm来处理jvm有一个默认的异常处理机制,就将该异常进行处理.并将该异常的名称,异                                                                                     常的信息.异常出现的位置打印在了控制台上同时将程序停止运行

处理异常处理方式:

一个是try    catch        finally

                 try是用来检测异常的
catch是用来捕获异常的
finally释放资源

         1,try catch         不需要释放资源
2,try catch finally
需要释放资源
3,try finally
需要释放资源,但是不能对象异常捕获,需要交给调用处理
另一个是throws
抛出去
[java] view plaincopy
try  catch示例:  
[java] view plaincopy
try {  
         需要检测的代码;  
     }  
     catch(异常类  变量) {//异常类名 对象名= new 异常类名();  
         异常处理代码;  
     }  
世界上最真情的相依,就是你在try,我在catch,无论你发神马脾气,我都默默接受,静静处理  
public class Demo1_Exception {  
   
     public static void main(String[] args) {  
         Demo d = new Demo();                        //创建对象  
         try {  
             int num = d.div(10, 0);                 //调用div方法并将10和0给方法的参数  
             System.out.println(num);                //打印调用方法的结果  
         } catch (Exception e) {                     //当try检测出异常的时候,就跳到catch语句中  
                                                     //接收异常Exception e =  new ArithmeticException("/ by zero");  
             System.out.println(e);                  //打印异常对象的toString方法  
             System.out.println(e.toString());  
             System.out.println("错了,除数为零了"); //提示  
         }  
         System.out.println("11111111111111111111"); //异常处理完代码可以继续执行  
     }  
   
}  
   
class Demo {  
     public int div(int a,int b) {                   //a = 10,b = 0  
         return a / b;                               // new ArithmeticException("/ by zero");  
     }  
}  

[java] view plaincopy
try catch  finally 示例:  
[java] view plaincopy
public static void main(String[] args) {  
         try {  
             System.out.println(1/0);  
         } catch (Exception e) {  
             System.out.println("catch执行了吗");  
             //System.exit(0);   //如果先退出虚拟机就不会执行finally了  
             return;             //return在将死之前,会让finally完成未完成的遗愿  
         } finally {  
             System.out.println("finally执行了吗");  
         }  
     }  

final,finalize,finally的区别

       1,final可以修饰类,可以修饰方法,可以修饰变量

      2,finalize,在对象没有更多引用,垃圾回收的时候调用

      3,finally 关闭流,数据库等,释放资源

throw的概述
     在功能方法内部出现某种情况,程序不能继续运行,需要进行跳转时,就用throw把异常对象抛出。
    throws和throw的区别
    a:throws
          用在方法声明后面,跟的是异常类名
         可以跟多个异常类名,用逗号隔开
        表示抛出异常,由该方法的调用者来处理

       throws如果抛出的是RuntimeException及其子类,调用该方法的时候不用处理,抛出RutimeException和不抛效果一样
  如果抛出的是除了RuntimeException及其子类.调用方法必须处理
    b:throw
         用在方法体内,跟的是异常对象名
        只能抛出一个异常对象名
        表示抛出异常,由方法体内的语句处理
异常注意事项
     a:子类重写父类方法时,子类的方法必须抛出相同的异常或父类异常的子类。(父亲坏了,儿子不能比父亲更坏)
      b:如果父类抛出了多个异常,子类重写父类时,只能抛出相同的异常或者是他的子集,子类不能抛出父类没有的异常
     c:如果被重写的方法没有异常抛出,那么子类的方法绝对不可以抛出异常,如果子类方法内有异常发生,那么子类只能try,不能throws
如何使用异常处理
    原则:如果该功能内部可以将问题处理,用try,如果处理不了,交由调用者处理,这是用throws
      区别:
         后续程序需要继续运行就try
          后续程序不需要继续运行就throws





欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2