您的位置:首页 > 编程语言 > Java开发

轻松搞定Java中异常的使用

2017-06-12 20:02 393 查看
Java之异常详解

一: 异常的体系结构



    专业术语:Object用String类型初始化,然后把它赋给Date类型的引用,出现类型转换异常。

    结论:对于这个运行时异常,正常开发中可以不用考虑使用异常处理。对于编译时异常来说我们必须使用异常处理

2.从程序执行过程,看编译时异常和运行时异常



javac:编译过程中可能出现异常:编译时异常

java:解释运行的过程中可能出现的异常:运行时异常

对于运行时异常来说,我们可以不用考虑使用异常处理。  

对于编译时异常来说,我们必须使用异常处理来处理异常,否则,编译不通过。

3.常见的异常类型,请举例说明:

|-----ArithmeticException:算术异常

|-----ArrayIndexOutOfBoundsException:数组角标越界异常

|-----ClassCastException:类型转换异常

|-----NullPointerException:空指针异常

二:异常的处理方式

1.java异常处理的抓抛模型

过程一: "抛"  -----异常对象生成的过程

java程序在正常的执行过程中,一旦出现异常,程序就会在异常代码的位置创建一个相应的异常类的对象,并将此对象抛出。抛给方法的调用者。而且一旦抛出异常对象,程序就终止继续执行。

关于异常对象的创建:①系统自动创建一个异常类对象  ②手动创建一个异常类的对象,并抛出(throw)。

过程二: "抓" ------异常的处理方式

处理方式一:try-catch-finally

处理方式二:throws

2.异常处理方式一:

try{

 * 

 * //可能存在异常的代码

 *  }catch(异常类型1 e1){

 *   //异常e1的处理方式

 *  }catch(异常类型2 e2){

 *   //异常e2的处理方式

 *  }

 *  ....

 *  finally{

 *   //一定要被执行的代码

 *  }

说明:

0..try内声明的变量,类似于局部变量,出了try{}语句,就不能被调用

1.finally是可选的的

2.如果try中的代码执行时,出现异常,则创建对应的异常类的对象,并抛出。

 *       在catch中根据异常对象的类型进行匹配,如果匹配成功,则执行catch中异常处理的方式。

 *       执行完catch语句以后,跳出当前的try-catch结构

3.try-catch执行完异常处理以后,后续的代码依然可以执行。

4.在try中定义的变量,超出其一对{}后,就结束生命周期了,不能被调用。

5.多个catch中的异常类型,如果不满足子父类关系,则谁先声明,谁后声明都可以.

 *多个catch中的异常类型,如果满足子父类关系,则必须将子类声明在父类的上面。否则编译不通过。

6. 常用的异常处理的方式:①输出打印e.getMessage() ②e.printStackTrace()

7.try-catch-finally可以嵌套使用

8.如果异常处理了,那么其后的代码继续执行。否则异常代码后面的代码不执行。

2.1:finally的再说明:
>将一定要被执行的代码,声明在finally中
    finally中存放的是一定会被执行的代码,不管try中、catch中是否仍有异常未被处理,以及是否有return语句。(只       有结构中有异常则finally就会执行)如io流,网口SOCKET,数据库的连接等作为系统资源,不会被JVM回收,要       手动的释放,所以要写到finally.
>即使在catch中又出现异常了,以及try中、或catch出现了return也不能改变finally要被执行的事实。
>开发中的实例:io流、网络Socket、数据库的连接等作为系统资源,不会被JVM自动回收,需要我们手动调用相关的    方法,实现资源的释放。要求此释放的操作,一定会被执行。

2.[面试题] final \ finally \ finalize() 的不同
 * 
 *  2.1 结构比较类似
 *  方法的override-overwrite / overload 
 *  Collection /Collections
 *  String / StringBuffer / StringBuilder
 *  throw / throws
 *  ArrayList / LinkedList / Vector
 *  ... 
 *  2.2结构不类似:
 *  抽象类和接口
 *  wait() 和 sleep()

3.异常处理方式二:
在方法的声明的后面: throws  异常类型1,异常类型2,...
如果方法使用throws的方法处理异常,如果方法内真正出现了异常,则会将异常抛给方法的调用者在方法的声明处,显式的使用throws + 异常类型(只是向上抛出异常,抛给方法的调用者,可以逐层向上抛,实际并无处理,直至main方法,虚拟机,真正要处理还要靠try ,catch.,)。

4. 体会开发中应该如何选择两种处理方式?
  异常的处理终究还是要使用到方式一,真正处理异常的。
 *   使用方式二的情境:在main()中调用多个其他的方法,建议多个其他的方法中如果异常的话,择throws
 *   使用方式一的情境:如果父类被重写的方法没有抛异常,则子类重写的方法也不能throws,只能try-catch-finally。

三:如何手动抛出异常

【说明】 
我们在程序执行时,除了系统能自动创建异常对象之外,我们还可以通过代码的方式,手动的创建一个异常的对象,并抛出(throw).在方法的内部,可以使用  throw + 异常类对象,来手动的抛出一个异常(此异常类,既可以是现成的异常类,也可以是自己创建的 )!如果抛出的是RuntimeException可以不显示的处理,但如果是Exception则必须要显示的处理,不然编译不通过。

【面试题】 
throw 和 throws 区别
【典型例题】
class Student{
int id;
public void regist(int id) throws Exception{
if(id <= 0){
//throw new RuntimeException("传入的编号非法");
//throw new Exception("传入的编号非法");
//throw new String("传入的编号非法");//错误的

throw new MyException("传入的编号非法!!!^_^");
}
this.id = id;
}
@Override
public String toString() {
return "Student [id=" + id + "]";
}
}
四:如何自定义异常


    如何自定义一个异常类?

 * 1.继承于现的异常体系结构。一般继承于Exception或RuntimeException

 * 2.提供重载的构造器

 * 3.提供序列版本号的常量

 * static final long serialVersionUID = -7034897196939L;
   参照RuntimeException类去实现即可。


五:经典例题









内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