轻松搞定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类去实现即可。
五:经典例题
一: 异常的体系结构
专业术语: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类去实现即可。
五:经典例题
相关文章推荐
- 读取、回收和重用:使用 Excel、XML 和 Java 技术轻松搞定报告,第 2 部分
- 读取、回收和重用:使用 Excel、XML 和 Java 技术轻松搞定报告在 XML 和 Excel 报告格式之间转换(2)
- 读取、回收和重用:使用 Excel、XML 和 Java 技术轻松搞定报告使用 Java 和 XML 技术读取 Excel 文件并写入新文件(1)
- .“在JAVA中,异常子类必须在它们任何父类之前使用,因为运用父类的catch语句将捕获该类型及其所有子类类型的异常。这样,后面运行子类的catch语句将永远不会到达。而且,Java中不能到达的代码是一个错误。”
- java异常处理之使用异常的技巧与原则
- struts2使用拦截器时产生java.lang.IllegalStateException异常解决办法
- 轻松搞定VS2010 和旧版本服务器一起使用的问题
- FCK 异常小结(使用JAVA-core-2.5.jar)
- 在JAVA中轻松使用AJAX
- hibernate使用了乐观锁后报java.lang.NullPointerException 异常的原因
- HPUX环境,在WebLogic服务器中使用java调用C动态连接库异常问题总结
- java使用jdbc轻松连接访问access
- 使用Filter时产生java.lang.IllegalStateException异常解决办法
- 使用Java程序从数据库中查询大量的数据时出现异常:java.lang.OutOfMemoryError: Java heap space
- 浅析Java语言中两种异常使用的差别
- 使用iBatis中报 java.sql.SQLException: 无效的列类型异常
- java异常处理之使用finally
- Effective Java(2nd Edition) Item 57 仅为例外条件使用异常(译文)
- java 异常及异常使用总结
- 使用Hibernate轻松解决java中date与datetime类型不兼容的问题