异常与错误的分类
Throwable类是Java语言中所有异常和错误的超类
- Error称为严重问题,不需要处理
- Excepption称为异常类,他表示程序本身可以处理的问题
- RuntimeException:在编译器检查不到,运行时出现问题
- 非RuntimeException:编译前就必须要进行处理,否则程序无法通过编译
JVM的默认处理方案
如果程序出现了问题,我们又没有做任何处理,最终JVM会做默认的处理:
- 将异常信息和出现异常的位置打印
- 程序停止执行
异常处理try…catch
嗐,千篇一律,无需多言
try {
//todo
} catch (Exception e) {
e.printStackTrace();//打印异常信息
} finally {
//todo
}
Throwable的成员方法
Message是在构造方法中进行赋值的
方法 | 描述 |
---|---|
getMessage() | 返回此异常的原因 |
toString() | 返回该异常的原因和类名 |
printStackTrace() |
将异常的类名,原因,出现异常代码的位置信息 |
编译时异常与运行时异常的区别
Java中异常分为两大类:编译时异常与运行时异常,也被称为受检异常和非受检异常
所有的RuntimeException类以及子类被称为运行时异常,其他的异常都是编译时异常
- 编译时异常:必须显示处理,否则程序就会发生错误,无法通过编译,如果使用throws,谁调用谁处理
- 运行时异常:无需显示处理,也可以和编译时异常一样处理
异常处理throws
并不是所有情况我们都有权限进行异常的处理,有时候可能出现的异常我们是处理不了的
针对这种情况,Java提供了throws解决方案,格式是跟在方法括号后面
:
public void yourMethod() throw 异常类名 {
//todo
}
异常只是被抛出当前代码块了,但是在哪里使用还是需要进行try…catch的
自定义异常类
只要我们的类继承RuntimeException或者Exception就可以成为其中一员
编写一个异常类:
public class ScoreException extends Exception {
public ScoreException() {
}
public ScoreException(String message) {
super(message)
}
}
使用这个异常:
public class GenericDemo {
public void checkScore(int score) throws ScoreException {
if (score<0 || score>100) {
throw new ScoreException();//使用throw抛出这个异常
} else {
System.out.println("分数正常!");
}
}
}
throws和throw的区别
throws:
- 用在方法声明后,跟的是类名
- 表示抛出异常,由该方法调用者来处理
- 表示出现异常的一种可能,并不一定会发生这些异常
throw:
- 用在方法体内,跟的是异常对象名
- 表示抛出异常,由方法体内的语句进行处理
- 执行throw一定是抛出了某种异常