异常
编译时异常(受查异常)
- 最简单的是通过throws进行处理,这样会将处理异常的任务交给方法调用方
- 另一种是使用try{}catch{}进行捕获处理
- 代表异常:克隆异常(CloneNotSupportedException)
- 实例:
// 实现Cloneable接口
class A implements Cloneable{
public int val;
A(int val) {
this.val = val;
}
// 重写clone()方法!
@Override
protected Object clone() throws CloneNotSupportedException {
return super.clone();
}
}
public class Main {
// 编译时异常需要再抛出交给JVM处理
public static void main(String[] args) throws CloneNotSupportedException {
A a = new A(1);
A b = (A) a.clone();
System.out.println(b);
}
}
运行时异常
- 需要打印栈上的异常信
- 息,定位出错位置:printStackTrace()方法
- 空指针异常、算数异常、类不存在异常、输入类型不匹配异常等……
- 实例:
Scanner scanner = new Scanner(System.in);
try {
int a = scanner.nextInt();
int result = 10 / a;
} catch (ArithmeticException e) {
System.out.println("算术异常");
} catch (InputMismatchException e) {
System.out.println("输入类型不匹配");
} catch (Exception e) {
System.out.println("异常!");
} finally {
scanner.close();
}
自定义异常
// Login类
class Login {
String userName;
public Login(String userName) {
this.userName = "qyy";
}
// 使用throws进行处理,将处理异常任务抛给调用方
public void check(String userName) throws UsernameException {
if (!userName.equals("qyy")) {
// 抛出异常,但没解决
throw new UsernameException("用户名错误");
}
}
}
主函数调用:
错误
错误是比较严重的,需要程序员干预才能解决,一般是栈溢出、堆溢出
finally{}
- 能够保证抛出异常后仍然执行
- 一般进行资源的回收
- 就算finally之前有return也会执行,但是不建议在finally中进行return
几点注意
- 捕获异常时应该将父类的异常放在最后(异常捕捉会捕捉自己子类的异常)
- 异常的处理方法如果在本层不合适,那就会一直向上传递(向调用方传递),如果一直没有,那就交给JVM进行处理,会异常终止