------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权限修饰的成员。
包与包之间可以使用的权限,只有public和protected两种。
类公有后,被访问的成员也要公有;
权限修饰符比较:
| 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包中的类。