JAVA编程中异常问题处理方式的区别和分析

柒妖妖Amy

柒妖妖Amy

2016-02-19 20:59

今天天气好晴朗处处好风光,好天气好开始,图老师又来和大家分享啦。下面给大家推荐JAVA编程中异常问题处理方式的区别和分析,希望大家看完后也有个好心情,快快行动吧!

一、内层方法抛出异常,外层方法捕捉并处理异常:

public void methodA (){

try{

// 调用methodB

methodB();

}

catch(ExceptionType et){

// 相应处理措施

}

}

public void methodB throws ExceptionType{

if (condition is true)

{

// 相应处理措施

}

else

{

throw new ExceptionType(argument);

}

}

在这个例子中,方法B的头部中声明了该方法会抛出一个类型为ExceptionType的异常,在方法体中使用throw子句抛出了一个异常,那么该异常被谁捕捉到呢,答案是方法A。因为异常抛出后,JVM会顺着该方法的调用栈一层一层的往上找。因为方法A中有一个catch(ExceptionType et),所以被抛出的异常会被捕捉到并处理。

二、方法中自己捕捉,处理异常:

public methodA() {

try

{

// 可能产生异常的语句

}

catch (ExceptionType et)

{

// 相应的处理

}

}

在这个例子中,方法A使用了try-catch语句块,那么意味着在方法中所产生的ExceptionType类型的异常都会被捕捉到并在方法内处理。

三、内层方法抛出一个异常,但本身又有try-catch

public methodB() throws ExceptionType{

try

{

// 可能产生异常的语句

}

catch (AnotherExceptionType aet)

{

// 相应处理措施

}

}

在这个例子中有两种异常处理情况,抛出异常和捕捉异常,如果在try语句块中产生ExceptionType类型的异常的话,会被抛出。如果产生AnotherExceptionType类型的话,则不会被抛出,因为在方法B的头部中并没有声明会抛出该异常。

四、内层方法抛出一个异常,但本身有try-finally

public methodB() throws ExceptionType{

try

{

// 可能产生异常的语句

}

finally

{

// 一定要执行的语句

}

}

这个例子与上一个例子很像,不同的是没有catch,但增加了finally。它的意思如果方法B中try语句块中如果产生了异常,则抛出由外层方法处理。然后方法B继续执行finally中的语句

下面列举三种错误的异常处理方法:

一、内层方法抛出一个异常,但本身有捕捉这个异常

public methodB() throws ExceptionType{

try

{

// 可能产生异常的语句

}

catch (ExceptionType et)

{

// 相应处理措施

}

}

在这个例子中,方法B在头部声明了会抛出一个类型为ExceptionType的异常,但在紧接下来的方法体又用了catch(ExceptionType et),如果产生了异常的话,会有什么结果呢?方法B抛出的异常马上被自身的catch捕捉到,所以方法头部的throws实际是没有作用的。外层方法是接收不到方法B抛出的异常对象的。

二、在try中使用了return,在fianlly中又使用了return

public methodB() {

try

{

// 可能产生异常的语句

return SOMEVALUE;

}

catch ()

{

}

finally

{

return SOMEVALUE_2;

}

}

在这个例证中,我们可以看到在try中返回了SOMEVALUE,那么程序执行到这里是否就结束了呢,其实不是的,因为finally中的语句是肯定会被执行到的,所以最后返回的是SOMEVALUE_2;那么意味者即使程序没有抛出异常,最后也得不到正确的结果。

三、把catch(Exception e)放在所有catch块的最前面

public methodB(){

try

{

}

catch (Exception e)

{

...

}

catch (SubException se)

{

...

}

}

在这个例子中,catch(Exception e)被放在所有catch语句块的最前面,因为Exception所有Exception类型的父类,所以意味着所有在try中产生的异常都会被捕捉到。后面其他的catch都是没有用的,所以一定要把catch(Exception e)放在最后面,如果前面所有的异常类型都不符合,至少保证还有一个可以处理它。

总结:

A.如果能够找到一个有意义的方法来捕获异常,就立即引入这个方法

B.否则就应该考虑做某些处理后传递或者再次抛出异常,也可以把异常转换为另一种形式,然后抛出一个新的异常

C.另一个方法是,可以完全忽略这个异常,而把它加到方法的头部的throws语句中,由调用这个方法的方法来处理它

D.通过捕获一个公共的异常超类,可以在一个块里面捕获多个异常,但不能够用一个空的catch语句 块来完全制止一个异常。

(本文来源于图老师网站,更多请访问https://m.tulaoshi.com/bianchengyuyan/)
展开更多 50%)
分享

猜你喜欢

JAVA编程中异常问题处理方式的区别和分析

编程语言 网络编程
JAVA编程中异常问题处理方式的区别和分析

J2SE综合:JAVA异常处理方式的区别和分析

编程语言 网络编程
J2SE综合:JAVA异常处理方式的区别和分析

s8lol主宰符文怎么配

英雄联盟 网络游戏
s8lol主宰符文怎么配

Java编程中异常处理的优劣之道

编程语言 网络编程
Java编程中异常处理的优劣之道

深入理解Java编程中异常处理的优劣

编程语言 网络编程
深入理解Java编程中异常处理的优劣

lol偷钱流符文搭配推荐

英雄联盟 网络游戏
lol偷钱流符文搭配推荐

java中instanceof和getClass()的区别分析

编程语言 网络编程
java中instanceof和getClass()的区别分析

java中Hashtable和HashMap的区别分析

编程语言 网络编程
java中Hashtable和HashMap的区别分析

lolAD刺客新符文搭配推荐

英雄联盟
lolAD刺客新符文搭配推荐

正则表达式中的组集合的使用

正则表达式中的组集合的使用

应用:Tomcat5配置Mysql JDBC数据库连接池

应用:Tomcat5配置Mysql JDBC数据库连接池
下拉加载更多内容 ↓