您的位置:首页 > 职场人生

黑马程序员——异常与包

2015-09-21 09:54 405 查看

------- android培训java培训、期待与您交流!
----------

异常

异常:就是不正常。程序在运行时出现的不正常情况。其实就是程序中出现的问题。这个问题按照面向对象思想进行描述,并封装成了对象。因为问题的产生有产生的原因、有问题的名称、有问题的描述等多个属性信息存在。当出现多属性信息最方便的方式就是将这些信息进行封装。异常就是java按照面向对象的思想将问题进行对象封装。这样就方便于操作问题以及处理问题。

Throwable:可抛出的。

|--Error错误,一般情况下,不编写针对性的代码进行处理,通常是jvm发生的,需要对程序进行修正。

|--Exception异常,可以有针对性的处理方式。

如何标示呢?通过throws关键字完成,格式:throws
异常类名,异常类名...

这样标示后,调用者,在使用该功能时,就必须要处理,否则编译失败。

出现的问题有很多种,比如角标越界(ArrayIndexOutOfBoundsException),空指针(NullPointerException)等都是。就对这些问题进行分类。而且这些问题都有共性内容比如:每一个问题都有名称,同时还有问题描述的信息,问题出现的位置,所以可以不断的向上抽取。形成了异常体系。

图例:



运行结果:算术异常,除数为0了。

异常的处理

java提供了特有的语句进行处理
try
{

需要被检测的代码;

}
catch(异常类 变量)
{

处理异常的代码;(处理方式)

}
finally
{

一定会执行的语句;

}

对捕获到的异常对象进行常见方法操作。
getMessgae():获取异常信息。
toString():异常名称: 异常信息
printStackTrace():异常名称,异常信息,异常出现的位置。
其实jvm默认的异常处理机制,就是在调用printStackTrace方法,打印异常的堆栈的跟踪信息。
int div(int a,int b) throws Exception//在功能上通过throws的关键字声明了该功能有可能会出现问题
在函数上声明异常。
便于提高安全性,让调用出进行处理,不处理编译失败。

对多异常的处理。
1、声明异常时,建议声明更为具体的异常,这样处理。
2、对方声明几个异常,就对应有几个catch块。不要定义多余的catch块。

如果多个catch块中的异常出现继承关系,父类异常catch块放在最下面。
建立在进行catch处理时,catch中一定要定义具体处理方式。
不要简单定义一句e.printStackTrace();
也不要简单的就书写一条输出语句。
因为项目中会出现特有的问题。
而这些问题并未被java所描述并封装对象。
所以对于这些特有的问题可以按照java的对问题封装的思想。
将特有的问题,进行自定义的异常封装。

异常处理原则:功能抛出几个异常,功能调用如果进行try处理,需要与之对应的catch处理代码块,这样的处理有针对性,抛几个就处理几个。

特殊情况:try对应多个catch时,如果有父类的catch语句块,一定要放在下面。

throw
和throws关键字的区别:

throw用于抛出异常对象,后面跟的是异常对象;throw用在函数内。
throws用于抛出异常类,后面跟的异常类名,可以跟多个,用逗号隔开。throws用在函数上。

异常分两种:

1:编译时被检查的异常,只要是Exception及其子类都是编译时被检测的异常。
2:运行时异常,其中Exception有一个特殊的子类RuntimeException,以及RuntimeException的子类是运行异常,也就说这个异常是编译时不被检查的异常。

定义异常处理时,什么时候定义try,什么时候定义throws呢?
功能内部如果出现异常,如果内部可以处理,就用try;
如果功能内部处理不了,就必须声明出来,让调用者处理。

自定义异常:当开发时,项目中出现了java中没有定义过的问题时,这时就需要我们按照java异常建立思想,将项目的中的特有问题也进行对象的封装。这个异常,称为自定义异常。

对于除法运算,0作为除数是不可以的。java中对这种问题用ArithmeticException类进行描述。对于这个功能,在我们项目中,除数除了不可以为0外,还不可以为负数。可是负数的部分java并没有针对描述。所以我们就需要自定义这个异常。

