黑马程序员——【Java基础】——面向对象(二)异常机制、包(Package)
---------- android培训、java培训、期待与您交流! ----------
一、异常机制
(一)异常概述
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不会执行。
(六)throw和throws的用法
throw定义在函数内,用于抛出异常对象。
throws定义在函数上,用于抛出异常类,可以抛出多个用逗号隔开。
当函数内容有throw抛出异常对象,并未进行try处理。必须要在函数上声明,否则编译失败。注意:RuntimeExcpetion除外。
(七)throw和throws的区别
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方法获取自定义的异常信息。
class MyException extends Exception
{
private String msg;
MyException(String msg){
super(msg);//将会返回输入的信息
6 }
7 }
注:自定义异常必须是自定义类有继承关系,通常继承Exception。
要继承Exception是因为:异常体系有一个特点,异常类和异常对象都被抛出。他们都具备可抛性。这个可抛性是Throwable这个体系中独有特点。只有这个体系中的类和对象才可以被throws和throw操作。
三、异常的好处与处理原则
(一)异常的好处
1、将问题进行封装;
2、将正常流程的流程代码和问题处理代码向分离,方便于阅读。
(二)异常处理的原则
1、方式有两种:try和throw
2、调用到抛出异常的功能时,抛出几个,就处理几个。一个try对应多个catch。
3、多个catch时,父类的catch放在最下面。否则编译会报错,因为其余的catch语句执行不到。
4、catch内,需要定义针对性的处理方式。不要简单的定义printStackTrace,输出语句。也不要不写。当捕获到的异常,本功能处理不了时,可以继续在catch中抛出。代码示例如下:
try{
throw new AException();
}catch (AException e){
throw e;//如果该异常处理不了,但并不属于该功能出现的异常。
}
5、或者Exception可以处理,当需要将异常产生后和本功能相关的问题提供出去,让调用者知道。并处理。也可以将捕获异常处理后,转换新的异常。例如在汇款的例子中,在给别人转账时,如果ATM机出现故障,这时可以另外找地方去转,也可以告诉对方,转账不成功。代码示例如下:
try{
throw new AException();
}catch (AException e){
// 对AException处理。
throw new BException();
}
四、异常的注意事项
(一)在子父类覆盖时
1、子类抛出的异常必须是父类的异常的子类或子集或父类异常。
2、如果父类或者接口没有异常抛出时,子类覆盖出现异常,只能try不能抛。
3、如果父类抛出多个异常,那么子类只能抛出父类异常的子集或子类。
4、父类方法没有抛出异常,子类绝对不能抛。
(二)问题能在内部被解决就不需要声明。
(三)catch是用于处理异常,如果没有catch就代表异常没有被处理,如果该异常是检测时异常。那么必须声明。
-----------------------------------------------包(package)-----------------------------------------------
一、包(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
---------- android培训、java培训、期待与您交流! ----------
黑马程序员——【Java基础】——面向对象(二)异常机制、包(Package)的更多相关文章
- 黑马程序员——JAVA基础之简述面向对象,类,变量,匿名对象
------- android培训.java培训.期待与您交流! ---------- 面向对象: 面向对象是相对面向过程而言 面向对象和面向过程都是一种思想 面向过程 强调的是功能行为 面向对象 将 ...
- 黑马程序员Java基础班+就业班课程笔记全发布(持续更新)
正在黑马学习,整理了一些课程知识点和比较重要的内容分享给大家,也是给自己拓宽一些视野,仅供大家交流学习,大家有什么更好的内容可以发给我 ,现有黑马教程2000G QQ 1481135711 这是我总 ...
- 黑马程序员----java基础笔记上(毕向东)
------Java培训.Android培训.iOS培训..Net培训.期待与您交流! ------- 笔记一共记录了毕向东的java基础的25天课程,分上.中.下 本片为上篇,涵盖前10天课程 1. ...
- 黑马程序员----java基础笔记中(毕向东)
<p>------<a href="http://www.itheima.com" target="blank">Java培训.Andr ...
- 黑马程序员 Java基础<九>---> 多线程
ASP.Net+Android+IOS开发..Net培训.期待与您交流! 多线程 一.概述: 1.线程是什么 说到线程,我们就得先说说进程.所谓进程,就是一个正在执行(进行)中的程序,每一个进程执行都 ...
- 黑马程序员——JAVA基础之网络编程
------Java培训.Android培训.iOS培训..Net培训.期待与您交流! ------- 网络编程 网络模型:OSI参考模型和TCP/IP参考模型 网络通讯三要素: IP地址:InetA ...
- 黑马程序员——JAVA基础之泛型和通配符
------- android培训.java培训.期待与您交流! ---------- 泛型: JDK1.5版本以后出现新特性.用于解决安全问题,是一个类型安全机制. 泛型好处: ...
- 黑马程序员——JAVA基础之语法、命名规则
------- android培训.java培训.期待与您交流! ---------- 1.java语言组成:关键字,标识符,注释,常量和变量,运算符,语句,函数,数组. 2.java关键字:被Jav ...
- 黑马程序员 Java基础<十八>---> 网路编程
--------------- ASP.Net+Android+IO开发S..Net培训.期待与您交流! --------------- 第一 概述 一.概述: 1.网络模型:OSI参考模型和TCP ...
- 黑马程序员——JAVA基础之包,权限
------- android培训.java培训.期待与您交流! ---------- 包(package) 对类文件进行分类管理. 给类提供多层命名空间. 写在程序文件的第一行. 类名的全称的是:包 ...
随机推荐
- 创建高性能移动 web 站点
如果你的网站3秒钟没有响应,人们就会失去兴趣了.为了满足响应快这个愿望,需要一个不同的方法在手机上进行分析,设计和测试. 这篇文章将会对Johan Johansson在2013年4月提出" ...
- 《javascript高级程序设计》第八章 The Browser Object Model
8.1 window 对象 8.1.1 全局作用域 8.1.2 窗口关系及框架 8.1.3 窗口位置 8.1.4 窗口大小 8.1.5 导航和打开窗口 8.1.6 间歇调用和超时调用 8.1.7 系统 ...
- HTML5自学笔记[ 15 ]canvas绘图实例之钟表
<!doctype html> <html> <head> <meta charset="utf-8"> <title> ...
- hdu-----(1507)Uncle Tom's Inherited Land*(二分匹配)
Uncle Tom's Inherited Land* Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (J ...
- AP聚类算法(Affinity propagation Clustering Algorithm )
AP聚类算法是基于数据点间的"信息传递"的一种聚类算法.与k-均值算法或k中心点算法不同,AP算法不需要在运行算法之前确定聚类的个数.AP算法寻找的"examplars& ...
- js 正则表达式 查找
<script>var str='<p><img style="width: 140px; height: 105px;" alt="&qu ...
- Javascript之对象的继承
继承是面向对象语言一个非常重要的部分.许多OOP语言都支持接口继承和实现继承两种方式.接口继承:继承方法签名:实现继承:继承实际的方法.在ECMAScript中函数是没有签名的,所以也就无法实现接口继 ...
- JavaScript基础---作用域,匿名函数和闭包【转】
匿名函数就是没有名字的函数,闭包是可访问一个函数作用域里变量的函数. 一.匿名函数 //普通函数 function box() { //函数名是 box return 'TT'; } //匿名函数 f ...
- mysql linux备份shell
#!/bin/bash# export and backup the activity.sql mysqldump -uname -password activity --skip-lock-ta ...
- Python的神奇方法指南
参考:http://article.yeeyan.org/view/311527/287706