黑马程序员_Java异常_Exception
来源:互联网 发布:linux内核启动流程 编辑:程序博客网 时间:2024/05/01 17:49
-------------------------ASP.Net+Unity开发、.Net培训、期待与您交流!--------------------------
java中的异常就是指在程序运行过程中出现了问题,现实生活中的问题是一个具体的事物,java作为面向对象的语言,则通过类描述问题,把
问题封装成对象。
异常体系:
Throwable
--Error
--Exception
--RuntimeException
Throwable类是Java语言中所有错误或异常的超类,Error和Exception是他的2个子类。对于Error,是严重的问题,一般不编写针对性的代码对其处理,
对于Exception则可以使用针对性的方式进行处理。
java可以通过try-catch语句来捕获程序中出现的问题的对象
try{程序} catch{Exception e} { e.printStackTrace(); }
Exception为异常问题被封装的对象的类型,e为一异常对象,内部封装了异常的信息; e.printStackTrace()就是打印出该问题对象中的异常信息。
如果定义一个方法可能会出现异常,则可通过在方法上加throws来声明异常,在调用该方法的函数中用try-catch捕获
int div(int a,int b) throws Exception{ return a/b;}
当然在声明异常时,建议声明为更具体的异常,这样处理可以更具体:int div(int a,int b) throws ArithmeticException
,也可以声明多个具体的异常int div(int a,int b) throws A,B,C,
具体异常类都为Exception的子类。
对于项目中出现的特有问题,我们可以通过继承Exception类定义自己的异常:
class SelfException extends Exception{ }
可以通过throw关键字抛出一个自定义的异常对象:
int div(int a,int b) { if(b<0) throw new SelfException(); return a/b;}
当在方法内部出现了throw抛出的异常对象,要么在方法上声明让调用者处理,要么在内部try-catch处理:
int div(int a,int b) throws SelfException{ if(b<0) throw new SelfException(); return a/b;}
或者
int div(int a,int b) { if(b<0) try { throw new SelfException(); } catch (SelfException e) { e.printStackTrace(); } return a/b; }
如果方法上声明了异常,则调用者处理的方法有throws或try
因为父类Exception已经把异常信息都操作完成了,所以子类在构造时将异常信息传递给父类通过super语句,
就可以直接通过getMessage方法获取自定义的异常。
class SelfException extends Exception{ SelfException(String message) { super(message); }}
我们自定义的异常继承Exception的原因:
因为异常类和异常对象都被抛出,他们都具备可抛出性,这个可抛性是Throwable这个体系独有的特点,
只有这个体系中的类和对象才可以被throw和throws操作。
throws使用在函数上,throw使用在函数内,throws后面跟的异常类,可以用多个逗号隔开,
throw后面跟的是异常对象。
在异常的子类中,有一个RuntimeException类及其子类,未检查异常类,就是该类在编译过程中不检查,编译可以通过,
如果在方法内抛出该异常,方法上可以不声明,如果在方法上声明了该异常,调用者可以不处理,因为该异常如果发生,
程序会停止,无法继续执行,希望对程序代码进行修正。
当在自定义问题的时候,如果发生的问题自己可以处理,继承Exception;如果问题自己不能处理,则继承RuntimeException
异常处理中,当我们捕获到异常,但本功能处理不了时,可以在catch中继续抛出:
try{ throw new AException();}catch (AException e){ throw e;}
异常处理中,如有一个方法run()抛出A异常,有一个对象t他只能处理B异常,所以我们在处理run()方法的时候可以捕获A异常然后
抛出B异常(调用者可以处理的异常)。
class A extends Exception{}class B extends Exception{}public class Test2{ public void run() throws B { try { throw new A(); } catch (A e) { //处理A异常 throw new B(); } } public static void main(String[] args) { Test2 t = new Test2(); try { t.run(); } catch (B e) { e.printStackTrace(); } }}
在异常处理中,还有try-finally块的应用,finally块中存放着一定会被执行的代码,常用于关闭资源,如下
在JDBC中,java与数据库的连接conn资源及st,rs等一定要关闭:
try{ //建立连接 conn = DriverManager.getConnection(url,user,password); //创建语句 st = conn.createStatement(); // 执行结果 rs = st.executeQuery("select * from user");}finally { if(rs!=null) rs.close(); if(st!=null) st.close(); if(conn!=null) conn.close();}
在上面程序中,如果rs.close()处抛出了异常,那么连接conn就没有关闭,程序应改为:
finally { try { if (rs != null) rs.close(); } finally { try { if (st != null) st.close(); } finally { if (conn != null) conn.close(); } } }
finally块只有一种情况不会执行,当程序执行到System.exit(0); finally不会执行
异常在子父类覆盖中的体现:
1,子类在覆盖父类时,如果父类方法抛出异常,则子类的覆盖方法只能抛出父类的异常或者是该异常的子类;
2,如果父类方法抛出多个异常,那么子类在覆盖方法时,只能抛出父类异常的子集;
3,如果父类或者接口的方法中没有抛出异常,则子类的覆盖方法也不可以抛出异常,如果子类方法发生了异常,则必须进行try处理,绝对不能抛。
异常处理补充:当调用到抛出异常的功能时,抛出几个,就处理几个,一个try对应多个catch,
如果多个catch块中的异常出现继承关系,父类的异常catch要放到最下面。
catch内,需要定义针对性的处理方式,不要简单的定义printStackTrace,输出语句等。
--------------------------ASP.Net+Unity开发、 .Net培训、期待与您交流!-----------------------
详情请查看:http://edu.csdn.net
- 黑马程序员_Java异常_Exception
- 黑马程序员_Java异常
- 黑马程序员_Java异常
- 黑马程序员_JAVA异常
- 黑马程序员_java异常
- 黑马程序员_Java异常
- 黑马程序员_JAVA:异常
- 黑马程序员_java异常
- 黑马程序员_java基础_java异常笔记
- 黑马程序员_Java异常总结
- 黑马程序员_java异常总结
- 黑马程序员_java中的异常
- 黑马程序员_java异常处理
- 黑马程序员_java异常概述
- 黑马程序员_java异常机制
- 黑马程序员_java异常体系
- 黑马程序员_java异常体系
- 黑马程序员_java中的异常
- 为什么我加载文件和教程不同
- 函数名都可以被反编译出来吗?
- 编程之美之二进制数中1的个数
- 23个GOF23设计模式的定义
- c语言数组指针的问题
- 黑马程序员_Java异常_Exception
- 黑马程序员_Java面向对象4
- SDL游戏之路(二十一)--声音
- 团队需要哪些培训
- 动态规划3:最大子段和问题到最大子矩阵问题(三):初探最大子矩阵之和问题
- Nginx CORS实现JS跨域
- 黑马程序员_Java_泛型(Generic)
- 11g的exp导出空表提示EXP-00011: SCOTT.TEST1 不存在
- UVA 10917 Walk Through the Forest SPFA