对Java中的异常的理解
1.What is exception in Java?
Java使用异常描述程序中可能出现的不正常情况。这个不正常可以是java认为的不正常,也可以是你主观上的出乎意料(自定义异常).总而言之,异常用于表示程序中的不正常现象。
2.Why use exception in Java?
① 异常分离程序中正常逻辑代码和非正常情况处理问题的代码.提升代码的可读性
② 引入异常处理机制,大大提升系统的健壮性.
3.Use Exception
when to use?
① 如果方法执行过程中可能会遇到一些非正常的情况,应该抛出异常.(例如:读取不存在的文件。具体怎么抛下面会讲到)
② 异常本质就是用于描述非正常情况,不要使用异常来描述一些正常的或者合理的现象.(即主观上将正常现象做异常处理,例如:用户登录时,如果输入的用户名或者密码错误,可以抛出异常.但如果将用户名或者密码输入错误视为一种正常现象,就不要用异常来处理这种情况.)
CheckedException vs UncheckedException
Concept:CheckedException是编译时异常,也就是代码中必须处理的异常<异常的处理方式请参考其他资料,本文主要讲正确使用异常,并不涉及具体语法>.UncheckedException是运行期异常。(如果您对编译时异常和运行时异常还不甚了解,建议先参考其他资料)
Should CheckedException Or UnCheckedException?
一般原则:如果你觉得应该由客户端程序员(调用你代码的人)来处理非正常情况,抛编译时异常。如果客户端程序员不遵守约定(例如:传参错误)而造成的非正常情况,使用运行时异常.
我的理解:将编译时异常视为一种调用时的善意提醒,由调用者来处理。将运行时异常视为一种不遵守约定的惩罚,只有调用者不遵守规则才给出警告,正常调用的情况下,异常对调用者透明.
Ok,说了这么多,咱们看看Java API中是如何使用异常的?
package com.java.basic; import java.io.BufferedReader; import java.io.File; import java.io.FileNotFoundException; import java.io.FileReader; import java.io.IOException; public class ExceptionDemo { /** * 打印文件的内容 * @param filePath * @throws IOException * ps:FileNotFoundException是IOExcpetion的子类,此处只是做demo用 */ public static void printFileContent(String filePath) throws FileNotFoundException,IOException{ // 此处抛的是编译时异常,善意提醒调用者,可能会出现文件找不到的情况,由调用者负责处理异常 BufferedReader br = new BufferedReader(new FileReader(new File(filePath))); String line = ""; // 编译时异常,读取文件时会出现IO异常 while(null!=(br.readLine())){ System.out.println(line); } br.close(); } public static void main(String[] args) { /*** * 调用者负责处理编译时异常 */ try { printFileContent("D:\\test.txt"); } catch (FileNotFoundException e) { // 反馈信息 System.err.println("文件不存在,请检查文件输入路径!"); e.printStackTrace(); } catch (IOException e) { // 反馈信息 System.err.println("文件发生读取异常!"); e.printStackTrace(); } } }
下面再看个UnCheckedException例子.
package com.java.basic; public class UnCheckedExceptionDemo { public static void main(String[] args) { String str = "UnCheckedException"; //char c = str.charAt(10); // 运行时异常,java.lang.StringIndexOutOfBoundsException // 不遵守约定,约定的index值是0-str.length之间 char c1 = str.charAt(0); System.out.println(c1); char c2 = str.charAt(str.length()-1); System.out.println(c2); char c3 = str.charAt(-1); System.out.println(c3); //System.out.println(c); } }
参考链接:http://www.artima.com/designtechniques/desexcept.html
关于异常的使用就说到这里了,不合理的地方欢迎大家一起交流探讨!