这一章节我们来讨论一下为什么需要异常?
原因:逻辑代码与异常代码分离。
注意:异常机制是强制性的。
例子:
下面的代码使用了异常机制。
package com.ray.ch10; import java.io.File; import java.io.FileInputStream; import java.io.FileNotFoundException; public class Test { public static void main(String[] args) { File file = new File(""); try { FileInputStream fis = new FileInputStream(file); //dosomething } catch (FileNotFoundException e) { // TODO 处理异常 e.printStackTrace(); } } }
如果没有异常机制,我们的代码可能就会类似下面:
package com.ray.ch10; import java.io.File; import java.io.FileInputStream; import java.io.FileNotFoundException; public class Test { public static void main(String[] args) throws FileNotFoundException { File file = new File(""); if (file != null) { FileInputStream fis = new FileInputStream(file);//逻辑代码部分 } } }
我们的代码将在逻辑代码里面添加许多判断代码,从而造成代码的可读性降低。
但是引入异常机制,我们将逻辑代码与异常代码分开。
但是我们还需要区分一般错误与异常。
一般错误:我们可以在足够的信息支持下处理它。
异常情况:一般是我们估计不到的错误情况,而且没有足够的信息来处理。
我们来看下面的例子,下面的代码模拟输入输出:
package com.ray.ch10; import java.util.HashMap; public class Test { public static void main(String[] args) { HashMap<String, Object> map = new HashMap<String, Object>();// 假设一个map当成是输入内容 map.put("param1", 0); map.put("param2", "O"); // 上面的0和大O在输入上面没什么太大的区别 for (String key : map.keySet()) { if (map.get(key) != null) {//可以预计的一般错误 System.out.println(Integer.parseInt(map.get(key).toString())); } } } }
输出:
0
Exception in thread "main" java.lang.NumberFormatException: For input string: "O"
at java.lang.NumberFormatException.forInputString(NumberFormatException.java:48)
at java.lang.Integer.parseInt(Integer.java:449)
at java.lang.Integer.parseInt(Integer.java:499)
at com.ray.ch10.Test.main(Test.java:13)
从上面的结果看出,对于是否为空这种一般性的错误,有足够的信息来处理它,但是对于输入的内容,太难控制,因此这里我们将引入异常机制。
package com.ray.ch10; import java.util.HashMap; public class Test { public static void main(String[] args) { HashMap<String, Object> map = new HashMap<String, Object>();// 假设一个map当成是输入内容 map.put("param1", 0); map.put("param2", "O"); // 上面的0和大O在输入上面没什么太大的区别 for (String key : map.keySet()) { if (map.get(key) != null) {//可以预计的一般错误 try { System.out.println(Integer .parseInt(map.get(key).toString())); } catch (NumberFormatException e) { System.out.println("请只输入数字"); } } } } }
输出:
0
请只输入数字
我们引入了异常机制,逻辑代码没有什么变化,但是多出来的处理异常的代码,将在异常出现后,进行修复性操作或者提示性操作。
注意:由于异常机制的引入,我们把逻辑代码当成一个事务来看待,而且我们通常把异常处理当成事务的最后底线,异常处理代码大多是事务修复性操作。
总结:这一章节主要讲述了为什么需要异常,以及辨别一般错误和异常情况。
这一章节就到这里,谢谢。
-----------------------------------
目录