1、finally
存放一定会被执行的代码
通常用于关闭资源。
2、覆盖式的异常特点
子类在覆盖父类时,如果父类的方法抛出异常,那么子类的覆盖方法,只能抛出父类的异常或者该异常的子类
如果父类方法抛出多个异常,那么子类在覆盖该方法时只能抛出父类异常的子集
如果父类或者接口的方法中,没有异常抛出,那么子类在覆盖方法时,也不可以抛出异常。如果子类方法发生了异常,那就必须要进行try处理,绝对不能抛
3、练习
public class ExceptionTest1
{
public static void main(String[] args)
{
Rec r=new Rec(-3,4);
r.getArea();
}
}
interface Shape
{
void getArea();
}
class Rec implements Shape
{
private int length,width;
Rec(int length,int width)
{
if(length<0 || width<0)
{
throw new NoValueException("非法");
}
this.length=length;
this.width=width;
}
public void getArea()
{
System.out.println(length*width);
}
}
class NoValueException extends RuntimeException
{
NoValueException(String msg)
{
super(msg);
}
}
4、异常总结
是什么?是对问题的描述,将问题进行对象的封装。
异常体系:
Throwable
Error
Exception
RuntimeException
异常体系的特点:
异常体系中的所有类,以及建立的对象都具有可抛性。可以被throw和throws关键字所操作。
throw和throws的用法:
throw定义在函数内,用于抛出异常对象。
throw定义在函数上,用于抛出异常类,可以抛出多个,用逗号隔开
当函数内由throws抛出异常,并未进行try处理,必须在函数上声明,否则编译失败。
注意:RuntimeException除外,也就是说,函数内如果抛出RuntimeExceptin异常,函数上可以不用声明.
如果函数声明了异常,调用者需要进行处理,处理方法可以throws可以try
异常有两种:
编译时被检测异常
该异常在编译时没有处理(没抛也没try),编译失败)
该异常被标识,代表这可以被处理。
运行时异常(编译时不检测)
在编译时,不需要处理,编译器不检查
该异常发生,建议不处理,让程序停止,需要对代码进行修正。
异常处理的语句:
try{需要被检测的代码}catch{处理异常的代码}finally{一定会执行的代码}
有三种结合格式
try{}catch{}
try{}finally{}
try{}catch{}finally{}
注意:
finally定义的通常是关闭资源代码,因为资源必须要释放
finally只有一种情况不会执行。当执行到System.exit(0);时
自定义异常:
定义类继承Exception或者RuntimeException
为了让该自定义类具备可抛性
让该类具备操作异常的共性方法
当要定义自定义异常的信息时,可以使用父类已经定义好的功能。
异常信息传递给父类的构造函数
class MyExceptin Exceptin
{
MyExceptin(String msg)
{super(msg);}
}
自定义异常时按照java的面向对象思想,将程序中出现的特有问题进行封装。
异常的好处:
将问题进行封装。
将正常流程代码和问题处理代码相分离,方便阅读。
异常的处理原则:
处理方式有两种:try或者 throws
调用到抛出异常的功能时,抛出几个就处理几个。一个try对应多个catch.
多个catch,父类的catch放到最下面
catch内,需要定义针对性的处理方式,不要简单的定义printStackTrace,或输出语句,也不要不写。当捕获到的异常,本功能处理不了时,可以继续在catch中抛出。
如果该异常处理不了,但并不属于该功能出现的异常。可以将异常转换后,再抛出和该功能相关的异常。或者异常可以处理但需要将异常产生的和本功能相关的问题提供出去让调用者知道并处理,也可以将捕获异常处理后转换新的异常输出。
异常的注意事项:
在字父类覆盖时,
子类抛出的异常必须是父类异常的子类或者子集
如果父类或者接口没有异常抛出时,子类覆盖出现异常,只能try不能抛。
包package
对类文件进行分类管理
给类提供多层命名空间
写在程序文件的第一行
类名的全称是:包名.类名
包也是一种封装形式。
package pack;
public class PackageDemo
{
public static void main(String[] args)
{
System.out.println("Hello package!!!");
}
}
注意编译时,要加参数-d:javac -d . PackageDemo.java
set classpath=d:/
包与包之间访问
包与包之间进行访问,被访问的包中的类以及类中的成员,需要public修饰
不同包中的子类还可以直接访问父类中被protected权限修饰的成员
包与包之间可以使用的权限:public protected
public protected default private
同一个类中 ok ok ok ok
同一个包中 ok ok ok
子类 ok ok
不同包中 ok
导入import
为了简化类名的书写,使用一个关键字,import
当导入包中类名相同时,在定义类时,需要些全称,即类前加包名
建议包名不要重复,可以使用url来完成定义,url是唯一的 cn.gzy.demo cn.gzy.test
package pack;
import packa.*;
class JarDemo
{
public static void main(String[] args)
{
DemoA a = new DemoA();
a.show();
System.out.println("Hello jar pack!");
}
}
jar包
java的压缩包
>路径(dos中的数据重定向)
jar -cf gzy.jar pack packa