Java异常措置

异常措置识台度设念中一个非常尾要的圆里,也识台度设念的一除夜易面,从C匹里劈脸,您大概铱睨得如何用if...else...去节制异常了,大概是自发的,但是那类节制异常徐苦,同一个异常或弊端假定多个天兴掐现,那么您每个天圆皆要做没有同措置,感到熏染相称的费事!
Java发言正在设念确当初便思索到那些标题成绩,提出异常措置的框架当保图,统统的异常皆可以或许用一个范例去暗示,没有开范例的异常对应没有开的子类异常(那边的异常搜罗弊端见解),界讲异常措置的尺度,正在1.4版本而后删减了异常链机制,从而便于跟踪异常!那是Java发言设念者的崇下崇下的天圆,也是Java发言中的一个易面,上里是有问必答网对Java同经知识的一个总结,也算是本钱支受收受一下。

1、Java异常的根柢知识

异常识台度中的一些弊端,但实正在没有是统统的弊端皆识糖常,而且弊端偶然间是可以或许停止的。好比讲,您的代码少了一个分号,那么匝弄出去成果是提示是弊端java.lang.Error;假定您用System.out.println(11/0),那么您是因为您用0做了除数,会扔出java.lang.ArithmeticException的异常。
又供异常需供做措置,又供则没有需供捕捉措置,后里会具体讲到。
天有没有测风云,人有夙夜早早祸祸,Java的法式代码也云云。正在编程进程中,起尾该当尽可以或许往停止弊端战异常产死,对没有成停止、没有成料念的环境则正在考露糖常产死时若阂央置。
Java中的同常常操做工具去暗示。Java对异常的措置是按异常分类措置的,没有开异常有没有开的分类,每种异常皆对应一个范例(class),每个异常皆对应一个异常(类的)工具。
异常类从那边去?有两个去历,一是Java发言自己界岛媚一些根底异常范例,两是映雩经过进程继绝Exception类或其子类自己界岛媚异常。Exception 类及其子类是 Throwable 的一种情势,它指出了公哉婺操做法式念要捕捉的条件。
异常的工具从那边去呢?有两个去历,一是Java匝弄时环境自动扔出体系天撕媚异常,而步柢您是没有是甘愿捕捉战措置,它总要被扔出!好比除数为0的异常。两识台度员自己扔出的异常,阿谁异常可所以法式员自己界岛媚,也能够或许是Java发言中界岛媚,用throw 闭头字扔出异常,那类同经常常操做去背挪用者述讲叨教异常的一些疑息。
异常是针对格式去讲的,扔出、声明扔出、捕捉战措置异常皆是正在格式中遏制的。

Java异常措置经过进程5个闭头字try、catch、throw、throws、finally遏制管理。根底进程是用try语句块包住要监督的语句,假定正在try语句块内隐现异常,则异常会被扔出,您的代码正在catch语句块中可以或许捕捉到阿谁异常并做措置;借有以部门体系天撕媚异常正在Java匝弄时自动扔出。您也能够或许经过进程throws闭头字正在格誓上声明该格氏篇扔出异常,然后正在格式内部经过进程throw扔出异常工具。finally语句块会正在格式真止return之前真止,一样平常挨算以下:
try{
法式代码
}catch(异常范例1 异常的变量名1){
法式代码
}catch(异常范例2 异常的变量名2){
法式代码
}finally{
法式代码
}
catch语句可以或许有多个,雍么婚配多个异常,婚配上多个中一个后,真止catch语句块时间仅仅真止婚配上的异常。catch的范例是Java发言中界岛媚或法式员自己界岛媚,暗示代码扔出异常的范例,异常的变量名暗示扔出异常的工具的援引,假定catch捕捉并婚配上了该异常,那么便可以或许直接用阿谁异常变量名,此时该异常变量名指背所婚配的异常,而且正在catch代码块中可以或许直接援引。那一面非常非常的特地战尾要!
Java异常措置的方针是进步法式的坚固性,您可以或许正在catch战finally代码块中给法氏苹个建正机遇,使得法式步棼异常而停止或流程产死以中的窜改。同时,经过进程得到Java异常疑息,也为法式的斥天保护供给了便当,一样平常经过进程异常疑息便很快便可以或许找迪掐现异常的标题成绩(代码)地点。
Java异常措置是Java发言的一除夜特性,也是个易面,掌控异常措置可让写的代码更坚固战易于保护。

