首页 > 编程 > Java > 正文

猫哥带你去战斗——Java Web开发——Java篇[5]——大王,有异常!

2019-11-11 06:28:20
字体:
来源:转载
供稿:网友

异常处理,是非常非常非常非常重要的!尤其是实际投产的项目中,几乎很难做到完全没有错误(除非你的项目规模较小,或者测试团队很牛X)。

说到这,猫哥讲点题外话。猫哥曾经参与过一个项目,因为项目中用了几个新人,当时猫哥也是新人之一。这个项目投产一段时间之后,发现会丢数据,就是本来应该是有1000笔业务发生吧,实际上可能系统只记录了998笔。第一次有用户提出这个问题,我们就把各自的代码review了一遍,么有发现问题。大家都是新手,能实现就不错了,而且程序员总感觉自己的代码绝对OK,自我感觉良好。后来又丢了几次数据,管项目的老大直觉:有事了!于是连夜召集项目组所有人员,我记得大概10几个人。最后发现某新手未处理数据库的一种异常,结果一大群人加了一晚上修改原始数据,修改完了怕有问题又想了N种方法验证数据正确。当然,能补救回来真的是要谢天谢地了。

所以说,异常处理,真的很重要。现在从一个简单的例子开始介绍之:

import java.util.Scanner;//导入用于获取控制台输入的类Scannerpublic class ExceptionDemo {//异常演示的例子 public static void main(String[] args) { while(true){ //使用无限循环模拟永远在线等待指令的场景 Scanner sc = new Scanner(System.in); System.out.PRintln("大王,我们刑部这次要除掉哪个奸臣:"); String command = sc.nextLine();//模拟获取大王指令 int army=100;//总兵力 int commandInt=Integer.parseInt(command);//理解大王旨意,刑部比较傻,只能理解数字 int result=army/commandInt; System.out.println("大王,搞定,我们除掉【"+commandInt+"】了!");//模拟响应用户指令 } }}

好的,这个程序运行结果:

大王,我们刑部这次要除掉哪个奸臣:1大王,搞定,我们除掉【1】了!大王,我们刑部这次要除掉哪个奸臣:2大王,搞定,我们除掉【2】了!大王,我们刑部这次要除掉哪个奸臣:

可见效果非常良好,大王的指令在刑部可以立即得到执行,但是如果理解不了大王的意思呢(程序中运行到理解大王旨意的地方有错误) 比如这样到输入输出:

大王,这次要除掉哪个奸臣:0Exception in thread "main" java.lang.ArithmeticException: / by zero at ExceptionDemo.main(ExceptionDemo.java:12)

直接嗝屁了,大王下了一个指令0,其实大王的意思是这次不除人,然后刑部想去除掉【0】这个人,然后整个完蛋,大王哭了。

至于嘛!哪怕做不到,你得继续把能做到的完成,然后做不到的给大王汇报下不就完了,直接嗝屁算干嘛的

那怎么办呢,在比较古老的语言里,大家可能会想到这样:

import java.util.Scanner;//导入用于获取控制台输入的类Scannerpublic class ExceptionDemo {//异常演示的例子 public static void main(String[] args) { while(true){ //使用无限循环模拟永远在线等待指令的场景 Scanner sc = new Scanner(System.in); System.out.println("大王,我们刑部这次要除掉哪个奸臣:"); String command = sc.nextLine();//模拟获取大王指令 int army=100;//总兵力 int commandInt=Integer.parseInt(command);//理解大王旨意,军机处比较傻,只能理解数字 if(commandInt==0) { System.out.println("大王,这个我们不行,该怎么办呢,这个家伙是:"+commandInt); continue; } int result=army/commandInt; System.out.println("大王,搞定,我们除掉【"+commandInt+"】了!");//模拟响应用户指令 } }}

输入输出为:

大王,我们刑部这次要除掉哪个奸臣:0大王,这个我们不行,该怎么办呢,这个家伙是:0大王,我们刑部这次要除掉哪个奸臣:

这样的代码,好像挺好的,没问题。其实问题很大,首先就是太低级,你去算个除法也就算了,毕竟是你的任务,你遇到个除数是0,就得请大王帮你拿捏下,你这个也太低级了吧。Java作为一门牛X的高级语言,这样处理问题,着实不妥。如果大王跟你说“张三”咋办?

所以Java设计了try{}catch(){}finally{}的异常捕捉机制。try{}里面放置可能产生错误的代码,catch(){}小括号匹配错误种类,{}处理异常,finally{}是不管有没有错误发生,最后要跟大王汇报下。

OK,所以该问题可以如此处理。

import java.util.Scanner;//导入用于获取控制台输入的类Scannerpublic class ExceptionDemo {//异常演示的例子 public static void main(String[] args) { while(true){ //使用无限循环模拟永远在线等待指令的场景 Scanner sc = new Scanner(System.in); System.out.println("大王,我们刑部这次要除掉哪个奸臣:"); String command = sc.nextLine();//模拟获取大王指令 int army=100;//总兵力 try{//可能有错误的语句放在try里面 int commandInt=Integer.parseInt(command);//理解大王旨意,军机处比较傻,只能理解数字 int result=army/commandInt; System.out.println("大王,搞定,我们除掉【"+commandInt+"】了!");//模拟响应用户指令 }catch(Exception ex){ System.out.println("大王,我们遇到问题了:"+ex.getMessage()); }finally{ System.out.println("大王,之前"+command+"事情都过去了,您看还有需要什么要指示的吗?"); } } }}大王,我们刑部这次要除掉哪个奸臣:0大王,我们遇到问题了:/ by zero大王,之前0事情都过去了,您看还有需要什么要指示的吗?大王,我们刑部这次要除掉哪个奸臣:1大王,搞定,我们除掉【1】了!大王,之前1事情都过去了,您看还有需要什么要指示的吗?大王,我们刑部这次要除掉哪个奸臣:

这样一来,大王肯定对刑部的办事态度满意多了:

所以,Java异常机制的设计,十分符合一个有责任的人的办事方式,永远等待指令,不能执行的,请示决策者帮助,不管做没做完,都要反馈给决策者。OK,当然,好的决策者应该是具体问题具体分析,解决具体的困难,至于如何解决,且听下回分解。


发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表