7. 异常

异常

java.lang.Throwable 是 Java 语言中所有错误或异常的超类。

1. Error

Error 是 Throwable的子类,用于指示合理的应用程序不应该试图捕获的严重问题。例如 VirtualMachineError

2. Exception

Exception可以分为两大类,运行时异常和编译时异常。运行时异常包括 RuntimeException 和它的子类。编译时异常是除了 RuntimeException 之外的异常。出编译时异常都会要求加上 try…catch或者 throws

异常的处理

finally 和 return

当 finally 里面有 return,那么结果就是 finally 中的
当 finally 里面没有 return,那么结果就是返回 try 或者 catch 中

package com.itguigu.com;

public class TestFinallyReturn {
    public static void main(String[] args) {
        System.out.println(getNum());  // 40
        System.out.println(getNum2()); // 20
    }

    public static int getNum() {
        int i=10;

        try {
            i=20;
            return i;
        } catch (Exception e) {
            i=30;
            return i;
        }finally {
            i=40;
            return i;
        }
    }

    public static int getNum2(){
        int i=10;

        try {
            i=20;
            return i;
        } catch (Exception e) {
            i=30;
            return i;
        }finally {
            i=40;
        }
    }
}

throws

用在声明一个方法的时候,明确声明该方法可能抛出 xx 异常。说明该异常在该方法中没有 try…catch,由调用者处理。

package com.itguigu.com;

public class TestThrows {
    public static void main(String[] args) {
        try {
            divide(10, 2);
        } catch (ArithmeticException e) {
            e.printStackTrace();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    // throws 后面可以接多个异常,顺序无所谓。一般如果父类有异常,那么子类异常就不用写了
    public static int divide(int a, int b) throws ArithmeticException, Exception{
        return a/b;
    }
}

throws 与方法重写:子类抛出的异常类型应该小于等于父类抛出的异常类型。

方法重写的要求学习完毕(两同两小一大)

  1. 方法名:必须相同

  2. 行参列表:必须相同

  3. 返回值类型

    基本数据类型和 void:必须相同

    引用数据类型:小于等于父类

  4. 权限修饰符:大于等于父类

  5. 抛出的异常列表类型:小于等于父类

throw

throw 的作用是用于主动抛出异常。如果没有 try…catch,他可以代替 return 结束当前方法。但是无法返回正常的结果。只能带回 “异常对象”。

package com.itguigu.com;

public class TestThorw {
    public static void main(String[] args) {
        try {
            test();
        } catch (Exception e) {
            System.out.println(e.getMessage()); // 获取抛出的错误信息
            e.printStackTrace(); // 打印异常的堆栈信息
        }
    }

    public static void test() throws Exception {
        throw new Exception("运行时异常");
    }
}

自定义异常

自定义异常的要求:

  1. 要将一个变成 “异常类型”,那么这个类必须继承 Throwable,或者继承它的子类。

  2. 自定义异常对象只能由 throw 语句手动抛出。然后可以加上 try…catch 或者使用 thrors 抛给上层。

  3. 建议自定义异常,添加两个装饰器。

    3.1 无参构造尽量保留

    3.2 有参构造。异常类型(String message),可以为 message 赋值。

package com.itguigu.com;

public class TestDefineException {
    public static void main(String[] args) {
        try {
            test();
        } catch (UsernameOrPassword e) {
            System.out.println(e.getMessage());
        }
    }

    public static void test() throws UsernameOrPassword {
        // 手动抛出自定义异常
        throw new UsernameOrPassword("用户名或密码错误");
    }
}

// 定义一个异常,继承自 Throwable 的子类 Exception
class UsernameOrPassword extends Exception{
    public UsernameOrPassword() {
        super();
    }

    public UsernameOrPassword(String message) {
        super(message);
    }    
}

 上一篇
8. String 8. String
汉字进行 UTF-8 编码,每个汉字占3个字节。进行 GDK 编码,每个汉字占2个字节。ISO-8859-1 则占一个字节。 为什么要有包装类因为 Java 的某些特性和 API,例如泛型和集合,不支持基本数据类型,所以必须把基本数据类型转
2019-10-24
下一篇 
6. 枚举 6. 枚举
枚举列举,罗列。代表一系列的类型,这些类型有一个非常的明显的特征,就是他们的对象是有限的几个。枚举是 JDK 1.5 之后才有的。枚举类型也是类,原来用 class 声明类,现在用 enum 来声明枚举。 说明: 枚举类型的构造器一定是私
2019-10-20
  目录