Java|学习|异常

1.异常

1.1 异常

1.1.1 概述

异常:就是程序出现了不正常的情况。

Java|学习|异常_第1张图片

Error:严重问题,不需要处理。

Exception:称为异常类,它表示程序本身可以处理的问题。

RuntimeException:在编译器不检查,出现问题后需要我们修改代码。

非RuntimeException:编译器就必须处理,否则程序不能通过编译,更不能正常运行。

Throwable是所有异常类的超类。

1.1.2 JVM的默认处理方案

如果程序出现了问题,我们没有做任何处理,最终JVM会做默认的处理:

把异常的名称、异常原因以及异常出现的位置等信息输出在了控制台。

程序停止执行。

1.1.3 Throwable的成员方法

方法名 说明
public String getMessage() 返回此throwable的详细消息字符串 原因
public String toString() 返回此可抛出的简短描述(包括getMessage的详细消息字符串) 原因+名称
public void printStackTrace() 把异常的错误信息输出在控制台(包括toString的描述) 原因+名称+位置

1.1.4 编译时异常和运行时异常的区别

Java中的异常被分为两大类:编译时异常和运行时异常,也被称为受检异常和非受检异常。

所有的RuntimeException类及其子类被称为运行时异常,其他的异常都是编译时异常。

区别:

编译时异常:必须显式处理,否则程序就会发生错误,无法通过编译。

运行时异常:无需显式处理,一般需要修改代码。

1.1.5 方法覆写中的抛出异常范围

覆写后的抛出异常范围不能更宽泛,只能抛出与父类方法相同的异常或者父类抛出异常的子类,或者不抛出异常。

1.2 try…catch 和 throws 的使用

1.2.1 try…catch

格式:

try{
    可能出现异常的代码;
} catch(异常类名 变量名){
    异常的处理代码;
}

在 try…catch 结构中可以写多个 catch 语句块,但是处理的异常类型从上到下必须使从子类到父类,或者没有继承关系。适用于 try 下面可能会出现多种异常,且每种异常对应的处理方案不同的情况。

用一个 catch 语句块捕捉多个异常时,可以在 catch 的参数列表里写多个异常类型,用 | 隔开。如果类型中有继承关系,直接写父类。

1.2.2 throws

throws 抛出异常,并不处理异常。如果能够处理问题的话,就用 try…catch 直接处理,否则就用 throws 抛出问题,作为提醒机制。对于别人抛给的异常,要么处理,要么继续往上抛。

1.2.3 try…catch 和 throws 的使用场景

一般在服务端即提供方法处使用 throws 抛出异常,而在客户端即调用方法处使用 try…catch 处理异常。

1.2.4 自动关闭资源

从 JDK1.7 开始,可以把打开某个资源的语句写道 try 的参数列表中,这样当语句块执行完毕后,会自动将打开的资源关闭。

*1.2.5 throws 和 throw 的区别

使用 throw 类似于 return ,执行到 throw 某个对象的时候方法结束执行,并返回异常对象。这样,就可以获取异常对象并且进行操作,比如显示异常信息。

throws throw
用在方法声明后面,跟的是异常类名 用在方法体内,跟的是异常对象名
表示抛出异常,由该方法的调用者来处理 表示抛出异常对象
表示出现异常的一种可能性,并不一定会发生这些异常 执行throw一定抛出了某种异常

1.3 finally

1.3.1 finally

finally 是必须执行的语句块,必须和 try 或者 try…catch 搭配使用,只有遇到 System.exit(0) 时才不执行。

1.3.2 try…catch 和 finally 中出现的 return

当 try 或者 catch 语句块中出现 return 时, return 后面的语句会执行,但是不会立刻返回值。在 return 语句执行之后,返回值之前要执行 finally 中的语句。如果 finally 中有 return 语句,就直接在 finally 中执行 return , try…catch 中的 return 后的代码虽然已经执行了,但是不会再返回值。如果 finally 中没有 return 语句,就去将刚才执行了但是还没有返回值的 return 语句进行返回。

比如:
Java|学习|异常_第2张图片

1.4 自定义异常(类)

创建一个类,继承一个已有的异常类。一般需要提供无参构造以及有参构造,用于把异常信息传递给父类。

如果自定义异常是运行时异常类,继承 RuntimeException ,否则一般继承 Exception 即可。

public class 异常类名 extends Exception {
    无参构造
    带参构造//需要调用父类带参构造
}

*自定义异常可以用来传递消息当作提醒机制。

如果对您有帮助,请点赞关注支持我,谢谢!❤
如有错误或者不足之处,敬请指正!❤

你可能感兴趣的:(不易,Java基础知识,java,学习)