java中抛出异常后代码继续执行的问题
昨天在工作中遇到一个问题:我需要调公司另外一个模块来获得数据,这个模块返回的是n*n矩阵式的数据,但由于我只需要这个矩阵中的某些数据,所以我在调用代码方法中把需要的数据整理成map并添加到list,然后返回给应用处理方法。在应用处理的代码中,我只对返回的list进行null和size!=0判断,并抛出可能的异常,但我并没有考虑到这个矩阵里面有的格子数据本身是null的情况,也就是说单个map的空指针异常导致了我的应用处理方法里面也会抛出异常,相当于处理模块没法用了,这就导致了刷出来的数据减少了90%。
那么有没有什么办法能够避免这种情况呢?当然是在调用代码方法中提前主动抛出异常,所以要对异常抛出和代码执行是否受影响进行讨论,确保单个格子没数据不会影响到整个执行结果。
下面将分情况讨论遇到异常的情况:
例1、业务处理代码紧跟着可能遇到异常的代码
public Class Test {public static void main (String[] args) throws Exception {try {for (itn i = 0; i < 2; i++) {i/=0; //可能抛出异常的代码System.out.println(i); //业务处理代码}} catch (Exception e) {e.printStackTrace();}}
}执行结果:
java.lang.ArithmeticException: / by zero at Test.main(Test.java:5)
java.lang.ArithmeticException: / by zero at Test.main(Test.java:5)
例2、单独catch可能遇到异常的代码,与业务处理代码进行分离
public Class Test {public static void main (String[] args) throws Exception {try {for (itn i = 0; i < 2; i++) {i/=0; //可能抛出异常的代码}} catch (Exception e) {e.printStackTrace();}System.out.println(i); //业务处理代码}
}执行结果:
java.lang.ArithmeticException: / by zero at Test.main(Test.java:5)
java.lang.ArithmeticException: / by zero at Test.main(Test.java:5)
0
1
可以看见,对可能遇到异常的代码块进行主动try/catch可以防止业务处理代码受到影响。
当然还有主动抛出异常的情况,在这里也一并讨论整理。
先看四个例子:
例3、
public Class Test {public static void main (String[] args) throws Exception {throw new Exception("抛出异常");for (int i = 0; i < 2; i++) {System.out.println(i);}}
}执行结果:
编译错误,for语句不可达Unreachable
例4、
public Class Test {public static void main (String[] args) throws Exception {if (true) {throw new Exception("抛出异常");}for (int i = 0; i < 2; i++) {System.out.println(i);}}
}执行结果:
Exception in thread "main" java.lang.Exception: 抛出异常 at Test.main(Test.java:5)
编译通过,但是for语句不能执行
例5、
public Class Test {public static void main (String[] args) throws Exception {try {throw new Exception("抛出异常");} catch (Exception e) {e.printStackTrace();}for (int i = 0; i < 2; i++) {System.out.println(i);}}
}执行结果:
java.lang.Exception: 抛出异常 at Test.main(Test.java:5)
0
1
编译通过,for语句成功运行
例6:
public Class Test {public static void main (String[] args) throws Exception {try {throw new Exception("抛出异常");} catch (Exception e) {throw new Exception("catch 异常");e.printStackTrace();}for (int i = 0; i < 2; i++) {System.out.println(i);}}
}执行结果:
编译不通过,for语句不可达unreachable
总结:
1、如果某段代码前面有主动异常抛出,并且这个异常没有被捕获,就会编译失败。例3
2、如果某段代码有主动异常抛出且被try/catch捕获,并且catch中没有新的异常,那么这段代码能够执行,否则也是编译不通过。当然,也可以在catch中无限套娃捕获异常,这样也是能够执行的。。。例5和例6
3、如果某个条件语句中有主动异常抛出,程序能被编译,但是后面的代码将不会运行。例4
4、对于可能发生异常的代码块,一定要用try/catch捕获,不然会影响后面的业务代码。
java中抛出异常后代码继续执行的问题相关推荐
- java 抛出异常后,还会执行后面代码吗?
java 抛出异常后,还会执行后面代码吗? 比如: 方法:{ try{ //可能出错语句块 }catch{ //错误 } return .. } 如果执行了catch语句块, 那么这个return还会 ...
- java 静态块初始化_简单了解java中静态初始化块的执行顺序
这篇文章主要介绍了简单了解java中静态初始化块的执行顺序,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 在java中,其应该是先于所有的方法执行. ...
- Java中调用C++代码
Java中调用C++代码 1.Idea创建一个Solution类 public class Solution {public native void sayHello();static{System. ...
- java nextint后有空格,Java中nextInt()后接nextLine()读取不到数据
Java中nextInt()后接nextLine()读取不到数据 Java中nextInt()后接nextLine()读取不到数据 问题: 在使用Scanner对象的nextLine()函数读取输入的 ...
- Java 中 finally 与 return 的执行顺序详解
java方法是在栈幀中执行,栈幀是线程私有栈的单位,执行方法的线程会为每一个方法分配一小块栈空间来作为该方法执行时的内存空间,栈幀分为三个区域: 1 . 操作数栈,用来保存正在执行的表达式中的操作数, ...
- java中抛出异常快捷键_idea中处理异常的快捷键
建议68:从System.Exception或其他常见的基本异常中派生异常 微软建议:从System.Exception或其他常见基本异常之一派生异常.在Visual Studio中输入Excepti ...
- java中的异常处理代码,java_深入剖析Java中的各种异常处理方式,1. 调试追踪代码:public s - phpStudy...
深入剖析Java中的各种异常处理方式 1. 调试追踪代码: public static void enterTryMethod() { System.out.println("enter a ...
- java中子类继承父类程序执行顺序问题
为什么80%的码农都做不了架构师?>>> Java中,new一个类的对象,类里面的静态代码块.非静态代码.无参构造方法.有参构造方法.类的一般方法等部分,它们的执行顺序相对来说 ...
- Java中常见的代码冲突
在工作中,最近我对现有Java项目进行了代码清理. 完成该练习后,我可以看到在代码中一次又一次地发生了一组常见的代码冲突. 因此,我想出了此类常见违规的清单,并与同行分享,以使人们有意识地提高代码质量 ...
最新文章
- IndexError: list index out of range的解决办法
- js判断浏览器的类型。。。
- 用 RTC 打造一个音乐教育 App,需要解决哪些音质难题?
- 开源最大的谎言是什么?
- html 使用符号设置固定链接,关于dw-question-answer的调试和固定链接id.html设置
- JavaScript正则表达式(1)
- java删除相对路径文件夹_Java IO,io,文件操作,删除文件,删除文件夹,获取文件父级目录...
- Java简历模板(三十个模板随意选)
- 51单片机LCD12864程序移植到STM32F103C
- 前端实现图片或视频预览的3种方法
- webbrowser控件使用,冬日日记每一天
- 分布式图数据库-JanusGraph简介
- B站头部UP主抱团垄断优质资源,腰部UP主的流量突破口在哪?
- 服务器e5系列和e5v4系列,至强E5-2600v4系列CPU一览表
- Spring资源抽象Resource
- Linux运维部落 DNS服务,Linux运维部落
- 矩阵知识:正交矩阵、行列式、子式与代数余子式
- Android应用分身的实现和解析
- Artemis架构解析
- cc 和 bcc 的区别 邮件