软构复习4
正确性和健壮性
健壮编程原则:封闭实现细节;考虑极端情况;
健壮性:尽可能使程序运行而不是退出
健壮性:
让用户变得更容易:出错也可以容忍,程序内部已有容错机制
正确性:
让开发者变得更容易:用户输入错误,直接结束。
(不满足precondition的调用)
Error:一旦出现程序员无能为力,只能想办法让程序优雅的结束
Eg.用户输入错误、设备错误、物理限制
异常:程序自己的问题,可以捕获,可以处理
可以上抛,将错误信息传递给上层调用者,
异常可分为:
运行时异常:由程序员在代码里处理不当造成
其他异常:外部原因
运行时的异常:运行时才会出现的异常;如数组下标越界,空指针,类型转换异常,非法参数。一般是由程序逻辑错误导致的,可以通过捕获处理或向上抛出。特点是,java编译器不会检查他,也就是说,当程序可能出现运行异常时,也能编译通过。但如果在代码中提前验证,运行时异常是可以避免的。
编译异常:文件找不到,类找不到,方法找不到。是程序编译时会出现的异常,必须进行处理,如果不处理,程序就不能编译通过。这种异常就算提前验证也不能完全避免。
编译器可帮助检查你的程序是否已抛出或处理了可能的异常
Checked Exception
编译器可帮助检查你的程序是否已抛出或处理了(捕获)可能的异常
每个调用者都应该知道和处理的错误,必须捕获或传播,否则程序将无法编译(编译器检查是否为所有检查的异常提供异常处理程序)。类似于静态类型检查。
Unchecked Exception
错误表示发生在应用程序之外的条件,如系统崩溃。运行时异常通常由应用程序逻辑中的故障发生。
在这些情况下,你不能做任何事情,但必须重写你的程序代码。所以这些不会被编译器检查。这些运行时异常将在开发和测试过程中被发现。然后,我们必须重新配置我们的代码,以删除这些错误。
不需要在编译时用try...catch等机制处理,可以不处理,编译没问题,但执行时出现就导致程序失败,代表程序中的潜在bug。类似于动态类型检查。
异常处理操作
try{
编写可能会出现异常的代码
}catch(异常类型 e){
处理异常的代码
//记录日志/打印异常信息/继续抛出异常
}
finally:无论异常是否产生,都需要执行的代码。
throw:抛出异常 格式:throw new 异常类名(参数);throw关键字使用在方法内,可以抛出指定的异常对象,方式如下:创建一个异常对象。封装一些提示信息(信息可以自己编写)。代码出现异常时,该异常对象将会自动传递到调用者处,同时结束当前方法的执行。
throws:声明异常
声明异常:声明一个异常,并告知调用者。关键字throws运用于方法声明上,表示当前方法不处理异常,而是提醒该方法的调用者来处理异常(捕获处理或者继续抛出)。
如果方法内部throw一个编译异常,而没有捕获处理,那么必须在方法体上通过throws进行声明,让调用者处理。
checked就是必须要处理的异常,一般发生于一些特殊情况没有考虑,可以try catch或者throws声明然后抛出
unchecked异常一部分是由开发者自身程序出错,Runtime Exception,一部分是别的,这些异常如果不处理也能成功编译
Unchecked异常也可以使用throws声明或try/catch进行捕获,但大多数时候是不需要的,也不应该这么做
可以处理的就是checked异常,若没有办法就是Unchecked
要throws checked 异常
程序员必须在方法的spec中明确写清本方法会抛出的所有checked exception,以便于调用该方法的client加以处理
而unchecked异常不能出现在spec里
这些被throws的异常,要么是本方法检测到的,是自己造出的;要么是本方法调用的其他函数抛出的,是从其他函数传来的异常。
此时需要告知你的client需要处理这些异常;如果没有handler来处理被抛出的checked exception,程序就终止执行
构造自己的异常类
捕获异常:
尽量在自己这里处理,实在不行就往上传,也可以不处理,直接传给调用方,由客户端处理
如果父类型中的方法没有抛出异常,那么子类型中的方法必须捕获所有的checked exception;子类型方法中不能抛出比父类型方法更多的异常!
断言:fail fast 的一种
异常:预料到可能会发生的不正常情况
断言:处理绝对不应该发生的情况
出现AssertionError,意味着内部某些假设被违反了
断言仅出现在开发阶段,实际运行阶段不再使用断言
断言只是检查程序的内部状态是否符合规约
断言一旦false,程序就停止执行
外部错误要使用Exception机制去处理
防御式编程
来自外部的数据源要仔细检查;输入参数的合法性也要检查,并决定如何处理非法输入

浙公网安备 33010602011771号