java 自学日志【八】---异常

来源:互联网 发布:九章算法班视频百度云 编辑:程序博客网 时间:2024/05/16 07:04

------android培训,java培训,期待与您交流------

异常:程序在运行时出现的不正常情况,是对问题的描述,把问题封装成对象,java中对这种不正常情况描述后的对象体现就叫异常。

java对于异常的划分:①严重问题:java通过Error类进行描述;一般不编写针对性代码进行处理;

                                     ②非严重问题:java通过Exception类进行描述。可以使用针对性处理方式;

无论Error还是Exception都有一些共性内容,比如不正常情况的原因,信息等。

 

异常体系:Throwable类 是所有Error和Exception的父类;

Throwable

     \----Error

     \----Exception

                   \----RuntimeException

                   \----CheckedException

异常的分类:

编译时被检测异常 CheckedException

该异常在编译时如果没有处理(没有throws也没有try),那么编译失败。该异常被标识,代表着可以被处理。

 

运行时异常,(编译时不检测)RuntimeException

在编译时不需要处理,编译器不检查。该异常发生,建议不处理,让程序停止,需要对代码进行修正。

 

异常的处理:java 提供特有语句进行处理。try,catch ,finally语句;

try  //把容易出现异常的语句放入try中

{需要被检测的代码}

catch(异常类 变量)

{处理异常的代码--处理方式}//如果无异常,catch语句不运行;

finally

{一定会被执行的代码,如释放资源}

注意:

1.finally中定义的通常是关闭资源代码。因为资源必须释放。

2.finally只有一种情况不会执行。当执行到System.exit(0);finally不会执行。

格式通常有3种组合方式:

① try和catch一组;②try和catch,finally一组;③try和finally一组;

注意:catch是处理异常,如果没有catch,就代表异常没有处理过,如果该异常是检测时异常,那么必须声明出去;

 

异常体系的特点:异常体系中的所有类以及建立的对象都具备可抛性。也就是说可以被throw和throws关键字所操作。只有异常体系具备这个特点。

 

throw和throws的用法:

throw定义在函数内,用于抛出异常对象。

throws定义在函数上,用于抛出异常类,可以抛出多个逗号隔开。

当函数内容有throw抛出异常对象,并未进行try处理,必须要在函数上声明,否则编译失败。

注意:RuntimeException除外,也就是说,函数内如果抛出的是RuntimeException异常,函数上可以不用声明。

 

对catch到的异常对象进行常见方法操作:

.getMassage():获取异常信息;

.toString():异常名称 异常信息;

.printStackTrace():最全面,异常信息,位置,名称;

jvm默认的异常处理机制,就是调用printStackTrace打印;

例句:

class Chu{public static void main(String[] args) {chu(4,0);}public static void chu(int x ,int y){try{int z = x/y;System.out.println("z="+z);}catch (Exception e){throw new RuntimeException("除0了");}}}

 

声明异常时,建议声明较为具体的异常,这样处理更具体,对方声明几个异常,就对于几个catch代码块,如果多个catch块中的异常出血继承关系,父类异常catch块放最下面;

 

自定义异常:项目中会出现特有问题,而问题并未被java描述并封装成对象,所以对于这些特有问题,按照java对问题封装的思想,将特有问题进行自定义的异常封装。

定义类extends Exception或RuntimeException,这样就具备了可抛性,也具备了操作异常的共性方法;

 

如何定义异常信息?

可以使用父类已经定义好的功能,将异常信息传递给父类的构造函数;

class fushuException extends Exception{fushuException(String msg){super(msg);}}

 

运行时异常:RuntimeException

如果在函数内容抛出该异常,函数上可以不用声明,编译一样通过;

如果在函数上声明了该异常,调用者可以不用进行处理,编译一样通过;

之所以不用在函数上声明,是因为不需要让调用者处理,自定义异常时,如果发生运行时异常,无法再进行运算,就让自定义异常继承该异常,如果函数声明了。调用者需要处理。

 

异常在子类父类覆盖中的体现:

①子类在覆盖父类时,如果父类的方法抛出异常,那么子类的覆盖方法,只能抛出父类的异常或该异常的子类或者不抛;

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

③如果父类或接口的方法中没有异常抛出,那么子类在覆盖方法时,也不能抛出异常,如果子类方法发生异常,必须进行try处理,绝对不能抛。

 

异常的好处:

①将问题进行封装;

②正常代码和问题处理代码分离,增强阅读性;

 

异常处理原则:

①处理方式两种,要么throws要么try-catch-finally;

②调用到抛出异常功能时,抛出几个,处理几个,一个try对于多个catch;

③多个catch,父类的catch放到最下面;

④catch内需要定义针对性的处理方式,不要简单的定义输出语句,也不要不写;

注意:

①当捕获到异常本功能处理不了,可以继续在catch中抛出;

try{throw new AException}

catch (AException e){throw e};

②如果该异常处理不了,但并不属于该功能出现的异常,可以将该异常转换后,再抛出和该功能相关异常;

③如异常可以处理,但需要将该异常产生的和本功能相关的问题提供出去,让调用者知道,并处理,也可以捕获异常处理后,转换新的异常;

 

Package 包:java中的文件夹

包的作用:①对类文件(.class)进行分类管理;

                   ②给类提供多层命名空间;

注意:写在程序文件的第一行,包名.类名;

包也是封装的一种体现形式;

若使用package定义包,编译时没有问题;问题主要发生在调用时。

在源文件目录下,编译后使用“java包名.类名”命令,会出现“wrong name”错误提示,这是由于编译时直接编译在了当前目录下,并没有创建你定义的包。
解决方法:
a.使用“javac –d .类名”,这时会在当前目录下创建定义的包,并把class文件存放在该包中;注意“.”前后要有空格。
b.使用“javac –d指定目录类名”,会在指定目录下创建包,这时会在指定目录下创建定义的包,并把class文件放在包中;同时还有把指定的目录加进classpath中,否则会出现找不到类错误。

外部程序包使用包中的类时,该类必须使用类名.包名(否则会报“找不到符号”错误),且类必须是public(否则会出现无法访问提示)。

总结:包与包之间进行访问,被访问的包中的类即类中的成员用public修饰。

不同包中的子类还可以直接访问父类中被protected权限修饰的成员。

包与包之间可以使用的权限,只有publicprotected两种。

类公有后,被访问的成员也要公有;

权限修饰符比较:

public

protected

default

private

同一个类中

同一个包中

×

子类

×

×

不同包中

×

×

×

 

import:关键字,导入包中的类;

注意:①导入包时,并不导入包中的子包,如需导入子包中的类,需要再导入子包;

②建议不使用*,只导入自己需要的类;

③如果两个包中有同名类,则该类必须加包名;

④为了避免包重复,建议使用url(地址反转)完成定义包;

⑤包名全小写;

 

jar包:java的压缩包

作用:方便项目携带,方便使用,只要在classpath中设置jar路径即可,数据库驱动,ssh框架都是以jar包体现的;

使用方法:jar命令:

jar -cf hah.jar packa packb 即把包packa和packb压缩成 hah.jar文件;

jar -tf a.jar>c:\y.txt 把a.jar包中的详细信息吸入y.txt中;

 

jar包相当于被压缩的包的根目录,设置classpath就可以使用指定目录下的jar包中的类。