RuntimeException
Exception中有一个特殊的子类异常RuntimeException运行时异常。
如果在函数内容抛出该异常,函数上可以不用声明,编译一样通过。
如果在函数上声明了该异常,调用者可以不用进行处理,编译一样通过。
之所以不用在函数上声明,是因为不需要让调用者处理。
当该异常发生,希望程序停止,因为运行时,出现了无法继续运算的情况,希望停止程序后,对代码进行修正。
自定义异常时,如果该异常的发生,无法在继续进行运算,就让自定义异常继承RuntimeException。

自定义异常的步骤:
1:定义一个子类继承Exception或RuntimeException,让该类具备可抛性。
2:通过throw
或者throws进行操作。

finally代码块:定义一定执行的代码。
通常用于关闭资源。



第一种格式:
try
{}
catch()
{}
第二种格式:
try
{}
catch()
{}
finally
{}
第三种格式:
try
{}
finally
{}

记住:

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



当异常出现后,在子父类进行覆盖时,有了一些新的特点:

1、子类要覆盖父类时,如果父类的方法抛出异常,那么子类的覆盖方法,只能抛出父类的异常或者该异常的子类。

Exception

|--AException


|---BException


|--CException

父类抛出A异常,子类可以抛出A或者B异常,不能抛出C异常。

2、如果父类方法抛出多个异常,那么子类在覆盖该方法时,只能抛出父类异常的子集。

*3、如果父类或者接口的方法中没有异常抛出,那么子类在覆盖方法时,也不可以抛出异常。

如果子类方法发生了异常,就必须要进行try处理,绝对不能抛。

注意:
如果父类或者接口中的方法没有抛出过异常,那么子类是不可以抛出异常的,如果子类的覆盖的方法中出现了异常,只能try不能throws。
如果这个异常子类无法处理,已经影响了子类方法的具体运算,这时可以在子类方法中,通过throw抛出RuntimeException异常或者其子类,这样,子类的方法上是不需要throws声明的。

练习:



运行结果:B C 5



运行结果:
A//可以,覆盖了
B//不可以,权限不够
C//可以,和父类不一样,没有覆盖,相当于重载
D//不可以,因为该函数不可以和给定函数出现在同一函数中,或者子父类中。
E//不可以,静态只能覆盖静态。

包:定义包用package关键字。

1:对类文件进行分类管理。
2:给类文件提供多层名称空间。

如果生成的包不在当前目录下,需要最好执行classpath,将包所在父目录定义到classpath变量中即可。
一般在定义包名时,因为包的出现是为了区分重名的类。所以包名要尽量唯一。怎么保证唯一性呢?可以使用url域名来进行包名称的定义。
packagepack;//定义了一个包,名称为pack。
注意:包名的写法规范:所有字母都小写。
//package cn.itcast.pack.demo;

类的全名称是
包名.类名

编译命令:javac –d
位置(.当前路径)java源文件
(就可以自动生成包)

包是一种封装形式,用于封装类,想要被包以外的程序访问,该类必须public;
类中的成员,如果被包以外访问,也必须public;

包与包之间访问可以使用的权限有两种:
1:public

2:protected:只能是不同包中的子类可以使用的权限。

public protected default
private

同一个类中
ok ok ok
ok

同一个包中
ok ok
ok

子类
ok ok

不同包中
ok

为了简化类名的书写,就使用一个关键字,import
import
包名;
或者 import 包名.*;
import
导入的是包中的类。
建议不要写通配符*,需要用到包中的哪个类,就导入哪个类。
建议定包名不要重复,可以使用url来完成定义,url是唯一的。

例:www.itcast.cn

常见的软件包:
java.lang : language java的核心包,Object
System String Throwable jdk1.2版本后,该包中的类自动被导入。

java.awt :
定义的都是用于java图形界面开发的对象。

javax.swing:
提供所有的windows桌面应用程序包括的控件,比如:Frame , Dialog, Table, List
等等,就是java的图形界面库。

java.net :
用于java网络编程方面的对象都在该包中。

java.io : input
output 用于操作设备上数据的对象都在该包中。比如:读取硬盘数据,往硬盘写入数据。

java.util : java的工具包,时间对象,集合框架。
java.applet: application+let
客户端java小程序。server+let
--> servlet 服务端java小程序。


jar
:java的压缩包,主要用于存储类文件,或者配置文件等。

命令格式:jar –cf
包名.jar
包目录

解压缩:
jar –xvf包名.jar

将jar包目录列表重定向到一个文件中:jar
–tf 包名.jar>c:\1.txt
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: