首页 > 代码库 > java学习笔记(Core java)7 断言与异常
java学习笔记(Core java)7 断言与异常
1.错误的原因:
输入错误 设备错误 物理限制 代码错误
2.异常分类
总:Throwable->Error
->Exception->IOException
->RuntimeException:
继承RuntimeException异常的异常包括:
错误的类型转换;
空指针
访问越界
不继承RuntimeException异常的异常包括:
试图打开一个不存在的文件
试图在文件尾部读取数据
试图根据给定的字符串查找CLASS对象,但这个对象并不存在
C++中两种异常:logic_error类 相当于RuntimeException表示程序中的逻辑错误
runtime_error类 相当于非RuntimeException异常。由于不可预测的原因所引发的异常的基类
3.声明以检查的异常:
public FileInputStream(String name) throws FileNotFountException
抛出异常的情况:
1)调用一个抛出已检查异常的方法
2)程序运行过程中发现错误,并且利用throw抛出一个已检察的异常(throw)
3)程序错误 抛出一个未检查异常
4)Java虚拟机在运行时库出现错误
在方法的首行应该声明方法有可能抛出的异常
任何代码都应有抛出异常的潜能,因此继承与Error的异常不需要声明出来
同样RuntimeException的异常也不应该声明出来,因为该类异常应该在代码中修改避免出现
如果子类方法覆盖了父类的对象,子类抛出的异常只能比超类抛出的异常更加特定,也就是说父类方法中声明检查的异常要比子类对象方法中的异常更加通用
5.抛出一个异常 throws new EOFException()
String readDate(Scanner in) throws EOFException
{
while(true)
{
if(in.hasNext())
{
if(n < len)
{
//String err = "抛出异常";//可以自定义抛出的字符串
//throw new EOFException(err);
throw new EOFException();
}
}
}
return;
}
C++: java只能抛出Throwsable子类对象。C++能抛出各种类的对象
6.定义一个异常类 需继承异常基类
class FileFormatException extens IOException
{
publuc FileFormatException() {}
publuc FileFormatException(String err) //重载构造函数可以打印错误信息
{
super(err);//超类Throwable的toString会打印错误信息
}
}
//////////////////////
java.lang.Throwable
Throwable()
Throwable(String message)
String getMessage() /获取Throwable对象的详细信息
//////////////////////
7.捕获异常信息
try{
...
}
catch(Exception e1)
{
...
e1.printStackTrace();//打印错误栈
}
catch(Exception e2)
{
...
e2.printStackTrace();//打印错误栈
}
catch(Exception e3)
{
...
e3.printStackTrace();//打印错误栈
}
//如果方法中的代码抛出了一个早catch中没有声明的异常类型,那么这个方法就会退出
8.再次抛出异常与异常链
1.在catch中再次抛出一个异常
2.包装异常链并获取原始异常原因
try{
...
}
catch(SQLException e)
{
Throwable se = new ServletException("database err");
se.initCause(e);
throw se;
}
当获取异常时,可以使用 Throwable e =se.getCause();重新获取异常原始原因
9.finally //跟C#一样
在finally只用return会有意想不到的结果 因为finally里面的返回值会覆盖try方法里的返回值
10.带资源的try
try(Resource res = ...)
{
}
无论是否发生异常,try退出时会自动调用res.close()方法
11.分析堆栈跟踪
printStackTrace();
getStackTrace();//返回一个StackTraceElement数组
该数组包括文件名,行号,类名,方法名
静态的Thread.getAllStackTrace();对所有线程栈进行跟踪
(原书 489页 Throwable api)
12.使用异常的技巧
1)异常处理不能代替简单的测试(耗费时间)
2).不要过分的细化异常
坏习惯:
for(i = 0; i < 100; i++)
{
try{
...
}catch(Exception e){
...
}
}
转变为:(上述例子太细化每个过程了)
try{
for(i = 0; i < 100; i++)
{
...
}
}catch(Exception e){
...
}
3)利用异常层次结构
不要只抛出RuntimeException异常。应该寻找更加适当的子类异常
不要只捕获Throwable异常。会是源码难以维护
4)不要压制异常
5)在检测错误时,“苛刻”要比放任更好
6)不要羞于传递异常
5)6)==》 利用异常链 早抛出,晚捕获,
13.assert断言(允许在测试期间插入检查语句,代码发布时,检测语句将会自动移走)
assert条件: assert条件:表达式
断言条件为flase时,将会抛出AssertionError异常
在第二种形式中,表达式将被传入AssertionError构造器中转换为一个消息字符串
例子: assert x>0 或者 assert x>0 : x; //x的值将传入AssertionError对象
C++: assert(x >= 0); 将自动打印失败条件
==》java: assert x > 0:"x > 0";
14。启用与禁用断言
15.java给出了三个系统处理错误的机制:抛出异常,日志,使用断言
使用断言的情况:
断言失败是致命的,不可恢复的错误
只用于开发测试阶段
断言api 原书(496页)
16.日志记录
17.调试技巧
java学习笔记(Core java)7 断言与异常