案例:
有一个模拟计算器程序,其中有五个方法需要测试时又有异常,需要我们进行测试,通过注解编写一个用来测试异常的简单框架,要求可以自动执行所有标有相应注解的方法并检查出异常,并将异常信息打印在日志文件中
模拟计算器代码
package annotiation;
public class jisuanqi {
@check
public void add(){
String s=null;
s.toString();//有空指针异常
System.out.println("1+1="+(1+1));
}
@check
public void sub(){
System.out.println("1-0="+(1-0));
}
@check
public void cheng(){
System.out.println("1*0="+(1*0));
}
@check
public void chu(){
System.out.println("1/0="+(1/0));//有算数异常
}
public void show(){
System.out.println("这个方法不会有异常");
}
}
注解代码
package annotiation;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
public @interface check {
}
检查异常代码
package annotiation;
import java.io.BufferedWriter;
import java.io.FileWriter;
import java.io.IOException;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
public class checkTest {
public static void main(String[] args) throws IOException {
int number =0;
BufferedWriter bufferedWriter = new BufferedWriter(new FileWriter("日志.txt"));
//创建计算器对象
jisuanqi jisuanqi = new jisuanqi();
//获取计算器字节码文件,用于获取方法
Class jisuanqiClass = jisuanqi.getClass();
//获取方法
Method[] methods = jisuanqiClass.getMethods();
//循环遍历判断方法是否有check注解
for (Method m: methods) {
//如果有,则执行方法
if(m.isAnnotationPresent(check.class)){
//对出现的异常进行捕获,并打印信息
try {
m.invoke(jisuanqi);
} catch (Exception e) {
bufferedWriter.write("出现了"+e.getClass().getSimpleName()+"异常");
bufferedWriter.newLine();
bufferedWriter.write("异常的信息是:"+e.getCause().getMessage());
bufferedWriter.newLine();
number++;
bufferedWriter.write("----------------------------------");
bufferedWriter.newLine();
}
}
}
//打印异常总次数
bufferedWriter.write("总共出现了"+number+"次异常");
bufferedWriter.flush();
bufferedWriter.close();
}
}