异常概述

  1. System.out.println(1/0);
  2. System.out.println("呵呵");
  3. //这段代码编译是可以通过的,但是运行的时候就出问题了,这种异常被称为运行时异常
  4. //JVM帮我们捕获到异常
  5. /*Exception in thread "main" java.lang.ArithmeticException: / by zero
  6. at com.xjt.demo01.ExceptDemo.main(ExceptDemo.java:5)
  7. 这一段报错信息中,前面告诉你出现了xxxx错误.
  8. 后一段告诉你在哪一行出的错误
  9. */

那么异常是如何产生的呢?

在运行到1/0的时候. 程序会创建一个异常对象对外抛出,然后被JVM捕获. JVM也不知道怎么办. 就丢了出来,最终显示给用户了. 如果没有人处理异常, 程序会被中断. 这也是为什么我们没有看到”呵呵”两个字的原因

  • 程序产生错误对象的过程被称为抛异常;
  • 获取到这个错误信息. 被称为捕获异常;

    异常分类

    程序的错误千奇百怪,有的编译的时候就告诉你错了, 有的得运行起来才告诉你错了. 那我们就对异常进行分类.
    分类之前, 我们想这么一个事儿,异常是错误对象,那有对象一定有类啊,对吧,异常类都有哪些呢?
    image.png
    异常类的根: Throwable
    两个分支: Error和Exception
    Exception又分为RuntimeException和其他Exception
    RuntimeException表示运行时异常
    其他Exception: 不用运行就知道错了
    Error: 表示严重的问题 合理的应用程序不应该试图捕获. 程序员一般不好处理.
    Error, Exception, RuntimeException的区别:
    RuntimeException: 运行时异常, 可以不用主动去处理. 就好比,开车上山, 路上很多的小石子, 不可能把每个小石子都处理掉吧. 等着小石子把轮胎扎破了. 再修就是了
    Exception: 异常. 必须要手动处理. 还是开车上山, 路上突然出现一个大石头在前面. 你不把石头拿走. 你上不了山.
    Error: 系统错误,这个就比较狠了。你开车上山 山塌了……你是解决不了的 只能避免 怎么避免? 换个山呗

    区分编译时异常和运行时异常

    image.png
    补充:
    编译时异常就是在IDEA等编译器中写的代码有异常时飘红,需要我们手动处理;
    运行时异常,如 1/0 编译器不会飘红,但是运行时会报错;

如何查看某个异常属于编译时异常和运行时异常呢?
image.png
image.png

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…

image.png
示例:

  1. public class ExceptDemo {
  2. public static void main(String[] args) {
  3. System.out.println("开始");
  4. method();
  5. System.out.println("结束");
  6. }
  7. public static void method(){
  8. try {
  9. int[] arr = {11,22,33};
  10. System.out.println(arr[3]);
  11. }catch (ArrayIndexOutOfBoundsException e){
  12. e.printStackTrace();
  13. System.out.println(e.getMessage());
  14. System.out.println(e.toString());
  15. }
  16. }
  17. }

打印结果:

  1. 开始
  2. Index 3 out of bounds for length 3
  3. java.lang.ArrayIndexOutOfBoundsException: Index 3 out of bounds for length 3
  4. 结束
  5. java.lang.ArrayIndexOutOfBoundsException: Index 3 out of bounds for length 3
  6. at com.xjt.demo01.ExceptDemo.method(ExceptDemo.java:4)
  7. at com.xjt.demo01.ExceptDemo.main(ExceptDemo.java:10)

try…catch…finally

  1. try {
  2. ... //监视代码执行过程,一旦返现异常则直接跳转至catch,
  3. // 如果没有异常则直接跳转至finally
  4. } catch (SomeException e) {
  5. ... //可选执行的代码块,如果没有任何异常发生则不会执行;
  6. //如果发现异常则进行处理或向上抛出。
  7. } finally {
  8. ... //必选执行的代码块,不管是否有异常发生,
  9. // 即使发生内存溢出异常也会执行,通常用于处理善后清理工作。
  10. }

throws

image.png
有时候出现的异常时我们解决不了的,要通过throws 将异常抛出去,由调用者解决(try…catch…)。
IDEA工具使用Alt+Enter快速生成声明抛出异常throws,
它运用于方法声明之上,用于表示当前方法不处理异常,而是提醒该方法的调用者来处理异常
使用格式:

  1. 修饰符 返回值类型 方法名(参数) throws 异常类名1,异常类名2 ... { }

image.png

throws和throw的区别

image.png

自定义异常

image.png
示例:

  1. //ScoreException.java
  2. public class ScoreException extends Exception{
  3. public ScoreException() {
  4. }
  5. public ScoreException(String message) {
  6. super(message);
  7. }
  8. }
  9. //MyDefineExcept.java
  10. public class MyDefineExcept {
  11. public void checkScore(int score) throws ScoreException {
  12. if(score<0 || score>100){
  13. throw new ScoreException("你给的分数有误,0<=score<=100");
  14. }else{
  15. System.out.println("分数正常");
  16. }
  17. }
  18. public static void main(String[] args) {
  19. MyDefineExcept mde = new MyDefineExcept();
  20. try {
  21. mde.checkScore(120);
  22. } catch (ScoreException e) {
  23. e.printStackTrace();
  24. }
  25. }
  26. }