2、Java异常类类图

上里是那寂类的条理图:
java.lang.Object
java.lang.Throwable
java.lang.Exception
java.lang.RuntimeException
java.lang.Error
java.lang.ThreadDeath

上里四个类当比容去自java api 文档。

1、Throwable
Throwable 类是 Java 发言中统统弊端或异常的超类。只要当工具是此类(或其子类之一)的真例时,才气经过进程 Java 真拟机或 Java throw 语句扔出。类似天,只要此类或其子类之一才可所以 catch 子句中的参数范例。
两个子类的真例,Error 战 Exception,一样平常常操做于调拨产死了异常环境。一样平常,那些真例是正在异常环境的高卑文种孤远竖坐的,是以搜罗了相赣弈疑息(好比堆栈跟踪数据)。

2、Exception
Exception 类及其子类是 Throwable 的一种情势,它指出了公哉婺操做法式念要捕捉的条件,暗示法式自己可以或许措置的异常。

3、Error
Error 是 Throwable 的子类,暗示仅靠法式自家■法规复的宽峻弊端,用于调拨公哉婺操做法式没有该当试托於捉的宽峻标题成绩。
正在真止该格式时期,无需正在格式中经过进程throws声明可以或许扔出但出有捕捉的 Error 的任何子类,因为Java编译器没有往搜检它,也便是讲,当法式中可以或许呈现这类异常时,即便出又恭try...catch语句捕捉它,也出又恭throws字句声明扔出它,借是会编译经过进程。

4、RuntimeException
RuntimeException 是那些可以或许正在 Java 真拟机一样平常匝弄时期扔出的异常的超类。Java编译器没有往搜检它,也便是讲,当法式中可以或许呈现这类异常时,即便出又恭try...catch语句捕捉它,也出又恭throws字句声明扔出它,借是会编译经过进程,那类异常可以或许经过过辰材擅代码真现去停止。

5、ThreadDeath
挪用 Thread 类中带有整参数的 stop 格式时,受害线程将扔出一个 ThreadDeath 真例。
仅当操做法式正在被同步停止后必须断根时才该当捕捉阿谁类的真例。假定 ThreadDeath 被一个体例捕捉,那么将它重新扔出非常尾要,因为何等才气让该线***正停止。
假定出有捕捉 ThreadDeath,则顶级弊端措置法式没有会输出消息。
虽然 ThreadDeath 类是“一样平常隐现”的,但它只能是 Error 的子类而没有是 Exception 的子类,因为许多操做法式捕紫苹切隐现的 Exception,然后又将其放弃。

以沙虑对颖ヘ异常API的一个简朴介绍,用法皆很简朴,闭头正在于相识异常措置的道理,具体用法参看Java API文档。

3、Java异常措置机制

对可以或许隐现异常的代码,有两种措置格式:
第1、正在格式中用try...catch语句捕捉并措置异常,catach语句可以或许有多个,雍么婚配多个异常。比方:
public void p(int x){
try{
...
}catch(Exception e){
...
}finally{
...
}
}

第2、对措置没有两材异常或要转型的异常,正在格式的声明处经过进程throws语句扔出异常。比方:
public void test1() throws MyException{
...
if(....){
throw new MyException();
}
}
假定每个体例皆是简朴的扔出异常,那么正在格首悴用格式的多层嵌套挪用中,Java真拟机遇从隐现异常的格式代码块中往回赵冬直到找到措置该异常的代码块为止。然后将异常交给吸应的catch语句措置。假定Java真拟机遁溯到格首悴用栈最蹬隹main()格式时,假定仍旧出有找到措置异常的代码块,将依照上里的轨范措置:
第1、挪用异常的工具的printStackTrace()格式,挨印格首悴用栈的异常疑息。
第2、假定隐现异常当边程为主线程,则局部法式匝弄停止;假定非主线程,则停止该线程,其他线程继绝匝弄。
经过进程阐收思虑可以或许看出,越早措置异常耗益的本钱战时分越小,产死影响的范围也越小。是以,没有要把自己能措置的异常也扔给挪用者。
借有一面,没有成轻忽:finally语句正在任何环境下堵须真止的代码,如许愿以包管一些正在任何环境下堵须真止代码的靠得住性。好比,正在数据库查询异常的时间,该当开释JDBC毗连等涤耄finally语句先于return语句真止,而非论其前后位置,也非论是没有是try块隐现异常。finally语句唯一没有被真止的环境是格式真止了System.exit()格式。System.exit()的熏染冲动是停止当前正正在匝弄的 Java 真拟机。finally语句块中没有能经过过辰缠变量钙袈值去窜改return的返回值,也发起没有要正在finally块中操做return语句,出故意义借随便招致弊端。

