异常
异常的概念
stackOverFlow:栈溢出
Exception分为检查型异常和非检查型异常。检查型异常必须在源码中进行捕获处理,这是编译检查的一部分。除了RuntimeExceion及其子类之外的异常都是检查型异常。非检查型异常就是所谓的RuntimeExceion,类似NullPointerException,ArrayIndexOfBoundException就是非检查型异常,通常是可以通过编码避免的逻辑错误,具体根据需要判断是否需要捕获,编译期不检查(注意同样的,运行时异常也是可以捕获的),如果抛出了非检查型异常,那就是编码逻辑有问题,要解决。
常见异常:
常见Error:
StackOverFlowError(栈溢出,在无限递归时常见)
OutOfMemoryError(内存溢出)
捕获异常
注意,我们是不应该捕获Error,而不是不能捕获Error:Error是正常情况下不大可能出现的情况,绝大部分的Error都会导致程序状态不正常,不可恢复,既然是非正常情况,所以不便也不需要处理。但是既然Error也是继承于Throwable的,说明它也是可以被捕获的,只是我们通常不会这样做而已:
/**
* @program: OJ
* @description:尝试捕获Error
* @author: JiaDing
* @create: 2020-03-29 17:30
**/
public class CatchError {
public static void main(String[] args) {
final String errorMessage="I'm an error,please catch me";
try{
throw new Error(errorMessage);
}catch (Throwable e){
e.printStackTrace();
}
System.out.println("捕捉完成");
}
}
在try中的代码,报错后就结束,不会执行try中剩下的部分
抛出异常
throw exception
抛出异常后在调用位置去捕获处理
main方法也可以抛出异常,但是抛出就直接甩到虚拟机了,程序中对其将无法处理,此时就直接结束程序的运行,所以一般不这样做
重写方法不能抛出比被重写方法范围更大的异常类型,也就是说,子类不能抛出比父类更大范围的异常
人工抛出异常:
用户自定义异常类必须继承现有异常类
JAVA提供的异常类一般是够用的,只有特殊情况才需要自定义,情况少见
注解
@Deprecated过时方法不是不能调用,只是显示出来,便于选择和之后的迭代
示例:
这些内容可以被抽取到dlc文件中
javadoc test1.java//抽取注解到文档中
生成的文件们:
生成的文档页面(HTML):
@Target(ElementType.FIELD)//声明这个注解类是给其他类的属性做注解
@Rectention(RetentionPolicy.RUNTIME)//定义注解的生命周期
@Documneted//表示将注解写到文档中
@interface TestAnn{
?public int id() default 0;//default是默认值
public String desc() default "";
}
使用:
对一个属性进行注解
注解可以用来替换配置文件的作用以简化操作
示例,依然以之前使用配置文件来调用任意类的任意方法的例子为例: