Mind
编译阶段:
Java不会运行代码,只会检查语法是否错误,或者做一些性能的优化
Exceptions
异常 由程序或运行时环境抛出,可以根据需要进行相应的捕获和处理,父类Exception
error
错误 代表不可恢复的问题(系统级别的错误)并且必须捕获处理- 异常和错误都是对象,代表非正常情况或无效处理
- 常见异常:
- 试图做除0处理
- 数组索引越界
- 找不到指定的文件
- 不能正常完成被请求的I/O操作
- 执行了空引用
- 执行的操作违反了某种安全规则
- 异常处理方法
- 抛出处理
throws
写在方法定义处,表示声明一个异常,告诉调用者,使用本方法,可能会有哪些异常- 编译时异常必须要写
- 运行时异常可以不写
throw
写在方法内,结束方法,手动抛出异常对象,交给调用者,方法中下面的代码就不再执行了
加粗样式
public void method()throws 异常类名1,异常类名2...{
...
}
public void 方法(){
throw new NullPointerException();
}
- 根本不处理异常(程序终止运行或程序处于不正常状态)
- 当异常发生时处理异常
- 在程序的某个位置集中处理异常(上层,先运行的位置)
原因:异常的传递
如果在一个异常的发生处没有捕获和处理该异常,则该异常将传递给上级调用方法,直到传递出main方法,报错,程序停止运行 - 捕获
- 自己处理异常(当代码出现问题时可以继续往下执行,不会停止运行)
try…catch
try {
//可能出现异常的代码;
}catch (异常类名 变量名){
//异常的处理代码;
}
- 如果try中没有问题,会把try中的代码全部执行完,不会执行catch里面的代码
- 一个try可以写多个catch分别捕获相对应的异常,如果没有相对应的异常捕获则try里面的语句不执行
- 如果捕获多个异常,这些异常中存在父子关系,异常的父类写在下面
- JDK7之后,我们可以在catch中捕获多个异常,中间用
|
隔开,且只能用一个 - 如果
catch
捕获的异常与try
里面的不一致,那么将会报错,程序停止运行 - 如果
try
上面的语句出现异常被捕获,下面的语句将不再执行
- 作用
- 查看bug的关键参考信息
- 可以作为方法内部的一种特殊返回值,以便通知调用者底层的执行情况
package Java;
public class Exception {
public static void main(String[] args) {
Student s = new Student();
s.setAge(8);
}
static class Student{
private int age;
public Student() {
}
public Student(int age) {
this.age = age;
}
public void setAge(int age){
if(age < 18){
throw new RuntimeException();//抛出异常
}else this.age = age;
}
}
}
- 异常抛出时所输出的信息,提供了方法调用堆栈踪迹,调用堆栈踪迹可以显示引起异常方法发生的各个方法的调用顺序
getMessage
方法返回一个字符串,解释异常抛出的原因printStackTrace
方法输出调用堆栈踪迹信息
Throwable成员方法
方法名称 | 说明 |
---|---|
public String getMessage() | 返回此throwable的详细消息的字符串 |
public String toString() | 返回此可抛出的简短描述 |
public void printStackTrance() | 把异常的错误信息输出在控制台,不会停止程序运行 |
了解:System.err.println(123)//输出红色的123,打印顺序也有所不同
finally子句
- 写在所有catch语句之后,无论怎样,都会在最后执行finally里的语句
自定义异常