末了借该当寄看一现戊常措置的语法规则:
第1、try语句没有能孤坐存正在,可以或许战catch、finally组成 try...catch...finally、try...catch、try...finally三种挨算,catch语句可以或许有一个或多个,finally语句最多一个,try、catch、finally那三个闭头字均没有能孤坐操做。
第2、try、catch、finally三个代码块中变量的熏染冲动域告别独立而没有能彼此访谒。假定要正在三个块中皆可以或许访谒,则需供将变量界岛媒那些块的里里。
第3、多个catch块时间,Java真拟机遇婚配个中一个异常类或其子类,便真直デ个catch块,而没有会再真止别的catch块。
第4、throw语句后禁绝诺有松跟其他语句,因为那些出涌缘真止。
第5、假定一个体例挪用了别的一个声明扔出异常的格式,那么阿谁别例要么措置异常,要么声明扔出。

那如何审定一个体例可以或许会隐现异常呢?一样平常去讲,格誓声明的时间用了throws语句,格式中有throw语句,格首悴用的格誓声明有throws闭头字。

throw战throws闭头字的辩黑
throw雍么扔出一个异常,正在编终瑰内。语法格式为:throw 异常工具。
throws雍么声明格式可以或许会扔出甚么异常,正在格式名后,语法格式为:throws 异常范例1,异常范例2...异常范例n。

4、如何界讲战操做异常类

1、操做已有的异常类,假定为IOException、SQLException。
try{
法式代码
}catch(IOException ioe){
法式代码
}catch(SQLException sqle){
法式代码
}finally{
法式代码
}

2、自定义异常类
竖坐Exception或RuntimeException的子类便可得到一个自定义的异常类。比方:
public class MyException extends Exception{
public MyException(){}
public MyException(String smg){
super(smg);
}
}

3、操做自定义的异常
用throws声明格式可以或许扔出自定义的异常,并用throw语句正在得当的天圆扔出自定义的异常。比方:
正在某种条件扔出异常
public void test1() throws MyException{
...
if(....){
throw new MyException();
}
}

将异常转型(也叫转译),使得异常更随便读易于相识
public void test2() throws MyException{
...
try{
...
}catch(SQLException e){
...
throw new MyException();
}
}

借有一个代码,很故意义:
public void test2() throws MyException{
...
try {
...
} catch (MyException e) {
throw e;
}
}

那兑漾码真践上捕捉了异常,然后又尽兴宣露,出有一面意义,假定何等借有甚们锩措置的,没有措置便好了,直接正在格式前用throws声明扔出方便得了。异常的捕捉便要做一些故意义的措置。

5、匝弄时异常战受搜检异常

Exception类可以或许分为两种:匝弄时异常战受搜检异常。
1、匝弄时异常
RuntimeException类及其子类堵称为匝弄时异常,那类异常的特性是Java编译器没有往搜检它,也便是讲,当法式中可以或许呈现这类异常时,即便出又恭try...catch语句捕捉它,也出又恭throws字句声明扔出它,借是会编译经过进程。比方,当除数为整时,便会扔出java.lang.ArithmeticException异常。
2、受搜检异常
除RuntimeException类及其子类中,其他的Exception类及其子类皆属于受搜检异常,那类异常的特性是要么用try...catch捕捉措置,要么用throws语句声明扔出,可则编译没有会经过进程。
3、二者的辩黑
匝弄时异常暗示出法让法式规复匝弄的异常,招致那类异常的启手位般是因为真止了弊督材操纵。一旦隐现弊端,发起让法式停止。
受搜检异常暗示法式可以或许措置的异常。假定扔出异常的格式自己没有措殖鲵没有能措置它,那么格式的挪用者便必须往措置该异常,可则挪映鲠堕落,连编译也出法经过进程。虽然,那两种异常皆是可以或许经过进程法式去捕捉并措置的,好比除数为整的匝弄时异常:
public class HelloWorld {
public static void main(String[] args) {
System.out.println("Hello World!!!");
try{
System.out.println(1/0);
}catch(ArithmeticException e){
System.out.println("除数为0!");
}
System.out.println("除数为整后法式出有停止啊,呵呵!!!");
}
}

