异常
常见错误类型
- 用户错误输入
- 设备错误
- 物理限制
- 代码错误
异常分类
Java中的异常对象由Throwable派生而来,可分为Error和Exception两个分支。其中,Error类错误属于内部错误,如果出现,除了通告给用户,并尽力使程序安全的终止外,再也无能为力了。这种情况很少出现。
Exception类可分为两个RuntimeException和IOException。
- RuntimeException
RuntimeException由程序错误导致,包含以下几种情况:- 错误的类型转换
- 数组访问越界
- 访问空指针
- IOException
IOException是程序本身没问题,但由于像I/O错误这类问题导致的异常,包括:- 试图在文件尾部后面读取数据;
- 试图打开一个不存在的文件;
- 试图根据给定的字符串查找Class对象,而这个字符串表示的类并不存在;
创建异常类
class FileFormatException extends IOException{
public FileFormatException (){}
public FileFormatException (String gripe){
super(gripe);
}
}
String readData(BufferedReader in) throws FileFormatException{
...
while(...){
if (ch == -1){
if (n < len)
throw new FileFormatException();
}
...
}
return s;
}
断言
assert 条件
或
assert 条件:表达式
如
assert x > 0 : x;
断言机制将会对条件进行判断,当不满足条件是,会抛出一个AssertionError异常,在第二种形式中,表达式会以字符串的形式传入AssertionError的构造器,并打印出来。断言检查只用于开发和测试阶段,当代码发布时,这些插入的检测语句将会被自动的移走。
日志
日志记录器级别
- SEVER
- WARNING
- INFO
- CONFIG
- FINE
- FINER
- FINEST
在默认情况下,只记录前三个级别。也可以设置其他的级别。如
logger.setLevel(Level.FINE);
默认情况下,日志配置文件存在于:jre/lib/logging.properties
创建新的日志
通过 Logger.getLogger() 方法创建新 Logger,这个方法接收一个 String 参数,用于指定 Logger 的名字。如果指定名字的 Logger 已经存在,那么只需要返回已经存在的 Logger;否则,程序会创建一个新 Logger。
通常情况下,一种好的做法是,我们在当前类下使用 class.getName() 作为新 Logger 的名字。示例:
Logger logger = Logger.getLogger(MyClass.class.getName());
记录日志事件
logger.log() 方法除了日志消息以外,还需要一个日志级别作为参数:logger.log(Level.WARNING, "This is a warning!");大部分日志框架都针对输出特定级别日志提供了快捷方式。例如,下面语句的作用和上面语句的作用是一样的:logger.warning("This is a warning!");你还可以阻止 Logger 输出低于指定日志级别的消息。在下面的示例中,Logger 只能输出等于或者高于WARNING 级别的日志消息,并丢弃日志级别低于WARNING的消息:
logger.setLevel(Level.WARNING);
调试技巧
- 打印变量值;
System.out.println("x=" + x);
或
Logger.getGlobal().info("x=" + x);
- 在每一个类中放置一个main方法,这样就可以对每一个类进行单元测试;
- JUnit单元测试框架;
- 日志代理是一个子类的对象,它可以窃取方法调用,并进行日志记录,然后调用超类中的方法;
- 利用Throwable类提供的printStackTrace方法,可以从任何一个异常对象中获得堆栈情况;
- 利用printStackTrace(PrintWriter s)方法将堆栈跟踪信息发送到一个文件中;
- 将程序错误信息保存在一个文件中;