1. 异常的继承结构:基类为Throwable,Error和Exception继承Throwable,RuntimeException和IOException等继承Exception,具体的RuntimeException继承RuntimeException。
  2. Error和RuntimeException及其子类成为未检查异常(unchecked),其它异常成为已检查异常(checked)。
    unchecked 意思就是我们可能不用去捕获这些异常,出现错误了自动触发,NullPointerException - 空指针引用异常 ClassCastException - 类型强制转换异常。IndexOutOfBoundsException - 下标越界异常 等等我们都是没有进行捕获的,所以几乎永远不必专门捕获一个“运行期违例”——RuntimeException——它在默认情况下会自动得到处理。若必须检查RuntimeException,我们的代码就会变得相当繁复。
  3. Error体系 :
    Error类体系描述了Java运行系统中的内部错误以及资源耗尽的情形。应用程序不应该抛出这种类型的对象(一般是由虚拟机抛出)。如果出现这种错误,除了尽力使程序安全退出外,在其他方面是无能为力的。所以,在进行程序设计时,应该更关注Exception体系。
  4. Exception体系包括RuntimeException体系和其他非RuntimeException的体系 :
    RuntimeException:RuntimeException体系包括错误的类型转换、数组越界访问和试图访问空指针等等。处理RuntimeException的原则是:如果出现RuntimeException,那么一定是程序员的错误。例如,可以通过检查数组下标和数组边界来避免数组越界访问异常。
    其他非RuntimeException(IOException等等):这类异常一般是外部错误,例如试图从文件尾后读取数据等,这并不是程序本身的错误,而是在应用环境中出现的外部错误。 这个时候应该被捕获哦!
  5. 关于异常的其他问题
    过度使用异常 :首先,使用异常很方便,所以程序员一般不再愿意编写处理错误的代码,而仅仅是简简单单的抛出一个异常。这样做是不对的,对于完全已知的错误,应该编写处理这种错误的代码,增加程序的鲁棒性。另外,异常机制的效率很差。
    将异常与普通错误区分开:对于普通的完全一致的错误,应该编写处理这种错误的代码,增加程序的鲁棒性。只有外部的不能确定和预知的运行时错误才需要使用异常。
    异常对象中包含的信息 :一般情况下,异常对象唯一有用的信息就是类型信息。但使用异常带字符串的构造函数时,这个字符串还可以作为额外的信息。调用异常对象的getMessage()、toString()或者printStackTrace()方法可以分别得到异常对象的额外信息、类名和调用堆栈的信息。并且后一种包含的信息是前一种的超集。
  6. 上面的信息是笔者收集高手写的,已经总结的非常的棒了,其实在项目的工程中,各种异常应接不暇的,我们需要自己去设置异常信息,由于异常的处理,很多的异常并非一定需要捕获,比如配置信息错了,程序直接崩掉这个是最好的吧!配置信息都没有对,怎么执行下面的东西,这个和IO异常不一样
  7. 笔者呢,在看Shiro源码的时候,发现了这个异常的书写,就想看看高手们怎么书写的编程规范。
    这里就是一个UnavailableSecurityManagerException 运行时的异常,这个是自定义的,当获取不到安全管家的信息的时候,就发出异常,程序崩溃掉,这个不用捕获的。

public static SecurityManager getSecurityManager() 
throws
UnavailableSecurityManagerException
{
SecurityManager securityManager = ThreadContext.getSecurityManager();
if(securityManager == null) {
securityManager = securityManager;
}

if(securityManager == null) {
String msg = "No SecurityManager accessible to the calling code,
" or as a vm static singleton. This is an invalid application "
+ "configuration.";
throw new UnavailableSecurityManagerException(msg);
} else {
return securityManager;
}
}
package org.apache.shiro;

import org.apache.shiro.ShiroException;

public class UnavailableSecurityManagerException extends ShiroException {
public UnavailableSecurityManagerException(String message) {
super(message);
}

public UnavailableSecurityManagerException(String message, Throwable cause) {
super(message, cause);
}
}
package org.apache.shiro;

public class ShiroException extends RuntimeException {
public ShiroException() {
}

public ShiroException(String message) {
super(message);
}

public ShiroException(Throwable cause) {
super(cause);
}

public ShiroException(String message, Throwable cause) {
super(message, cause);
}
}

所以这个是非常好的编程规范,我们在使用库函数的时候,经常看得这样的报错信息都是由于这样的定义才知道的错误,是不是非常的方便呢,所以啊,学习的时候,自己也可以定义一些经常发现的异常信息哦。