异常分类:在Java中,所有的异常对象都是 派生于Throwable类的子类 。在下一层立即分解为 Error和Exception两个子类:Error类描述了 系统级错误和资源耗尽的问题,出现这种问题一般无能为力;在设计Java程序时,我们应该关注 Exception层次结构,Exception又分为两个分支,一个分支派生于RuntimeException,另一个分支包含其它异常。这么划分的依据是:RuntimeException输入程序错误导致的异常,而程序本身没有问题,像 I/O错误导致的异常属于其它异常。
已检查异常:当遇到无法处理的情况时,Java的方法可以抛出一个异常。一个方法 不紧需要告诉编译器将要返回什么值,还需要告诉编译器可能发生什么错误。示例如下:
public static Object goodCopyof(Object a, int newLength) throws FileNotFoundException
创建异常类:创建自己的异常类,我们只需要让自己的类 继承自 Exception 或者 其子类。 习惯上,自己的异常类应该包含两个构造器:一个是默认的构造器,一个是带有详细信息的构造器。
处理异常: 应该捕获知道如何处理的异常, 不知道如何处理的异常应当抛出给调用者。
子类和超类中的异常:如果 覆盖超类的某个方法,而 超类的这个方法并没有抛出异常,则 子类的这个方法必须捕获所有已检查的异常。子类覆盖的方法所抛出的异常 不允许超过 超类方法所列出的 异常范围。
捕获多个异常: 可以使用并列的catch子句 捕获多个异常,也可以在 捕获异常之后抛出新的异常,下面是 异常包装的示例:
try{
}catch (SQLException e){
Throwable se = new ServerException("error");
se.initCause(e);
throw se;
}
使用这种方式可以 将一个异常 包装在 另一个异常中 抛出。在 外部 可以使用 getCause()方法获得 原始的异常。
finally子句: 在某些场景, 会有操作完成必须关闭某些连接或者 释放某些资源的操作,这个时候必须使用 try finally结构,确保try块中的代码无论正常执行还是发生异常,都会执行finally中的操作,释放必要的资源。
带资源的try语句:如果资源 实现了 AutoCloseable接口,则可以使用 带资源的try语句。示例如下。在 try块结束时,会自动调用资源的 close()方法,关闭资源。其作用和 finally的作用一样。try()中可以 打开 多个资源。
try()
{
}
日志和调试: 日志可以使用内置的 java.util.logging包,可以设置日志的输出级别,也可以使用其它的日志框架 比如 log4j。调试一般根据 具体的IDE会有不同,调试的时候可以使用断点来分析具体的行为是否符合预期。