异常
1.概述
代码出现了不正常的现象,在Java中每一个异常都是java一个一个的类,或者叫做异常对象
2.异常体系说明
Throwable:
-
Error:错误
- 类似于人得了癌症,不能通过处理让代码变正常,必须得重新写
-
Exception:异常(所有异常的父类)
- 类似于人得了感冒可以治疗,可以通过处理让代码变得正常
分类:
- 编译时期异常:代码一写,jvm编译,冒红(Exception以及Exception的子类 除了RuntimeExcption以及RuntiomeException的子类)
- 运行时期异常:代码写的时候没事,但是运行就报错(RuntimeException以及子类)
public class Demo01 {
public static void main(String[] args) {
int[] data = new int[3];
System.out.println(data[3]);
}
}
/*编译时期异常->
不是写的语法错误,
而是底层给我们抛了一个编译时期异常对象,底层抛出的异常继承自Exception
我们一用就出现了编译时期异常*/
public class Demo02 {
public static void main(String[] args) {
FileOutputStream fos = new FileOutputStream("day11_exception\\1.txt");
}
}
3.异常出现的过程
4.创建异常对象
格式
throw new 异常对象()
public class Demo04 {
public static void main(String[] args) {
String s = "abc.txt1";
method(s);
}
public static void method(String s) {
if (!s.endsWith(".txt")){
//创建异常对象
throw new NullPointerException();
}
}
}
5.异常处理方式
5.1异常处理方式(throws)
在参数后面throws 异常(一个)
public class Demo05 {
public static void main(String[] args)throws FileNotFoundException {
String s = "abc.txt1";
/*
method方法使用了throws异常处理方案
往上抛异常,但是抛的是编译时期异常
此异常让调用处接收了
也就是说:method(s)接收了一个下面抛过来的编译时期异常
所以此处爆红
*/
method(s);
System.out.println("删除功能");
System.out.println("修改功能");
System.out.println("查询功能");
}
public static void method(String s)throws FileNotFoundException {
if (!s.endsWith(".txt")){
//创建异常对象
throw new FileNotFoundException();
}
System.out.println("我要执行");
}
}
在参数后面throws 异常1,异常2
public class Demo06 {
public static void main(String[] args)throws /*FileNotFoundException,*/ /*IOException*/Exception {
String s = "abc.txt1";
/*
method方法使用了throws异常处理方案
往上抛异常,但是抛的是编译时期异常
此异常让调用处接收了
也就是说:method(s)接收了一个下面抛过来的编译时期异常
所以此处爆红
*/
method(s);
}
public static void method(String s)throws /*FileNotFoundException,*/ /*IOException*/Exception {
if (s==null){
//创建异常对象
throw new IOException("IO异常了");
}
if (!s.endsWith(".txt")){
//创建异常对象
throw new FileNotFoundException("文件找不到异常");//利用有参构造设置异常信息
}
System.out.println("我要执行");
}
}
注意:
如果处理的多个异常之间,有子父类继承关系,我们可以直接抛父类异常
如果不知道多个异常之间到底有没有子父类继承关系,我们可以直接抛Exception
5.2异常处理方式(try…catch)
格式(一个catch)
try{
可能会出现异常的代码
}catch(异常类型 对象名){
处理异常的方案->开发中将异常信息保存到日志文件中
}
public class Demo07 {
public static void main(String[] args) {
String s = "abc.txt";
try {
//String s1 = null;
//System.out.println(s1.length());//NullPointerException
method(s);
}catch (FileNotFoundException e){
//如果try中的异常抓不到,try...catch外面的功能会受影响
e.printStackTrace();//将异常详细信息打印出来
}
System.out.println("删除功能");
System.out.println("修改功能");
System.out.println("查询功能");
}
private static void method(String s) throws FileNotFoundException {
if (!s.endsWith(".txt")) {
throw new FileNotFoundException("文件找不到");
}
System.out.println("我要执行");
}
}
格式(多个catch)
try{
可能会出现异常的代码
}catch(异常类型 对象名){
处理异常的方案->开发中将异常信息保存到日志文件中
}catch(异常类型 对象名){
处理异常的方案->开发中将异常信息保存到日志文件中
}catch(异常类型 对象名){
处理异常的方案->开发中将异常信息保存到日志文件中
}...
注意:
a.如果多个异常之间有子父类继承关系,先抓子类,再抓父类异常
b.如果多个异常之间有子父类继承关系,我们可以直接抓父类异常
6.finally关键字
一定会执行的代码块,和try结合使用
public class Demo08 {
public static void main(String[] args) {
String s = "test.txt1";
try {
method(s);
} catch (FileNotFoundException e) {
e.printStackTrace();
}finally {
System.out.println("我一定要执行");
}
}
private static void method(String s)throws FileNotFoundException {
if(!s.endsWith(".txt")){
throw new FileNotFoundException("文件找不到异常");
}
}
}
finally使用场景:
堆内存中的对象由GC(垃圾回收器)回收,但是有很多对象,如:IO流对象,网编 Socket对象,数据库连接对象(Connection)等,GC无法回收,既然GC没有办法回收,我们只能自己关闭资源,销毁对象,所以我们可以将关闭资源,销毁对象的操作放到finally中.
7.抛异常时注意的事项
父类中的方法抛了异常,子类重写方法可抛可不抛
父类中的方法没有抛异常,子类重写方法不要抛
8.try…catch和throws的使用时机
1.如果处理异常之后,还想让后续的代码正常执行,我们使用try…catch
2.如果方法之间是递进关系(调用),我们可以先throws,但是到了最后需要用try…catch做一个统一的异常处理
9.自定义异常
1.创建一个异常
- 继承Exception,此时变成了编译时期异常
- 继承RuntimeException,此时变成了运行时期异常
2.提供构造方法,方便设置异常信息
public class Demo09 {
public static void main(String[] args) throws LoginUserException {
//1.创建Scanner对象
Scanner scanner = new Scanner(System.in);
System.out.println("请您输入要登录的用户名:");
String username = scanner.next();
//2.定义一个字符串,代表已经注册过的用户名
String name = "root";
//3.判断
if (username.equals(name)){
System.out.println("登录成功");
}else{
//如果失败了,就创建异常对象
throw new LoginUserException("登录失败");
}
}
}
public class LoginUserException extends Exception{
public LoginUserException() {
}
public LoginUserException(String message) {
super(message);
}
}
10.打印异常信息的三个方法
Throwable中的方法:
public String getMessage():获取异常的描述信息,原因(提示给用户的时候,就提示错误信息)
public String toString():获取异常的类型和异常描述信息(不用)
public void printStackTrace():打印异常的跟踪栈信息并输出到控制台上(最详细的异常信息)