异常概述
异常:就是程序出现了不正常的情况,程序在执行过程中,出现的非正常的情况,最终回导致JVM的非正常停止。
注意:语法作物不再异常体系中
异常体系
Error:严重问题,通过代码无法处理
比如:内存溢出
Exception:称为异常类,它表示程序本身可以处理的问题
- RuntimeException及其子类:运行时异常。(空指针异常,数组索引越界异常)
- 除RuntimeException之外所有的异常:编译期必须处理的,否则程序不能通过编译(日期格式化异常)
运行时异常和编译时异常
JVM的默认处理方案
如果程序出了问题,我们没有做任何处理,最终JVM会做出默认的处理
- 把异常的名称,异常原因及异常出现的位置等信息输出在了控制台
-
异常处理方式——throws
格式:
throws 异常类名;
注意:这个格式时写在方法的定义处,表示声明一个异常 告诉调用者,你调用我,有可能会出现这样的异常
- 如果方法中没有出现异常,那么正常运行
- 如果方法中出现了异常,那么将这个异常交给了调用者处理。
编译时异常因为在编译时就会检查,所以必须要写在方法后面进行声明
运行时异常因为在运行时才会发生,所以在方法后面可以不写
抛出异常对象——throw
格式:throw new 异常();
注意:这个格式是在方法内的,表示当前代码手动抛出了一个异常,下面的代码不用再执行了。
throws
- 用在方法声明后面,跟的是异常类名
- 表示声明异常,调用该方法有可能会出现这样的异常
throw
- 在方法中,当传递的参数有误,没有继续运行下去的意义了,则采取抛出处理,表示让该方法结束运行。
- 告诉调用者方法中出现了问题。
异常处理方式——try…catch…
格式: ```java try{ 可能出现异常的代码; }catch(异常类名 变量名){ 异常的处理代码; }
好处:可以让程序继续往下执行。<br />快捷键:option + command + t,快速创建try...catch...语句
<a name="giPOs"></a>
## try...catch...常见问题
1.如果try中没有遇到问题,怎么执行?<br />答:会把try中所有的代码全部执行完毕,不会执行catch里面的代码<br />2.如果try中遇到了问题,那么try下面的代码还会执行么?<br />答:那么直接跳转到对应的catch语句中,try下面的代码就不会执行了,当catch里面语句全部执行完毕,表示整个体系全部执行完毕,继续执行下面的代码。<br />3.如果出现的问题没有被捕获,那么程序如何运行?<br />答:那么try...catch...就相当于没有写,那么也就是自己没有处理,默认会交代虚拟机处理。<br />4.同时有可能出现多个异常怎么处理?<br />答:出现多个异常,那么就写多个catch就可以了。<br />注意点:如果多个异常之间存在父子关系,那么父类一定要写在下面。
<a name="LSoDR"></a>
## Throwable的成员方法
| **方法名** | **说明** |
| --- | --- |
| `public String getMessage()` | 返回此throwable的详细消息字符串 |
| `public String toString()` | 返回此可抛出的简短描述 |
| `public void printStackTrace()` | 把异常的错误信息输出在控制台 |
<a name="i9e9t"></a>
## 自定义异常
```java
class 自定义异常类名 extends RunTimeException{
无参构造方法;
带参构造方法;
}
目的:为了见名知意,所以自定义异常类名要描述该异常。