异常


------- android培训java培训、期待与您交流! ----------

在JAVA编写中,会出现各种失误导致的运行时产生的不正常情况,这种情况被称作异常。

Throwable

---Error(错误——严重)

---Exception(异常——非严重)


异常处理:

try

{

需要被检测的代码;

//try中问题代码被try检测到后,后面的代码便不会继续执行。

}

catch(异常类 变量)

{

处理方式;

//接收try抛给的问题代码

//问题代码被处理后,虚拟机会继续执行后面的语句。

对捕获到的异常对象进行常见方法操作:

1.String getMessage();(获取异常信息——异常名称)

2.toString();(对异常情况的简短描述——异常名称、异常信息)

3.printStacktrace();(追踪至异常出现的位置——异常名称、异常信息、异常位置) PS:该语句没有返回值,不可放进打印语句中;同时该语句也是JVM的默认异常处理机制。

}

finally

{

一定会执行的语句;(例:当进行数据库操作检测异常时,若数据操作出现异常,则需用finally做最后数据库的关闭工作。)

通常是关闭资源代码,因为资源必须要被释放。

(即使在之前return返回都不能阻止finally的执行,只有System.exit(0);语句才能阻止)

(System.exit是结束虚拟机。)


}


(在此,有三种格式:try-catch;try-catch-finally;try-finally。)


然而并不是所有的语句都需要用try处理,为了预防,可以通过throws 语句——在功能上通过throws的关键字声明了该功能有可能会出现问题。

发现异常后,需要对异常进行捕捉或再次抛出,否则程序无法顺利运行。

而声明异常时,不建议直接声明Exception,而是更加具体一些,这样处理的时候也会更加具体。

另:1.子类在覆盖父类时,如果父类的方法抛出异常,则子类的覆盖方法要么不抛出异常,要么只能抛出父类的异常或父类异常的子类异常;若子类真的发生父类异常之外的异       常,则只能在内部处理,不可以抛出。

    2.若父类或接口没有异常抛出,则子类的异常只能用try进行内部处理,绝对不能抛出。

并且,可以在throws语句后面添加多个方法来处理多个异常。而用Exception均能处理是由于类的多态性,致使Exception能处理其所有子类的异常,但是这样会没有针对性,不建议直接声明。

建议有几个异常声明,就对应几个相对应的catch块进行处理,不要定义多余的catch块。如果catch块中出现了继承关系,父类异常的catch块向下放。

定义catch块时,一定要定义具体的处理方式,不要随意定义printStacktrace()或者输出语句。

自定义异常:因为项目中会出现一些特有问题,这些问题并未并未被java描述并封装对象。因此可以按照java对问题封装的思想,将特有的问题,进行自定义异常的封装。

例: class MyException extends Exception{}

自定义的异常一定是Exception的子类。且自定义异常需要在可能出现自定义异常的语句后加上throw关键字手动抛出异常对象。

注意:throw后面的语句是无法执行到的。

throw是指定语句抛出异常,throws是对方法可能抛出异常的一个声明。


特殊的异常子类:RuntimeException。

它和它的子类如果在函数内被手动抛出,函数上不需要任何(throws)声明。

且如果函数声明了该异常,调用者可以不用处理,编译一样通过。

同理,当自定义异常时,如果该异常的发生,无法再继续运算,就让自定义异常继承RuntimeException。



最后总结:

异常:

是对问题的描述。将问题进行对象的封装。

异常体系:

Throwable

|--Error

|--Exception

|--RuntimeException

异常体系的特点:异常体系中所有的类以及建立的异常都具有可抛性。

也就是说可以被throw和throws关键字所操作。

只有异常体系具备这个特点。

throw和throws的用法:

throw定义在函数内,用于抛出异常对象。

throws定义在函数上,用于抛出异常类,可以抛出多个用逗号隔开。


当函数内容有throw抛出的异常对象,并未进行try处理。必须要在函数上声明,否则编译失败。(RuntimeException除外)


如果函数声明了异常,调用者需要进行处理。

处理方式:throws 或者try。


异常有两种:

编译时异常,如果没有处理,编译失败。该异常被标识,代表可以处理。

运行时异常(编译时不检测)在编译时,不需要处理,编译器不检查。该异常发生,建议不处理,让程序停止,对代码进行修正。


异常处理语句:

try

{

被检测的代码

}

catch()

{

处理异常代码的语句

}

finally

{

一定会被执行的代码


}


自定义异常:按照java的面向对象思想,将程序出现的特有问题进行封装。

定义类继承Exception或者RuntimeException

1,为了让该异常具备可抛性。

2,让该类具备操作异常的共性方法。

要定义自定义异常信息时,可以使用父类已经定义好的功能。

异常信息传递给父类的构造函数。



异常的好处:

1.将问题进行封装。

2.将正常流程代码和处理问题代码分离,方便阅读。


异常的处理原则:

1.处理方式:try或者throws。

2.调用到抛出的异常时,抛出几个,处理几个。

3.多个catch时,父类catch要放在子类catch下面。

4.catch内,要有针对性的处理方式,不要简单处理。(例:用printStackTrace语句)

5.若捕获到的异常,catch功能中也处理不了的时候,可以继续抛出。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值