异 常
java.lang.Throwable:
l 异常的体系
Throwable
l Error
通常出现重大问题如:运行的类不存在或者内存溢出等。
不编写针对代码对其处理
l Exception
在运行时运行出现的一起情况,可以通过try catch finally
Exception和Error的子类名都是以父类名作为后缀无论是错误还是异常,它们都有具体的子类体现每一个问题,它们的子类都有一个共性,就是都以父类名才作为子类的后缀名。
函数中 有异常发生没有对异常进行捕捉处理 程序会结束运行
这个体系中的Exception类和对象都具备一个独有的特点;就是可抛性。
可抛性的体现:就是这个体系中的类和对象都可以被throws和throw两个关键字所操作。
------------------------------------------------------
try
{
int x =d.div(4,-1); //测试的代码
System.out.println("x= "+x);
}
catch (Exception e)//Exception e = new ArithmeticException(); 多态 父类引用指向子类对象 父类作形参 可接收子类对象的实参
{
System.out.println("除零啦"+e.toString());
System.out.println(e.getMessage()); //by zero
System.out.println(e.toString()); //异常名称 异常信息
e.printStackTrace(); //异常名称 异常信息 异常出现的位置
}
//其实jvm默认的异常处理机制就是在调用printStackTrace();
------------------------------------------------------
在开发时,如果定义功能时,发现该功能会出现一些问题,应该将问题在定义功能时标示出来,这样调用者就可以在使用这个功能的时候,预先给出处理方式。
如何标示呢?通过throws关键字完成,格式:throws 异常类名,异常类名...
这样标示后,调用者,在使用该功能时,就必须要处理,否则编译失败。
处理方式有两种:1、捕捉;2、抛出。
对于捕捉:java有针对性的语句块进行处理。
try {
需要被检测的代码;
}
catch(异常类 变量名){
异常处理代码;
}
fianlly{
一定会执行的代码;
}
--------------------------------------------------------
异常Exception中的一些方法
getMessage() 获取异常信息,返回字符串。
toString() 获取异常类名和异常信息,返回字符串。
printStackTrace() 获取异常类名和异常信息,以及异常出现在程序中的位置。返回值void。
printStackTrace(PrintStream s) 通常用该方法将异常内容保存在日志文件中,以便查阅
---------------------------------------------------------
异常处理的好处
1,将问题进行封装
2,将正常流程代码和问题处理代码相分离,方便阅读
异常处理原则:
1,处理方式有两种,try或者throws可抛可try
2,调用到抛出异常的功能时抛出几个,就处理几个, 一个try对应多个catch
3,多个catch,父类的catch放到最下面
4,catch内,需要定义针对性的处理方式,不要简单的定义printStackTrace,当捕获到的异常,本功能处理不了时,可以继续在catch中抛出
特殊情况:try对应多个catch时,如果有父类异常要放在最后一个的catch语句块
throw 和throws关键字
throws用于标识函数暴露出的异常。 使用在函数上
throw用于抛出异常对象。 使用在函数内
throws与throw的区别:
• thorws用在函数上,后面跟异常类名。
• throw用在函数内,后面跟异常对象。
通常情况:函数内容如果有throw,抛出异常对象,那么函数上一定要声明,否则编译失败。但是也有特殊情况。
异常分两种:
1:编译时被检查的异常
该异常在编译时,如果没有处理,就会编译失败,该异常被标识代表可以被处理
2:运行时异常(编译时不检测),
在编译时,不需要处理,编译器不检查,该异常的发生,建议不处理,让程序停止,需要对代码进行修正
RuntimeException是运行时异常,,
如果在函数内抛出该异常,函数上可以不用声明,编译一样通过
如果在函数上声明了该异常,调用者可以不用进行处理,编译一样通过
之所以不用在函数上声明,是因为不需要让调用者处理。当该异常发生,希望程序停止,因为在运行时,出现了无法继续运算的情况,希望停止程序后,对代码进行修正
编译时被检查的异常和运行时异常的区别:
编译被检查的异常在函数内被抛出,函数必须要声明,否编译失败。
声明的原因:是需要调用者对该异常进行处理。
运行时异常如果在函数内被抛出,在函数上不需要声明。
不声明的原因:不需要调用者处理,运行时异常发生,已经无法再让程序继续运行,所以,不让调用处理的,直接让程序停止,由调用者对代码进行修正。
定义异常处理时,什么时候定义try,什么时候定义throws呢?
功能内部如果出现异常,如果内部可以处理,就用try;
如果功能内部处理不了,就必须声明出来,让调用者处理。
自定义异常:当开发时,项目中出现了java中没有定义过的问题时,这时就需要我们按照java异常建立思想,将项目的中的特有问题也进行对象的封装。这个异常,称为自定义异常。
自定义异常的步骤:
1:定义一个子类继承Exception或RuntimeException,让该类具备可抛性。
2:通过throw 或者throws进行操作,以及捕获处理trycatch操作。
自定义异常,如果该异常的发生使程序无法继续进行运算,那么久让该异常继承RuntimeException
异常的转换思想:当出现的异常是调用者处理不了
当异常出现后,在子父类进行覆盖时,有了一些新的特点:
1:当子类覆盖父类的方法时,如果父类的方法抛出了异常,那么子类的方法要么不抛出异常要么抛出父类异常或者该异常的子类,不能抛出其他异常。
2:如果父类抛出了多个异常,那么子类在覆盖时只能抛出父类的异常的子集。
异常细节
l RuntimeException以及其子类如果在函数中被throw抛出,可以不用在函数上声明。
l 一个方法被覆盖时,覆盖它的方法必须抛出相同的异常或异常的子类。
l 如果父类抛出多个异常,那么重写(覆盖)方法必须抛出那些异常的一个子集,不能抛出新的异常。 子类抛出的异常必须属于父类 如果子类有父类的异常以外的异常绝对不能抛出必须进行try处理
l 介绍异常在分层设计时的层内封装。
注意:
如果父类或者接口中的方法没有抛出过异常,那么子类是不可以抛出异常的,如果子类的覆盖的方法中出现了异常,只能try不能throws。
如果这个异常子类无法处理,已经影响了子类方法的具体运算,这时可以在子类方法中,通过throw抛出RuntimeException异常或者其子类,这样,子类的方法上是不需要throws声明的。
常见异常:
1、脚标越界异常(IndexOutOfBoundsException)包括数组、字符串;
空指针异常(NullPointerException)
2、类型转换异常:ClassCastException
3、没有这个元素异常:NullPointerException
4、不支持操作异常;
异常要尽量避免,如果避免不了,需要预先给出处理方式。。
======================================================================
包(package)包名所有字母小写
对类文件进行分类管理。
给类提供多层命名空间。
写在程序文件的第一行。
类名的全称的是 包名.类名。
包也是一种封装形式。
包之间的访问
被访问的包中的类权限必须是public的。
类中的成员权限:public或者protected
protected是为其他包中的子类提供的一种权限
如果生成的包不在当前目录下,需要最好执行classpath,将包所在父目录定义到classpath变量中即可。或者导入
一般在定义包名时,因为包的出现是为了区分重名的类。所以包名要尽量唯一。怎么保证唯一性呢?可以使用url域名来进行包名称的定义。
package pack;//定义了一个包,名称为pack。注意:·包名的写法规范:所有字母都小写。
//packagecn.itcast.pack.demo;
类的全名称是 包名.类名
编译命令:javac –d位置(.当前路径) java源文件 (就可以自动生成包)
包是一种封装形式,用于封装类,想要被包以外的程序访问,该类必须public;
类中的成员,如果被包以外访问,也必须public;
同一个类中 成员之间的访问规则 同一个包中不同类之间成员的访问规则 不同包(必然不同类)中不同类间访问的规则 同包不同包的子类
总结
包与包之间进行访问,被访问的包中的类以及类中的成员,需要public修饰
不同包中的子类还可以直接访问父类中被protected权限修饰的成员,包与包之间可以使用的权限只有两种,public proected
当类的权限是public时保存的java文件的名字必须和类的名字相同否则编译出错
一个java文件中只能有一个公共类或公共接口
-------------------------------------------------------------------------------------------
Import -导入:类名称变长,写起来很麻烦。为了简化,使用了一个关键字:import,可以使用这个关键字导入指定包中的类。记住:实际开发时,到的哪个类就导入哪个类,不建议使用*.
import packa.*;//这个仅仅是导入了packa当前目录下的所有的类。不包含子包。
import packa.abc.java;//导入了packa包中的abc.java。
如果导入某包中的所有类,当两个包中存在着相同名称的类。那么必须在代码中指定包名。
如果指定了具体导入的类 而原包中也有同名类是 导入的同名类将取代 原包中的同名类
jar :java的压缩包,主要用于存储类文件,或者配置文件等。
命令格式:jar –cf 包名.jar 包目录
解压缩:jar –xvf 包名.jar
将jar包目录列表重定向到一个文件中:jar –tf 包名.jar>c:\1.txt