黑马程序员——面向对象(二)异常机制、包(Package)

一、异常机制

  (一)异常概述

  1、异常:就是程序在运行时出现不正常情况。

  2、异常类:程序在运行时,出现的不正常情况,将情况用java的类的形式进行描述。并封装成对象。

  (二)异常分类

  对异常问题的分类:“严重的的Error”和“不严重的Exception”

  (1)一种是严重的问题:对于严重的问题,java通过Error类进行描述。

  (2)一种是不严重的问题:对于非严重的,java通过Exception类进行描述。对于Exception可以使用针对性的处理方式进行处理。

  (异常体系

  1、Throwable

    |---Error :对Error类不可处理,JVM抛出。

    |---Exception :可以定义针对性处理。

  2、异常体系的特点

  (1)异常体系中的所有类以及建立的对象都具备可抛性。

  (2)也就是说可以被throw和throws关键字所操作。

  (3)只有异常体系具备这个特点。

  (四)对异常处理的一些要求

  1、声明异常时,建议声明更为具体的异常,这样可以处理的更具体。

  2、对方声明几个异常,就对应几个catch块。不要定义多余的catch块。如果多个catch块中的异常出现继承关系,父类异常catch块放在最下面。

  建议:在进行catch处理时,catch中一定要定义具体的处理方式。不要简单定义e.printStackTrace()。也不要简单书写输出语句。

  (五)异常处理语句

  1、 java提供了特有的语句进行处理。

  try{

    需要被检测的代码

  }catch(异常类  变量){

    处理异常的代码;

  }finally{

    一定会执行的语句

  }

  有三个结合格式:

  (1)try{      } catch(){       }

  (2)try{      } finally{       }

  (3)try{      } catch(){       }finally{      }

  注意:(1)finally中定义的通常是关闭资源代码。因为资源必须释放。(2)如果在一个功能中,定义了一些必须要执行的代码,可以用try{}finally{}的方式,将一定执行的代码放在finally代码块中。(3)finally只有一种情况不会执行。当执行到System.exit(0);fianlly不会执行。

  (六)throwthrows的用法

  throw定义在函数内,用于抛出异常对象。

  throws定义在函数上,用于抛出异常类,可以抛出多个用逗号隔开。

  当函数内容有throw抛出异常对象,并未进行try处理。必须要在函数上声明,否则编译失败。注意:RuntimeExcpetion除外。

  (七)throwthrows的区别

  1、throws使用在函数上,而throw使用在函数内。

  2、throws后面跟异常类,可以跟多个,用逗号隔开。Throw后面跟的是异常对象。

  (八)对抛出异常信息的处理

  1、当在函数内部出现了throw抛出异常对象,那么就必须要给对应的处理动作。要么在内部try catch处理。要么在函数上声明让调用者处理。

  2、一般情况下,函数内出现异常,函数上需要声明。在功能上通过throws的关键字声明了该功能有可能会出现异常类型。

  注意:Exception中有一个特殊子类RuntimeException。如果再函数内抛出RuntimeExcpetion异常,函数上可以不用声明,编译一样通过。如果函数上声明了RuntimeExcpetion异常,调用者可以不用进行处理,编译一样通过。

  3、之所以不用在函数上声明,是因为不需要让调用者处理。当该异常发生,希望程序停止。因为在运行时,出现了无法继续运算的情况,希望停止程序后,对代码进行修正。

  4、如果函数声明了异常,调用者需要进行处理。处理方法可以throws可以try。

  5、对捕获到的异常对象进行常见方法操作:

  (1)String getMessage();//获取异常的信息。返回字符串。

  (2)toString();//获取异常类名和异常信息,返回字符串。

  (3)printStackTrace();//获取异常类名和异常信息,以及异常出现在程序中的位置.返回值void。JVM默认的异常处理机制,就是在调用printStackTrace方法,打印异常的堆栈的跟踪信息。

  (4)printStackTrace(PrintStream s)//通常用该方法将异常内容保存在日志文件中,以便查阅。

二、自定义异常

  因为项目中会出现特有的问题,而这些问题并未被java所描述并封装对象。所以对这些特有的问题可以按照java中的面向对象思想。将特有的问题,进行自定义的异常封装。定义类继承Exception或者RuntimeException。

  1、为了让该自定义类具备可抛性。

  2、让该类具备操作异常的共性方法。

  当要定义自定义异常的信息时,可以使用父类已经定义好的功能。异常信息传递给父类的构造函数。因为父类中已经把异常信息的操作都完成了。所以子类只要在构造时,将异常信息传递给父类的构造函数。通过super语句,就可以直接通过getMessage方法获取自定义的异常信息。

1 class MyException extends Exception 2
2 {
3     private String msg;
4     MyException(String msg){
5         super(msg);//将会返回输入的信息12
6     }
7 }

  注:自定义异常必须是自定义类有继承关系,通常继承Exception。

  要继承Exception是因为:异常体系有一个特点,异常类和异常对象都被抛出。他们都具备可抛性。这个可抛性是Throwable这个体系中独有特点。只有这个体系中的类和对象才可以被throws和throw操作。

三、异常的好处与处理原则

  (一)异常的好处

  1、将问题进行封装;

  2、将正常流程的流程代码和问题处理代码向分离,方便于阅读。

  (二)异常处理的原则

  1、方式有两种:try和throw

  2、调用到抛出异常的功能时,抛出几个,就处理几个。一个try对应多个catch。

  3、多个catch时,父类的catch放在最下面。否则编译会报错,因为其余的catch语句执行不到。

  4、catch内,需要定义针对性的处理方式。不要简单的定义printStackTrace,输出语句。也不要不写。当捕获到的异常,本功能处理不了时,可以继续在catch中抛出。代码示例如下:

1 try{
2    throw new AException();
3 }catch (AException e){
4    throw e;//如果该异常处理不了,但并不属于该功能出现的异常。
5 }

  5、或者Exception可以处理,当需要将异常产生后和本功能相关的问题提供出去,让调用者知道。并处理。也可以将捕获异常处理后,转换新的异常。例如在汇款的例子中,在给别人转账时,如果ATM机出现故障,这时可以另外找地方去转,也可以告诉对方,转账不成功。代码示例如下:

1 try{
2     throw new AException();
3 }catch (AException e){
4     // 对AException处理。
5     throw new BException();
6 }

四、异常的注意事项

  (一)在子父类覆盖时

1、子类抛出的异常必须是父类的异常的子类或子集或父类异常。

2、如果父类或者接口没有异常抛出时,子类覆盖出现异常,只能try不能抛。

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

4、父类方法没有抛出异常,子类绝对不能抛。

  (二)问题能在内部被解决就不需要声明。

  (三)catch是用于处理异常,如果没有catch就代表异常没有被处理,如果该异常是检测时异常。那么必须声明。

一、包(Package:相当于文件夹,是一种封装的表现形式。包名可以是多级的。

二、包的作用

  1、避免多个类重名的情况。如果出现两个相同名字的类,可通过包将两者区分,从而避免冲突。

  2、对类文件进行分类管理,可以将相关的一些类放在同一个包中。

  3、为类提供多层命名空间。

  4、包的出现可以将java的类文件和源文件相分离。

三、书写规则

  1、包名必须写在程序文件的第一行。

  2、类文件的全称:包名.类名。

四、包与包间的访问

  1、包与包间进行访问,被访问的包中的类以及类中的成员,需要public修饰。

  2、不同包中的子类可以直接访问父类中被protected权限修饰符修饰的成员。

  3、包与包间访问可以使用的权限只有两种:public和protected。

五、权限


public


protected


default


private


同一个类中


OK


OK


OK


OK


同一个包中


OK


OK


OK


×


子类


OK


OK


×


×


不同包中


OK


×


×


×


六、包的导入(关键字:
import

  1、可以简化类名。在调用其他包中的类时,需要写类的全称,也就是连同包名一起书写。

  2、import导入的是包中的类,不导入包中的包。

  3、一个程序文件中只有一个package,可以有多个import。

  建议:(1)在导入包时,如果包中有很多类,可以使用通配符 *来替代包中的所有类。但是,建议不要使用通配符 * ,因为将不需要使用的类导入后,会占用内存空间。所有在编写程序时,要使用包中的哪些类,就导入哪些类。(2)定义包名不要重复,可以使用url来完成定义,url是唯一的。(3)导入的不同包中有相同类时,必须写类的全名以区分,否则将会报错。

七、Jar包

  (一)Jar

  类越来越多,我们可以用包来装,当包越来越多时,我们可以将包进行压缩。而java中用jar这个工具来对包进行压缩,压缩后的后缀名为jar。

  (二)一些Jar命令

  1、创建jar包:jar –cvf mypack.jar packa packb

  2、查看jar包:jar –tvf mypack.jar [>定向文件]

  3、解压缩:jar –xvf mypack.jar

  4、自定义jar包的清单文件:jar –cvfm mypack.jar mf.txt packa packb

时间: 2024-10-29 03:01:04

黑马程序员——面向对象(二)异常机制、包(Package)的相关文章

黑马程序员-面向对象的特征

Java面向对象 面向对象是一种程序设计方法,或者是程序设计规范,其基本思想是使用对象.类.继承.封装.多态等基本概念来进行程序设计. 面向对象是一种符合人们思考习惯的思想,可以将复杂的事情简单化,将程序员从执行者转换成了指挥者 完成需求时: ? 先要去找具有所需的功能的对象来用. ? 如果该对象不存在,那么创建一个具有所需功能的对象. ? 这样简化开发并提高代码的复用. 面向对象的开发过程其实就是不断的创建对象,使用对象,指挥对象做事情.设计的过程其实就是在管理和维护对象之间的关系. 面向对象

黑马程序员 面向对象(上) 封住,继承,多态,以及this和super的用法

---------------------- ASP.Net+Unity开发..Net培训.期待与您交流! ----------------------/* * 一.类的继承: 当多个类出现了相同的属性和行为时,我们可以把这些类中相同的属性和行为抽取出来 成为独立的一个类,然后让这些类分别去继承抽取类,再根据自己需求去实现别的功能 这样大大的增强的相同代码的复用性,也使代码变得美观 我们把这个抽取类叫做这些类的父类,这些类叫做抽取类的子类,子类是可以继承父类中 的所有信息. 在Java中所有的类

黑马程序员——java基础——异常

黑马程序员--java基础--异常 ------Java培训.Android培训.iOS培训..Net培训.期待与您交流! ------- 异常 就是不正常.程序在运行时出现的不正常情况.其实就是程序中出现的问题.这个问题按照面向对象思想进行描述,并封装成了对象.因为问题的产生有产生的原因.有问题的名称.有问题的描述等多个属性信息存在.当出现多属性信息最方便的方式就是将这些信息进行封装.异常就是java按照面向对象的思想将问题进行对象封装. 异常体系 --------java.lang.Thro

黑马程序员-面向对象-Object类

---------------------- <a href="http://edu.csdn.net"target="blank">ASP.Net+Unity开发</a>.<a href="http://edu.csdn.net"target="blank">.Net培训</a>.期待与您交流! ---------------------- 一.Object类中的equals(

黑马程序员-面向对象-多态

---------------------- <a href="http://edu.csdn.net"target="blank">ASP.Net+Unity开发</a>.<a href="http://edu.csdn.net"target="blank">.Net培训</a>.期待与您交流! ---------------------- 一多态的前提:(1)要有继承关系(或

黑马程序员——面向对象编程三大特性

黑马程序员——面向对象编程三大特性 ------- android培训.IOS培训.期待与您交流! ---------- 面向对象编程三大特性:封装,继承,多态,(抽象) ***封装的概念与原理*** 封装是面向对象的特性之一 封装的好处:降低数据被无用的可能性,保证数据安全性 不封装的缺点:会把自己的属性暴露给外部,失去对该属性的管理权 封装原理:实例变量默认只能被当前类的对象方法访问 **封装实现** 定义设置实例变量(setter)方法和访问实例变量(getter)方法 1)setter(

黑马程序员——面向对象--异常

------Java培训.Android培训.iOS培训..Net培训.期待与您交流! ------- 异常:就是程序在运行时出现不正常的情况 异常由来:问题也是现实生活中一个具体的事物,也可以通过java的类的形式进行描述,并封装成对象. 其实就是java对不正常情况进行描述的对象体现 对于问题的划分分为两种: 1.一种是严重的问题 2.一种是非严重问题 对于严重的,java通过error类进行描述 对于error一般不变写针对性的代码进行处理 对于非严重的,java通过Exception进行

黑马程序员——面向对象(一)概述、类与对象、继承、抽象类、接口、多态、内部类

一.面向对象概述 1.面向对象:是一个很抽象的概念,它相对面向过程而言,是一种程序设计的思想. 2.面向对象的特点: * 符合人们思考习惯的思想 * 可以将复杂的事情简单化 * 将程序员从执行者转换成了指挥者 * 完成需求时:只需要寻找具备所需功能的对象或者创建所需功能的对象即可,简化开发效率并提高对象的复用性. 3.面向对象的三个特征:封装(Encapsulation).继承(Inheritance).多态(Polymorphism). 二.类与对象 (一)类与对象之间的关系 1.类的定义:类

黑马程序员——面向对象

------<a href="http://www.itheima.com" target="blank">Java培训.Android培训.iOS培训..Net培训</a>.期待与您交流! ------- 本文是对java面向对象概念的总结和回顾.面向对象是java语言的一个重要特点,只有真正理解了面向对象的基本概念,并应用面向对象的概念编写java程序,才算是真正的java程序员. 一.面向对象的概念 面向对象是相对面向过程而言,面向对