1、finally,存放的是一定会被执行的代码,无论任何情况都会执行,包括程序终止。通常用于关闭资源。
2、异常三种格式
格式一:try{}catch(){}
格式二:try{}catch(){}finally{}
格式三:try{}finally{}
异常:问题只要被解决就不用再函数后声明,catch是用于处理异常的,有catch就表示被解决。没有catch就没有处理(此时异常必须被声明出去)。注意以下几种情况:情况一:class Demo{
public void method(){
try{
throw new Exception();//此时的异常内部处理,//catch解决了,因此可以编译通过
}catch(Exception e){
}
}
}
情况二:class Demo
{public void method()
{try
{throw new Exception();//抛异常}catch(Exception e)//接收异常并处理
{
throw e;//处理方式为抛异常
//这次抛出的异常没有方式解决,编译不通过
}}}
情况三:class Demo
{
public void method()
{try
{throw new Exception();//抛异常}
catch(Exception e)//接收异常并处理{try
{throw e;//此时的异常内部处理,}
catch( Exception e)//被处理,编译通过
{}}}}
情况四:class Demo
{public void method()
{try
{throw new Exception();//没有catch,因此编译不//通,需要声明出去,即在method()后加 throws//Exception}finally
{
//关资源,一些必须执行的语句
3、异常在子父类覆盖中的体现:}}}
子类在覆盖父类时,如果父类的方法抛出异常,那么子类的覆盖方法,只能抛出父类的异常或者该异常的子类。
如果父类方法抛出多个异常,那么子类在覆盖方法时,只能抛出父类异常的子集。
如果父类或者接口的方法中没有异常抛出,那么子类在覆盖方法时,也不可以抛出异常。如果子类方法发生了异常,那么就必须进行try处理,绝对不能抛。
class AException extends Exception
{
}
class BException extends AException
{
}
class CException extends Exception
{
}
class Fu{
void show() throws AException//父类抛异常{
}
}class Zi extends Fu{
void show() throws AException// 父类抛AException ,因此子类//只能抛AException,或其子类BException , 不能抛Exception
}class Test{
void function(Fu f){
try{
f.show();//调用了抛AException异常的方法
}catch( AException e)//因此此时用AException{}
}
4、异常总结}
异常:是对问题的描述,将问题进行对象的封装。异常体系:Throwable
ErrorException
RunTimeException
异常体系特点:异常体重的所有类以及建立的对象都具备可抛性。也就是说可以被throw 和throws所操作,只有异常体系具备这个特点。
throw 和throws用法:
当函数内容有throw抛出异常对象,并未进行try处理,必须要在函数上声明,否则编译失败。注意:RunTimeException除外,也就是说,函数内如果抛出的是RunTimeException,函数上可以不用声明throw定义在函数内,用于抛出异常对象throws定义在函数上,用于抛出异常,可以抛出多个,用逗号分开。
注意:throw语句下面不要放语句,因为永远执行不到,编译会失败,因为只要执行到throw,程序就终止到这里或跳转到catch了,throw后面的语句无法执行到。但是可以把throw封装到一个方法里,在该方法下面可以写语句,因为throw时,有函数声明,表明该方法可能出现问题,但也可能不出现,所以方法下面的语句有可能执行到,因此编译不出错
如果函数声明了异常,调用者需要进行处理,处理方法可以是throws或者try catch
异常有两种
编译时被检测异常
运行时异常(编译时不检测)该异常在编译时,如果没有处理(没有抛也没有try)编译失败该异常被标示,标示可以被处理
在编译时,不需要处理,编译器不检查该异常发生,建议不处理,让程序停止,需要对代码进行修正。
异常处理语句
try{
被检测的语句
}catch(){
异常处理语句
}finally{
一定执行的语句通常是关闭资源代码,因为资源必须释放
}
finally 注意:只有一种情况finally读不到,执行到System.exit(0),表示系统退出,JVM结束。不读finally。(有return ,仍然执行finally)
自定义异常:定义类继承Exception或RunTimeException
为了让该自定义类具备可抛性让该类具备操作异常的共性方法当要定义自定义异常的信息时,可以使用父类已经定义好的功能,异常信息传递给父类的构造函数即可class MyException extends Exception{
MyException(String message){
super(message);
}
}
自定义异常,按照java的面向对象思想,将程序中出现的特有问题进行封装
异常的好处:
异常的处理原则:将问题进行封装将正常流程代码和问题处理代码相分离,方便于阅读。
a、处理方式有两种,try catch 或者throwsb、调用到抛出异常的功能时,抛出几个就处理几个,一个try多个catch
c、多个catch,父类的catch必须放到最下面,否则编译失败d、catch,需要定义针对性的处理方式,不要简单的定义printStackTrace输出语句,也不要不写。
当捕获到异常,本功能处理不了时,可以继续在catch中抛出try{
}trow new AException();catch(AException e){
)throw e;该如果该异常处理不了,但并不属于该功能出现的异常。可以将异常转换后,再抛出和该功能相关的异常或者异常可以处理,当需要将异常产生的和本功能相关的问题提供出去,当调用者知道,并处理,也可以将捕获异常处理后,转换新的异常。try
{}
catch(AException e)trow new AException();
{)//对AException进行处理throw new BException();
异常注意事项:
在子父类覆盖时:
子类抛出的异常必须是父类的异常或者父类异常的子集如果父类或者接口没有异常抛出时,子类覆盖出现异常,只能try不能抛。
5、包package
对类文件进行分类管理;
给类提供多层命名空间;
写在程序文件的第一行;
类名的全称是:包名.类名;
包也是一种封装形式;
package pack;//包名所有字母小写
class PackageDemo
{
public void main(String[] args)
{
}
}
6、包与包之间关系注意:在编译的时候有些变化:javac -d 存放目录 类名.java 表示将包放在该目录中,此时java源文件在当前目录,而生成的class文件在指定目录,这个操作将二者分开了,在运行java 包名.类名 前 , 要set classpath=存放目录,这里存放目录到包的父级即可,不包括包。不设置set classpath的话jvm找不到class文件。
javac -d . 类名.java 表示将包放在当前目录中运行时java 包名.类名
public protected default private类A与类B在不同的包中,若在A中访问B中的成员与方法,那么类B必须是public的,B中的成员与方法也必须是public的。
不同包中的子类可以访问父类中被priotected权限修饰的成员理解:类A继承类B ,类A 类B 类C 在三个不同的包中,类B是public的,B中部分成员时public的,部分成员时protected的,类A是public的,类A成员是public的此时:类C可以访问A中所有成员,类C可以访问B中public的成员,类A可以访问B中所有成员。所以:类B中protected修饰的成员是专为其子类而提供的,非其子类不能访问。书写时:在C中访问A,需要在A前加上包名。包与包之间可以使用的权限只有两种 public protected
同一个类 OK OK OK OK
同一个包 OK OK OK
子类 OK OK
不同包 OK
一个.java文件中,可以存在多个类或接口,但只能存在一个用public修饰的类或接口,此时.java文件名与用public修饰的类或接口名一致。
7、jar包若想放问同一个包中的两个类,此时这两个类必须是public的,但是同一个.java文件中不能存在两个public类,因此可以将这两个public类分别写在两个源文件中即可,编译时生成两个.class文件,在同一个包中
包中有包的情况package packa.packb.packcpublic class Democ{}此时编译后的Democ.class文件放在packc中,packc在packb中,packb在packa中。
在一个包中,导入另一个后,再访问时就不用写包名了,用import,导入的是包中的类,不能导入包packdimport packb.*;//导入packb中所有类import packa.packb.packc.*;导入包packc中所有类class{}
建议:不适用.*,而是使用包中哪个类导入哪个类
另外:在导入另个包时,有重名的类,此时类名前必须加包名,但是一般都是尽量避免类名重复。尽量避免包名重复,对于包名可以使用url来完成定义。例如网址: www.itcast.cn包名可以定义为:cn.itcast.demo
在目录c:\myclass中存在两个包packa packb,将这两个包形成jar包
在命令提示行中:jar 显示jar中所有命令
进入到c:\myclass,jar
-cf
haha.jar
packa packb
参数命令
jar包名
包名
Microsoft Windows [版本 6.1.7601]
版权所有 (c) 2009 Microsoft Corporation。保留所有权利。
C:\Users\Administrator>jar
用法: jar {ctxui}[vfm0Me] [jar-file] [manifest-file] [entry-point] [-C dir] file
s ...
选项包括:
-c 创建新的归档文件
-t 列出归档目录
-x 解压缩已归档的指定(或所有)文件
-u 更新现有的归档文件
-v 在标准输出中生成详细输出
-f 指定归档文件名
-m 包含指定清单文件中的清单信息
-e 为捆绑到可执行 jar 文件的独立应用程序
指定应用程序入口点
-0 仅存储;不使用任何 ZIP 压缩
-M 不创建条目的清单文件
-i 为指定的 jar 文件生成索引信息
-C 更改为指定的目录并包含其中的文件
如果有任何目录文件,则对其进行递归处理。
清单文件名、归档文件名和入口点名的指定顺序
与 "m"、"f" 和 "e" 标志的指定顺序相同。
示例 1:将两个类文件归档到一个名为 classes.jar 的归档文件中:
jar cvf classes.jar Foo.class Bar.class
示例 2:使用现有的清单文件 "mymanifest" 并
将 foo/ 目录中的所有文件归档到 "classes.jar" 中:
jar cvfm classes.jar mymanifest -C foo/ .
查看jar包中内容 ,命令: jar -tf haha.jar
在把多个包打成一个jar包时,set classpath=jar包路径,这时可以直接编译运行就可以。
因此在网络上的一些jar包,可以把这些jar包放在classpath下,查看文档(docs 中的index.html),就可以直接使用了
将显示的信息存放在txt中,
如:dir > c:\1.txt ,此时dir出来的信息都放到1.txt中了。
又如将haha.jar中信息显示在2.txt中,jar -tf haha.jar > c:\2.txt