记得有人说过,世界上不存在没有BUG的软件。一个好的异常处理体系可以增强软件的健壮性。所谓异常,就是程序在运行时出现的不正常的情况。异常就好比生活中的问题。问题时现实生活中的一个具体事物,无法忽视,而Java自然也不会对异常置之不理,Java通过类的形式把异常封装成对象,也是Java对不正常情况进行描述后的对象体现。
Java中对问题有两种划分,一种是严重的问题,一种是非严重问题, 对于严重的,java通过Error类进行描述。对于Error一般不编写针对性的代码对其进行处理。对与非严重的,java通过Exception类进行描述。对于Exception可以使用针对性的处理方式进行处理。无论Error或者Exception都具有一些共性内容,比如:不正常情况的信息,引发原因等。因此,就把这些共性的东西抽取出来封装成一个父类Throwable,该类下面有两个子类:Error,通常出现重大问题如:运行的类不存在或者内存溢出等,不编写针对代码对其处理;Exception,在运行时运行出现的一起情况,可以通过try catch finally,具体的格式如下:
try{
需要被检测的代码;
}catch(异常类 变量){
处理异常的代码;(处理方式)。
}finally{
一定会执行的语句;
}//注意:Finally代码块只有一种情况不会被执行。就是在之前执行了System.exit(0),即return;而Exception和Error的子类名都是以父类名作为后缀。我们遇到的try,cactch,finnally给事可能与三种:第一个格式:
try{
}catch (){
}
第二个格式:
try{
}catch (){
}finally{
}
第三个格式:
try{
}finally{
}
记住一点:catch是用于处理异常。如果没有catch就代表异常没有被处理过,如果该异常是检测时异常。那么必须声明。
对捕获到的异常对象进行常见方法操作一般在Throwable中的方法,主要有:
getMessage( ):获取异常信息,返回字符串。
l toString( ):获取异常类名和异常信息,返回字符串。
l printStackTrace( ):获取异常类名和异常信息,以及异常出现在程序中的位置,返回值void。这是Java的默认的异常处理机制:打印异常的堆栈的跟踪信息。
printStackTrace( PrintStream s ):通常用该方法将异常内容保存在日志文件中,以便查阅。
在异常处理体系中有throws和throw啷个关键字。throws用于标识函数暴露出的异常,这样便于提高安全性,让调用处进行处理,不处理的话就会编译失败。throw用于抛出异常对象。throws与throw的两者之间有一定的区别:thorws用在函数上,后面跟异常类名,可以跟多个,用逗号隔开即可。throw用在函数内,后面跟异常对象,即在功能上通过throws关键字声明该功能可能会出现的问题。在处理异常的时候,我们应该对异常的处理歇息些,这样的话可以使得处理更为具体。具体的处理部分在ccatch部分,仅仅打印根本上没什么大的意义。
项目中会出现特有的问题,而这些问题并未被java所描述并封装对象。所以对于这些特有的问题可以按照java的对问题封装的思想。将特有的问题。进行自定义的异常封装。一般而言自定义类继承Exception或者其子类,通过构造函数定义异常信息,原因是异常体系有一个特点:因为异常类和异常对象都被抛出。他们都具备可抛性。这个可抛性是Throwable这个体系中独有特点。只有这个体系中的类和对象才可以被throws和throw操作。例如:
Class DemoExceptionextends Exception {
DemoException(String message){
super(message);
}
}
Exceptoin中有一个特殊的子类异常RuntimeException(运行时异常)。如果在函数内抛出该异常,函数上可以不用声明,编译一样通过。如果在函数上声明了该异常。调用者可以不用进行处理。编译一样通过。之所以不用在函数声明,是因为不需要让调用者处理。当该异常发生,希望程序停止。因为在运行时,出现了无法继续运算的情况,希望停止程序后,对代码进行修正。自定义异常时:如果该异常的发生,无法在继续进行运算,就让自定义异常继承RuntimeException。
对于异常分两种:编译时被检测的异常;编译时不被检测的异常(运行时异常。RuntimeException以及其子类),RuntimeException以及其子类如果在函数中被throw抛出,可以不用在函数上声明。一个方法被覆盖时,覆盖它的方法必须抛出相同的异常或异常的子类。
如果父类抛出多个异常,那么重写(覆盖)方法必须抛出那些异常
的一个子集,不能抛出新的异常。如果父类或者接口的方法中没有异常抛出,那么子类在覆盖方法时,也不可以抛出异常。如果子类方法发生了异常。就必须要进行try处理。绝对不能抛。
至此类的部分就大部分结束了,这里还有几个小概念需要解决下。
包(package),对类文件进行分类管理,给类提供多层命名空间。 写在程序文件的第一行,类名的全称的是包名. 类名,包也是一种封装形式。被访问的包中的类权限必须是public的。类中的成员权限:public或者protected。其中protected是为其他包中的子类提供的一种权限。这里一共有四中权限,具体如下:
| public | protected | Default默认 | private |
同一个类中 | ok | ok | ok | ok |
同一个包中 | ok | ok | ok |
|
子类 | ok | ok |
|
|
不同包中 | ok |
|
|
|
Java一些常用的包有:
java.lang : java的核心包 jdk1.2版本以后,该包中的类自动导入。
java.awt: 用于制作图形界面。
java.io:input output 用于操作设备上的数据。
java.util : 这里定义是java的工具类。集合,日期。
java.net:用于网络通讯的。
java.applet: application let,server let(servlet) java server page(jsp)。
classpath给JVM提供的一个环境变量,指定类或者包所在的路径,classpath变量值的最后有分号与无分号的区别:若末尾加上了分号,则在环境变量中寻找,若没有则在当前目录中寻找,若末尾没有分号则仅仅在环境变量中寻找,一般建议不要加分号.import可以简化类名。一个程序文件中只有一个package,可以有多个
import。用来导包中的类,不导入包中的包。通常写import mypack.Demo;而不写import mypack.*是为了加快效率。
Jar包:Java的压缩包,他的作用是方便项目的携带,•方便于使用,只要在classpath设置jar路径即可,她是数据库驱动,SSH框架等都是以jar包体现的。Jar包的操作是通过jar.exe工具对jar的操作。创建jar包:jar -cvf mypack.jar packa packb:查看jar包:jar -tvf mypack.jar [>定向文件]。