java异常处理常见问题,JAVA处理异常
00-1010 1.异常的概念和架构1.1异常的概念和架构1.2异常的架构和分类2.1防御性编程2.2异常抛出2.3异常捕获(1)异常声明抛出(2)try-catch捕获和处理(3)finally2.4异常处理过程3 .自定义异常类
目录
1、异常的概念和体系结构
在Java中,程序执行过程中的异常行为称为异常。举个例子,我之前遇到过的:
(1)算术异常
system . out . prinntln(10/0);(2)数组越界异常
int[] arr={1,2,3 };system . out . println(arr[5]);(3)空指针异常。
int[]arr=null;system . out . println(arr . length());
1.1异常的概念
Throwable:是异常系统的顶级,衍生出两个重要的子类:while Error和ExceptionError:指Java虚拟机无法解决的严重问题。异常:就是我们通常所说的异常。程序员可以通过传递代码来处理程序,从而继续执行程序。[异常分类]
Runtime Exception(checked Exception):运行时异常下的所有异常都是运行时异常。编译时异常(非检查异常):IOException、ClassNotFoundException、CloneNotSupportedException是编译时异常。[注意]编译期间的语法错误不能称为异常。运行时指的是程序已经编译得到类文件,然后被JVM执行时出现的错误。
00-1010在Java中,异常处理主要有五个关键词:throw、try、catch、final、throws。
LBYL:三思而后行,操作前做充分的检查(预防型)
布尔ret=falseRet=登录游戏();如果(!Ret){处理登录游戏错误;返回;}ret=开始匹配();如果(!Ret){处理匹配错误;返回;}………………
缺陷:正常流程和错误处理代码混在一起,整个代码显得混乱。
(2) EAFP:请求原谅比允许容易,先操作,再解决问题。(事后道歉)
试试{登录游戏();开始匹配();}catch(登录游戏异常){处理登录游戏异常;}catch(开始匹配异常){处理匹配异常;}
00-1010在Java中,可以借助throw关键字抛出自定义异常,通知调用者错误消息。语法如下:
抛出new XXXException(异常的原因);
【示例】实现一个方法来获取数组中任意下标位置的元素。
public static int getElement(int[]array,int index){ if(null==array){ throw new nullpointerexception(传递的数组为null );} if(index 0 index=array . length){ throw new arrayindexoutofboundsexception(传递的数组下标越界);}返回数组[index];}[注意]
Throw必须写在方法内部。抛出的对象必须是Exception或Exception的子类。如果抛出的异常是编译时异常,用户必须处理它,否则无法编译。如果抛出的异常是RuntimeException或者它的子类,可以直接交给JVM来处理异常。一旦抛出,下面的代码就不会再被执行。
处理00-1010异常主要有两种方式:不同。
常声明throws和try-catch捕获处理
printStackTrace()打印异常
(1)异常声明throws
当前方法不处理异常,提醒方法的调用者处理异常。
语法格式:
修饰符 返回值类型 方法名(参数列表) throws 异常类型1,异常类型2...{}
【例】加载指定的配置文件
public class Config { File file; /* FileNotFoundException : 编译时异常,表明文件不存在 此处不处理,也没有能力处理,应该将错误信息报告给调用者,让调用者检查文件名字是否给错误了 */ public void OpenConfig(String filename) throws FileNotFoundException { if(filename.equals("config.ini")){ throw new FileNotFoundException("配置文件名字不对"); } // 打开文件 }
【注】
throws必须跟在参数列表的后面。声名的异常必须是Exception或Exception的子类。方法的内部如果抛出多个异常,throws后面必须跟多个异常类型,用逗号隔开。如果抛出的异常之间有父子关系,直接声明父类异常即可。调用声明抛出异常的方法时,调用者必须对异常进行处理,或者继续使用throws。
(2)try-catch捕获并处理
throws并没有对异常真正处理,而是将异常报告给异常方法的调用者。如果真正要对异常进行处理,需要try-catch。
【语法如下】
try{// 将可能出现异常的代码放在这里}catch(要捕获的异常类型 e){// 如果try中的代码抛出异常了,此处catch捕获时异常类型与try中抛出的异常类型一致时,或者是try中抛出异常的父类时,就会被捕获到// 对异常就可以正常处理,处理完成后,跳出try-catch结构,继续执行后序代码}【catch(异常类型 e){// 对异常进行处理}finally{// 此处代码一定会被执行到}】// 后序代码// 当异常被捕获到时,异常就被处理了,这里的后序代码一定会执行// 如果捕获了,由于捕获时类型不对,那就没有捕获到,这里的代码就不会被执行
注意:1. 【】中表示可选项,可以添加,也可以不用添加2. try中的代码可能会抛出异常,也可能不会
【注意】
try块中抛出异常位置后的代码不会被执行如果抛出异常类型与catch类型不匹配,即异常不会被成功捕获,则需要JVM来处理异常------异常是按照类型来捕获的。rey中可能会抛出多个不同的异常对象,必须用多个catch来捕获。如果异常之间有父子类关系,必须子类异常在前catch,父类异常在后catch,否则语法错误。可以通过一个catch来捕获多个异常(不推荐)。由于Exception类是所有异常的子类,因此可以用这个类型来捕捉所有异常。catch进行类型匹配时,不光会匹配相同类型的异常对象,也会捕捉目标异常类型的子类对象。
(3)finally
在写程序时,有些特定的代码,无论程序是否发生异常,都需要执行,比如程序正常打开的资源,有时候必须对资源进行回收。另外,异常会引发程序的跳转,可能导致有些语句执行不到,此时需要finally来解决这个问题。
【语法格式】
try{ // 可能会发生异常的代码}catch(异常类型 e){ // 对捕获到的异常进行处理}finally{ // 此处的语句无论是否发生异常,都会被执行到}// 如果没有抛出异常,或者异常被捕获处理了,这里的代码也会执行
【问题】既然finally和try-catch-finally后的代码都会被执行,那为什么还要有finally呢?
当catch没有捕获到异常时,此时需要JVM来捕获异常,程序可能不能正常运行,finally后面的代码就不会被执行。而finally中的代码一定会被执行。
【注】finally中的代码一定会被执行,一般在其中进行资源清理的扫尾工作。
如下代码:
public static int func(){ try{ return 10; }finally{ return 20; }}//此时返回20;
finally执行的时机是方法返回之前(try或者catch中如果有return会在return之前执行finally)。但是如果finally中也存在return语句,那么就会执行finally中的return,从而不会执行到try中原有的return。
2.4异常的处理流程
关于调用栈:
方法之间存在相互调用的关系,可以用调用栈来描述。在JVM中有一块内存空间称之为:虚拟机栈专门存储方法之间的调用关系。当代码中出现异常的时候,我们就可以使用e.printStackTrace();
的方法查看出现异常代码的调用栈。
如果本方法中没有合适的处理异常的方法,就会沿着调用栈向上传递,如果一直向上传递都没有找到合适的方法,最终会交给JVM来处理,程序就会异常终止。
【程序异常处理的流程】
程序先执行try中的代码如果try中的代码出现异常,就会结束try,在catch中进行异常匹配如果找到匹配的异常类型,就会执行catch中的代码如果没有找到,就会将异常向上传递到上层调用者无论是否找到匹配的异常类型,finally中的代码都会执行(在该方法结束之前执行)如果上层调用者也不能处理异常,就继续向上传递一直到main方法也没有合适的代码处理异常,就会交给JVM来处理,此时程序异常终止。
3、自定义异常类
具体方法:
自定义异常类,然后继承自Exception或者RunTimeException。实现一个带有String类型参数的构造方法。
class UserNameException extends Exception { public UserNameException(String message) { super(message); }}
【注】
自定义异常通常会继承自Exception或者RunTimeException。继承自Exception的异常默认为受查异常。继承自RunTimeException的异常默认为非受查异常。到此这篇关于Java 超详细讲解异常的处理的文章就介绍到这了,更多相关Java 异常内容请搜索盛行IT以前的文章或继续浏览下面的相关文章希望大家以后多多支持盛行IT!
郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。