异常
异常:
Throwable 类是 Java 语言中所有错误或异常的超类。
是什么?
程序在运行出现的问题,
异常的分类:
-
Throwable: 它是所有错误与异常的超类(祖宗类):
-
Error错误:必须修改代码,系统性问题
-
Exception:
RuntimeException:运行时异常
非RuntimeException:编译时异常
-
如果不显式处理异常,最终会抛给jvm
成员方法
toString()
获取异常类名和异常信息,返回字符串。
printStackTrace()(常用)
获取异常类名和异常信息,以及异常出现在程序中的位置。返回值void。
有哪些捕获方式?异常怎么捕获?
标准格式:
try {
可能发生错误的代码
} catch (异常类名 异常对象名) {
对异常处理
} finally {
释放资源
}
finally 一定会执行,在异常发生之前执行。return也挡不住,System.exit(0)结束jvm
多个异常怎么捕获
try{}
catch(){}
catch(){}
catch(){}
一旦try catch有一个分支匹配成功,结束try catch
注意:
- catch捕获的异常类名 不要写太宽泛的Exception。写具体的。
- try代码块中某个位置产生了异常,那么try中的代码就不继续执行了
- 也就是说try当中要么不产生异常,要么只会产生一个异常
- catch中可以填入多个异常对象匹配,用符号 |,类型可写多个,引用只要一个。一般叫e。
- try catch尽量简洁高效。
- 异常类最常用的方法,e.printStackTrace() 打印和jvm报错一样的信息。包含异常的全限定类名,出错原因,出错行数
- finally怎么都会执行。
- 运行时异常,什么都不写自动抛出
捕获异常干什么
实际开发中,出现问题时经常的,但不是所有的问题都要让整个程序立即结束运行,这样会使用户的体验不好。通过异常捕获处理,让不影响全局的小错误,即使解决,或者暂时搁置,或者回馈给用户友好的信息。让整个程序继续运行。
抛出异常
throws
-
main方法抛出异常时不合理的。
-
throws(可能抛出) :在不需要处理的方法跑出去,在需要处理的地方让调用者处理。
-
抛出编译时异常,会要求显式处理
-
抛出运行时异常,不会要求显式处理
-
当直接抛出Exception的时候,编译器会把它当作编译时异常处理,要求必须显式处理
-
当同时抛出两个都是编译时异常且还有父子关系的时候,会强制要求显式处理父类异常,
方法的重写问题中异常问题:
子类重写方法,不能比父类中抛出更多异常。
具体情况:
当父类抛出编译时异常
- 可以不抛出异常
- 可以抛出一样的异常
- 不能抛出不一样的编译时异常
- 子类的重写方法可以抛出运行时异常
父类抛出运行时异常
-
子类重写方法不能抛出Exception
-
子类重写方法可以是让任何运行时的异常
-
子类抛出编译时,多态调用时会对程序有影响。不能使编译时异常
父类不抛出异常,子类重写方法不能抛出编译时异常。
在异常没有产生的时候,显式的抛出异常,是对调用者的警告。
throw
throw关键字一定会抛出一个异常对象
- 编译时异常的throw 一般配合throws使用
两种异常的处理方式
从使用代码上:
运行时异常:一般出现了优化代码即可
编译时异常:出现了,就尽量try catch自己处理,或者抛出去。
throw和throws的区别
-
从使用位置上
- 一个在方法声明中,一个在方法体内
-
从作用上
- throws表示可能抛出的异常种类,throw时一定会抛出一个具体异常对象
-
从抛出个数上
throws可以跟多个异常类名,用逗号隔开throw只能抛出一个确定的异常对象
-
从根本上
throws表示抛出异常的一种可能性,并不一定会发生这些异常throw表示一定会抛出异常,只要是代码执行到这一句,一定会抛出
到底是该try 还是抛呢?
运行时异常:让异常出现,自己优化代码
编译时异常:try catch 处理。
自定义异常:
自定义异常步骤:
- 先写个异常类继承
继承RuntimeException :获得运行时异常
继承Exception:获得编译时异常
-
写一个有参构造方法,super(massage) 用来构造自定义异常的描述信息
-
在使用的地方抛出比如:
// 只要i不是1就 丢出 if (i != 1) { throw new NoOneException("不是1啊"); } else{ System.out.println("你是输入的时1"); }