基础语法及概念:
java中的异常处理主要围绕着 try-catch-finally throw throws展开, java异常共分为运行时异常(Runtime Exception ) 和 非运行时异常(Checked Exception), 或者称之为
受检查异常。 Java中所有的异常, 都继承至 Throwable. 其中Error类也继承至Throwable类, 不过若是发生这个原因, 就不能称之为异常了, 发生了Error异常,一般是Java
系统在运行时发生了错误, 比如说运行堆内存不足, 程序发生了死锁。 除了将错误信息发回给用户外, 就已经没救了.
Runtime Exception:
运行时异常可以由用户造成, 也可以由本身的编码导致, 比如说ArrayIndexout... 数组越界异常, 或者用户输入了空值导致发生了nullPointerException空指针异常, 或 者在运行时找不到类 ClassNotFoundException 等. 运行时异常往往是最难处理的, 因为你不知道他会在什么时候发生, 有可能是你自己的代码触发,也可能是用户的输入触发。 他在语法上不需要声明抛出异常。
Checked Exception:
受检查异常需要 try catch 或者 抛出去(throws ). 他一般表示程序有可能会在编译时期发生不确定的行为, 比如读写IO 数据库连接 或者装载一个类, 他们都需要程序员
显示的 try catch finally, 其中finally 是 不管有没有发生异常都必须要执行的一个操作, 其一般用在关闭数据库连接, 关闭文件连接 等.
异常处理的规范:
咋地一看好像异常处理为程序健壮性提供了很大的方便, 但是我们只有在不得以的情况下才声明或者抛出异常。 你必考虑到异常也是API的一部分,这意味着
如果你在写一个对外调用的接口, 比如说下面这样 声明他可能抛出的异常.
interface demo throws Exception{
public void demo1();
}
这就意味着你在很长一段时间都无法摆脱这个异常,以后你要重构或进一步开发这些 API 时,不得不考虑这些异常带来的向后兼容性问题。因为,如果你在日后的版本中删除了某个异常的声明,就会造成之前用户的代码无法通过编译。 所以我们应该仔细设计可能发生的异常,
异常处理规范2:
异常处理的难点主要是在对于什么时候处理异常的理解上。在不同的层级上,你要考虑这个异常是不是应该在这个层级上进行处理,还是说应该继续向上抛出,甚至某些情况下还需要包装捕获到的异常,再向上抛出。
不同抽象层级上的代码应该只声明抛出同一层级上的异常。
就像处理界面(Controller)的代码不应该还会捕获处理数据库操作的异常一样(Service and dao)。 为了避免这个问题,更高层次的实现需要捕获低层次的异常,包装之后再抛出属于更高层次的异常,这种做法被称为异常转换:
try {
...
} catch(LowerLevelException e) {
throw new HigherLevelException(...);
}
try catch块应该尽量缩小, 简洁明了的声明哪行代码可能发生异常,并且尝试着把 try catch 作为一个流程, 千万不要catch 之后什么都不做, 比如说就记录一个
日志 或者打印Message
String parm;
try {
param = jsonObj.getString("parm");
} catch (JSONException e) {
e.printStackTrace();
param = "default value"; //提供一个默认值
}