java学习day15--异常

典型的错误Error:
        方法递归调用,会发生栈内存溢出错误 StackOverflowError 

        当不断得向堆中创建对象时,会出现OutOfMemoryError

        用空的引用去操作数据,会发生空指针异常

Exception 异常(所有的异常的错误的父类否是Throwable)

        异常是可以捕捉住,然后让程序恢复运行

一.异常的处理

1. 积极处理
    try {
        // 有可能出现异常的代码
    } catch( 异常类型 ) {
         // 捕获异常后的代码
    }
    1. catch能捕捉的异常,要么精确匹配,要么用父类型匹配
    2. 可以用多个catch捕获不同类型的异常
    3. 多个catch块时,子类的catch块要写在前面,父类要写在后面
    4. 1.7 后一个catch块中可以有多个平级的异常

2. 消极处理
     语法: 在方法的声明部分添加 throws 异常类型
     含义: 说明方法在执行时有可能出现的异常
     将异常交给方法的调用者处理
     main 的调用者是jvm,当异常传给jvm时,程序运行就结束了

import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;

public class Exception2 {

    // 积极处理
    /*public static void main(String[] args) {
        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
        try {
            Date date = sdf.parse("yyaa-08-07");
            System.out.println(date);
        } catch (ParseException e) {
            System.out.println("捕获了异常");
        }
    }*/

    // 消极处理,将异常交给方法的调用者处理
    // main 的调用者是jvm,当异常传给jvm时,程序运行就结束了
    public static void main(String[] args) {
        try {
            m1();
        } catch (ParseException e) {
            System.out.println("日期格式不对");
        }
    }

    public static void m1() throws ParseException {
        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");

        Date date = sdf.parse("aaaa-08-07");
        System.out.println(date);
    }
}

二. 从异常的行为分类:
    1.未检查异常(uncheck) 
           RuntimeException或它的子类
           Error和它的子类
    2.检查异常(check)
           Throwable
           Exception以及他们的子类
           检查异常需要强制地配合try-catch或throws一起使用

三.主动抛出异常
           throw new 异常对象();  // 只能是Exception或是Error的子类对象

四. 异常对象的常见方法
     e.getMessage()     获取异常的信息
     e.printStackTrace()    打印异常的跟踪信息

五. 异常的传播
  以方法调用的反方向进行传播

public class Exception4 {

    public static void main(String[] args) {
        System.out.println(1);
        c();
        System.out.println(2);
    }
    public static void c() {
        System.out.println(3);
        b();
        System.out.println(4);
    }
    public static void b() {
        System.out.println(5);
        try {
            a();
        } catch (Exception e) {

        }
        System.out.println(6);
    }
    public static void a() {
        System.out.println(7);
        throw new RuntimeException("最初的异常");
    }
}

六. 自定义异常
    创建异常类
            class MyException extends Exception{ // 检查异常
            }
            class MyException extends RuntimeException { // 未检查异常
            }

七. 异常使用的经验
        1) 不要吞掉异常
        2) 与有返回值的方法连用时要注意:

public class Exception5 {
    public static int test(){
        try {
            Scanner scanner = new Scanner(System.in);
            int n = scanner.nextInt();
            int r = 1/n;
            return r;
        } catch (Exception e ) {
            System.out.println(e.getMessage());
            return -1; // 解决方法1: 在catch也写一个return返回结果
//            throw e; // 解决方法2: 把异常重新抛出
        }
    }

    public static void main(String[] args) {
        int r = test();
        System.out.println(r);
    }
}


        3) 重写方法与异常声明(throws)
                 子类的重写方法,不能抛出比父类更多的异常(检查异常)
                 子类的重写方法,可以不抛出异常
                 若父类和子类方法throws都是未检查异常不用遵守上述约定

         4) 建议将检查异常转换为未检查异常重新抛出
八. finally 
语法:

   try {
      ...
   } catch(Exception e) {

   } finally {
      // 无论出现异常与否,总会被执行的代码
   }


如果try catch 以及finally都出现了return语句, 以finally中的return为准
如果try 有return, 但finally中对返回的变量做了修改, 不会影响return的结果

public class Exception9 {

    public static void main(String[] args) {
        int r = test2();
        System.out.println(r);
    }

    public static int test2() {
        int a = 10;
        try {
            return a; // 返回结果值就已经固定了, finally中的修改不会对其影响了
        } catch (Exception e ) {
            return 50;
        } finally {
            System.out.println("finally...");
            ++a;
        }
    }
}

猜你喜欢

转载自blog.csdn.net/szy2333/article/details/81488350