异常概述
System.out.println(1/0);System.out.println("呵呵");//这段代码编译是可以通过的,但是运行的时候就出问题了,这种异常被称为运行时异常//JVM帮我们捕获到异常/*Exception in thread "main" java.lang.ArithmeticException: / by zeroat com.xjt.demo01.ExceptDemo.main(ExceptDemo.java:5)这一段报错信息中,前面告诉你出现了xxxx错误.后一段告诉你在哪一行出的错误*/
那么异常是如何产生的呢?
在运行到1/0的时候. 程序会创建一个异常对象对外抛出,然后被JVM捕获. JVM也不知道怎么办. 就丢了出来,最终显示给用户了. 如果没有人处理异常, 程序会被中断. 这也是为什么我们没有看到”呵呵”两个字的原因
- 程序产生错误对象的过程被称为抛异常;
- 获取到这个错误信息. 被称为捕获异常;
异常分类
程序的错误千奇百怪,有的编译的时候就告诉你错了, 有的得运行起来才告诉你错了. 那我们就对异常进行分类.
分类之前, 我们想这么一个事儿,异常是错误对象,那有对象一定有类啊,对吧,异常类都有哪些呢?
异常类的根: Throwable
两个分支: Error和Exception
Exception又分为RuntimeException和其他Exception
RuntimeException表示运行时异常
其他Exception: 不用运行就知道错了
Error: 表示严重的问题 合理的应用程序不应该试图捕获. 程序员一般不好处理.
Error, Exception, RuntimeException的区别:
RuntimeException: 运行时异常, 可以不用主动去处理. 就好比,开车上山, 路上很多的小石子, 不可能把每个小石子都处理掉吧. 等着小石子把轮胎扎破了. 再修就是了
Exception: 异常. 必须要手动处理. 还是开车上山, 路上突然出现一个大石头在前面. 你不把石头拿走. 你上不了山.
Error: 系统错误,这个就比较狠了。你开车上山 山塌了……你是解决不了的 只能避免 怎么避免? 换个山呗区分编译时异常和运行时异常

补充:
编译时异常就是在IDEA等编译器中写的代码有异常时飘红,需要我们手动处理;
运行时异常,如 1/0 编译器不会飘红,但是运行时会报错;
Throwable成员方法
| 方法 | 描述 | 示例 |
|---|---|---|
| public String getMessage() | 返回此throwable的详细消息字符串 | public String getMessage() 返回此throwable的详细消息字符串。 Index 3 out of bounds for length 3 |
| public void printStackTrace() | 将此throwable及其回溯打印到标准错误流。 此方法在错误输出流上打印此Throwable对象的堆栈跟踪,该字段为System.err字段的值。 第一行输出包含此对象的toString()方法的结果。 剩余行表示先前由方法fillInStackTrace()记录的数据。 此信息的格式取决于实现,但以下示例可能被视为典型: | java.lang.ArrayIndexOutOfBoundsException: Index 3 out of bounds for length 3 at com.xjt.demo01.ExceptDemo.method(ExceptDemo.java:26) at com.xjt.demo01.ExceptDemo.main(ExceptDemo.java:20) |
| public String toString() | 返回此throwable的简短描述, 结果是连接: 1)这个对象的类的name 2)”:”(冒号和空格) 3)调用此对象的getMessage()方法的结果 |
java.lang.ArrayIndexOutOfBoundsException: Index 3 out of bounds for length 3 |
异常处理
try…catch…

示例:
public class ExceptDemo {public static void main(String[] args) {System.out.println("开始");method();System.out.println("结束");}public static void method(){try {int[] arr = {11,22,33};System.out.println(arr[3]);}catch (ArrayIndexOutOfBoundsException e){e.printStackTrace();System.out.println(e.getMessage());System.out.println(e.toString());}}}
打印结果:
开始Index 3 out of bounds for length 3java.lang.ArrayIndexOutOfBoundsException: Index 3 out of bounds for length 3结束java.lang.ArrayIndexOutOfBoundsException: Index 3 out of bounds for length 3at com.xjt.demo01.ExceptDemo.method(ExceptDemo.java:4)at com.xjt.demo01.ExceptDemo.main(ExceptDemo.java:10)
try…catch…finally
try {... //监视代码执行过程,一旦返现异常则直接跳转至catch,// 如果没有异常则直接跳转至finally} catch (SomeException e) {... //可选执行的代码块,如果没有任何异常发生则不会执行;//如果发现异常则进行处理或向上抛出。} finally {... //必选执行的代码块,不管是否有异常发生,// 即使发生内存溢出异常也会执行,通常用于处理善后清理工作。}
throws

有时候出现的异常时我们解决不了的,要通过throws 将异常抛出去,由调用者解决(try…catch…)。
IDEA工具使用Alt+Enter快速生成声明抛出异常throws,
它运用于方法声明之上,用于表示当前方法不处理异常,而是提醒该方法的调用者来处理异常
使用格式:
修饰符 返回值类型 方法名(参数) throws 异常类名1,异常类名2 ... { }
throws和throw的区别
自定义异常

示例:
//ScoreException.javapublic class ScoreException extends Exception{public ScoreException() {}public ScoreException(String message) {super(message);}}//MyDefineExcept.javapublic class MyDefineExcept {public void checkScore(int score) throws ScoreException {if(score<0 || score>100){throw new ScoreException("你给的分数有误,0<=score<=100");}else{System.out.println("分数正常");}}public static void main(String[] args) {MyDefineExcept mde = new MyDefineExcept();try {mde.checkScore(120);} catch (ScoreException e) {e.printStackTrace();}}}

