zoukankan      html  css  js  c++  java
  • 08、异 常&包

    异 常

    1、概述

      *是在运行时期发生的不正常情况。

      *在java中用类的形式对不正常情况进行了描述和封装

      *描述不正常的情况的类,就称为异常类

      以前正常流程代码和问题处理代码相结合

      现在将正常流程代码和问题处理代码分离,提高阅读性

      其实异常就是java通过面向对象的思想将问题封装成了对象。

     

    2、异常体系

      (1)用异常类对其进行描述

        不同的问题用不同的类进行具体的描述,比如脚标越界,空指针等等

        问题很多,意味着描述的类也很多

        将其共性进行向上抽取,形成了异常体系

      (2)异常的体系(Throwable):

        *Error //错误,一般不可处理的。

          **通常出现重大问题如:运行的类不存在或者内存溢出等。

          **不编写针对代码对其处理

          特点:是由jvm抛出的严重性的问题。

          这种问题发生,一般不针对性处理,直接修改程序

        *Exception  //例外,可以处理的

              **在运行时运行出现的一些情况,可以通过try,catch,finally进行捕获处理

      (3)Throwable:无论是error,还是异常,都是问题,问题发生就应该可以抛出,让调用者知道并处理。

        该体系的特点就在于Throwable及其所有的子类都具有可抛性。

      (4)可抛性到底指的是什么?怎样体系有可抛性呢?

        其实是通过两个关键字来体现的。

        throws和throw,凡是可以被这两个关键字所操作的类和对象都具备可抛性。

      (5)该体系的特点:

        子类的后缀名都是用其父类名作为后缀,阅读性很强。

        Exception和Error的子类名都是以父类名作后缀

        对于脚标是整数不存在,可以用脚标越界表示

        对于负数为脚标的情况,准备用负数脚标异常来表示

        负数脚标这种异常在java中并没有定义过,对于java 中没定义过的异常,那就按照java异常的创建思想,面向对象,将负数脚标进行自定义描述。并封装成对象。这种自定义的问题描述称为自定义异常。

        注意:如果让一个类称为异常类,必须要继承异常体系,因为只有称为异常体系的子类才有资格具有可抛性。才可以被两个关键字所操作。

      (6)异常的分类:

        *编译时被检测异常:只要是Exception和其子类都是,除了特殊子类RuntimeException体系。 

           这种问题一旦出现,希望在编译时就进行检测,让这种问题有对应的处理方式。这样的问题都可以针对性的处理。

        *编译时不检测异常(运行时异常):就是Exception中的RuntimeException和其子类。

           这种问题的发生,无法让功能继续,运算无法进行,更多是因为调用者的原因导致的或者引发了内部状态的改变导致的。

          那么这种问题一般不处理,直接编译通过,在运行时,让调用者调用时的程序强制停止,让调用者对代码进行修正。所以自定义异常时,要么继承Exception。要么继承RuntimeException。

      (7)throws和throw

        *throws用于标识函数暴露出的异常

        *throw用于抛出异常对象。

          定义功能方法时,需要把出现的问题暴露出来让调用者去处理。那么就通过throws在函数上标识。

          在功能方法内部出现某种情况,程序不能继续运行,需要进行跳转时,就用throw把异常对象抛出。

        *throws与throw的区别:

          **throws用在函数上,后面跟着异常类名

          **throw用在函数内,后面跟异常对象

      (8)异常处理的捕捉形式:

        这是可以对异常进行针对性处理的方式

        具体格式:

          try{

              //需要被检测异常的代码

          }catch(异常类 变量){//该变量用于接收发生的异常对象。

              //处理异常的代码

          }finally{

              //一定会被执行的代码。

          }

        Catch用于处理异常,没catch则没有处理

      (9)Throwable(异常)中的方法:

        *getMessage()

            获取异常信息,返回字符串。

        *toString()

            获取异常类名和异常信息,返回字符串。

        *printStackTrace()

            获取异常类名和异常信息,以及异常出现在程序中的位置。返回值void

        *printStackTrace(PrintStream s)

             通常用该方法将异常内容保存在日志文件中,以便查阅。

      (10)异常处理的原则:

        *函数内部如果抛出需要检测的异常,那么函数上必须要声明,要么必须在函数内用try catch捕捉,否则编译会失败

        *如果调用到了声明异常的函数,要么try catch要么throws,否则编译失败;

        *什么时候catch,什么时候throws呢?

          功能内部可以解决用catch。

          解决不了,用throws告诉调用者,由调用者解决;

        *一个功能如果抛出了多个异常,那么调用时,必须有对应多个catch进行针对性的处理。

          内部有几个需要检测的异常,就抛几个异常,抛出几个,就catch几个。

      (11)异常处理过程:

        *Try中检测到异常会将异常对象传递给catch,catch捕获到异常进行处理;

        *Finally里通常用来关闭资源。比如:数据库资源,IO资源等。

        需要注意:try是一个独立的代码块,在其中定义的变量只在该代码块中有效。

        如果在try以外继续使用,需要在try建立引用。在try对其进行初始化,IO,Socket就会遇到。

        try{

            需要检测的代码;

        }catch(异常类 变量){

            异常处理代码;

        }finally{

            一定会执行的代码;

        }  

        Finally代码块只有一种情况不会被执行。就是在之前执行了System exit(0)

      (12)try catch finally代码块组合特点:

        1、try catch finally组合

        2、try catch(多个)当没有必要资源需要释放时,可以不用定义fianlly

        3、try fianlly异常无法直接catch处理,但是资源需要关闭。

      (13)异常的注意事项:

        *子类在覆盖父类方法时,父类的方法如果抛出了异常,那么子类的方法只能抛出父类的异常或者该异常的子类

        *如果父类抛出多个异常,那么子类只能抛出父类异常的子集。

            简单说:子类覆盖父类,只能抛出父类的异常或者子类或者子集

        注意:如果父类的方法没有抛出异常,那么子类覆盖时绝对不能抛,就只能try。

            当父类中没有标示时,子类只能try不能抛,只能内部解决。

     

    包(package)

    1、概述

      对类文件进行分类管理

      可以给类提供多层命名空间

      写在程序文件的第一行

      类名的全称是:包名.类名

      包也是一种封装形式

     

    2、命名空间(名称空间):存储该文件的空间,即存储在哪个地方,哪个地方就是其存在的命名空间。

      带有包的源文件生成的字节码文件,执行时需要加前缀包名

      编译时需加-d才能生成存放类文件的位置,即生成以源文件中包名命名的文件夹存放类文件

      当需要在当前目录下生成文件夹或文件时,可用“ . ”表示

      例:javac -d . Demob.java则生成的Demob.class文件会存放在当前目录下新建的该源文件中以包名命名的文件夹里

      可以生成多层包目录:即源文件中将包名写成多级的,如:原包名:package packb;改成package packb.haha.hehe.xixi,则

      会创建四层文件夹

     

    3、classpath

      *给JVM提供的一个环境变量

      *指定类或者包所在的路径

      *classpath变量值的最后有分号与无分号的区别。

        **有分号时,JVM会先到classpath指定的目录下寻找类文件,如果没有找到会在当前目录下寻找;

        **没有分号,JVM会先到classpath指定目录寻找,没有找到不会在当前目录下寻找,即使当前目录下有所需类文件。

        思考:在开发时,分号是否需要?

            最好不要加分号,如需访问当前目录下的所需类文件,可以用"."表示。

     

    4、包之间的访问

      *被访问的包中的类权限必须是public的

      *类中的成员权限:public或者protected

      *protected是为其他包中的子类提供的一种权限。protected修饰后的父类,只允许不同包中子类调用其功能,不允许其他包中创建该对象调用功能。

      *权限:   public  protected  default  private

      同一类中    OK          OK        OK        OK

      同一包中    OK          OK        OK

      子类          OK          OK        

      不同包中    OK

     

    5、import

      *简化类名;

      *一个程序文件中占有一个package,可以有个improt

      *用来导包中的类,不导入包中的包;

      *通常写import mypack.Demo,而不写import mypack.*,为什么?

        因为有时只需要访问包中一小部分类,无需将整个包中的类都导入。导包原则,用到哪个类,就导入哪个类

     

    6、jar包

      *方便项目的携带

      *方便于使用,只要在classpath设置jar路径即可

      *数据库驱动,SSH框架等都是以jar包体现的。

     

  • 相关阅读:
    Executors提供的四种线程池和自定义线程池
    ava8并发教程:Threads和Executors
    Java 信号量 Semaphore 介绍
    Condition-线程通信更高效的方式
    ReentrantLock详解 以及与synchronized的区别
    FutureTask 源码解析
    Java多线程编程:Callable、Future和FutureTask浅析
    Callable 和 Runnable 的区别
    javascript之url转义escape()、encodeURI()和decodeURI()
    yii2.0安装ElasticSearch及使用
  • 原文地址:https://www.cnblogs.com/zyh-blog/p/3162681.html
Copyright © 2011-2022 走看看