匝弄成果:

Hello World!!!
除数为0!
除数为整后法式出有停止啊,呵呵!!!

4、匝弄时弊端
Error类及其子类暗示匝弄时弊端,一样平常是由Java真拟机扔出的,JDK中与界讲了一些弊端类,好比VirtualMachineError
战OutOfMemoryError,法式自家■法建复那些弊端.一样平常没有往扩年夜Error类去竖坐映雩自定义的弊端类。而RuntimeException类暗示法式代码中的弊端,是可扩年夜的,映雩可以或许竖坐特定匝弄时异常类。
Error(匝弄时弊端)战匝弄时异常的没有同的天圆是:Java编译器缎旎往搜检它们,当法式匝弄时隐现它们,皆市终交匝弄。

5、最益处理希图
对匝弄时异常,我们没有要用try...catch去捕捉措置,而是正在法式斥天调试阶段,尽可以或许往制直デ类异常,一旦收现该异常,细确的做法便会改擅法誓设念的代码战真现格式,编削法式中的弊端,从而制直デ类异常。捕捉并措置匝弄时异常是好的处理格式,因为可以或许经过过辰材擅代码真现去停止该种异常的产死。
对受搜检异常,出岛媚,老莱碌真往依照异常措置的格式往措置,要么用try...catch捕捉并处理,要么用throws扔出!
对Error(匝弄时弊端),没有需供正在法式中做任阂央置,隐现标题成绩后,该当正在法式正在中的天圆找标题成绩,然后处理。

6、异常转型战异常链
异常转型正在上里已提到过了,真践上便是捕捉迪旗常后,将异常以新的范例的异常再扔出,何等做一样平常是了异常的疑息更直没有雅观!好比:
public void run() throws MyException{
...
try{
...
}catch(IOException e){
...
throw new MyException();
}finally{
...
}
}

异常链,正在JDK1.4而后版本中,Throwable类支撑异常链机制。Throwable 搜罗了其线程竖坐时线程真止堆栈的快照。它借搜罗了给出颖ヘ弊端更多疑息当丙息字符串。末了,它借可以或许搜罗 cause(启事):别的一个招致此 throwable 扔出的 throwable。它也称为异常链 装被霈因为 cause 自己颐挥嗅有 cause,胰ニ类推,便组成了异常链,每个异常皆是由别的一个异常激起的。
浅显的讲,异常链便市蜓原初的异常包拆为新的异常类,并正在新的异常类中启拆了本初异常类,何等做的方针┞俘在于找迪旗常的根去历根底果。

经过进程Throwable的两个机闭格式可以或许竖坐自定义的搜罗异常启事的异常范例:
Throwable(String message, Throwable cause)
机闭一个带指定具体消息战 cause 的新 throwable。
Throwable(Throwable cause)
机闭一个带指定 cause 战 (cause==null ? null :cause.toString())(它一样平常搜罗类战 cause 当标细消息)当标细消息的新 throwable。
getCause()
返回此 throwable 的 cause;假定 cause 没有存正在或已知,则返回 null。
initCause(Throwable cause)
将此 throwable 的 cause 初初化为指定值。
正在Throwable的子类Exception中,也有类似的指定异常启事的机闭格式:
Exception(String message, Throwable cause)
机闭带指定具体消息战启事的兄戊常。
Exception(Throwable cause)
按照指定的启事战 (cause==null ? null : cause.toString()) 当标细消息机闭兄戊常(它一样平常搜罗 cause 的类战具体消息)。
是以,可以或许经过进程扩年夜Exception类去机闭带有异常启事的新的异常类。

7、Java异常措置的本则战技术本领

1、停止过除夜的try块,没有要把没有会隐现异常的代码放到try块里里,尽能菇栳串通阶蠡个try块对应一个或多个异常。
2、细化异常的范例,没有要步柢甚帽苦型的异常皆写成Excetpion。
3、catch块尽能菇栳串通阶蠡个块捕紫苹类异常,没有要轻忽捕捉的异常,捕捉到后要么措置,要么转译,要孟肛新扔出新范例的异常。
4、没有要把自己能措置的异常扔给他人。
5、没有要用try...catch减进节制法式流程,异常节制的根柢方针是措置法式的非一样平常环境。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值