(十四)异常

异常

异常是java中一套用于处理和反馈问题的机制。
例如:
ArithmeticException —— 算数异常
ArrayIndexOutOfBoundsException —— 数组下标越界异常
NullPointerException —— 空指针异常
ClassPointerException —— 类型转换异常。
NumberFormatException —— 数字格式化异常。
CloneNotSupportedException —— 克隆异常。
ParseException —— 解析异常

1、关键字

throw

在方法内部进行异常声明,抛出一个实际的异常。可以作为单独的语句使用,抛出一个具体的异常对象。

throws

在方法上进行异常声明,用于该方法可能抛出异常。

try

用来包裹可能引发异常的代码。

catch

catch结合try使用,catch代码块中一般是解决异常的语句。用来解决异常的,书写解决异常的办法。JDK1.7之增强了catch语句,可以并列写多个解决异常的catch块。

finally

finally结合try来使用,无论try是否成功,finally代码块无论如何都会执行一次。
经常使用finally来进行善后操作。

坑例

注意:
i++,在return的时候++在后依然不参与。

public static void main(String[] args) {
    System.out.println(m());    //结果为4。
}
public static int m() {
    int i = 3;
    try {
        return i++;
    } finally {
        return i++;
    }
}

无论什么时候,都要保证函数有正确的返回值

@SuppressWarnings("finally")
public static int m() {
    try {
        return 10;
    } catch (Exception e) {
        e.printStackTrace();
//          return 30;
    } finally {
        return 40;
    }
//      return 20;
}

Finally中对数据的操作是否影响到return的结果

public static String m() {
    Person p = new Person();
    try {
        p.setName("张三");
        // return "张三";
        return p.getName();
    } catch (Exception e) {
        p.setName("李四");
        return p.getName();
    } finally {
        p.setName("王五");
    }
}

2、Throwable class(异常的顶级父类)

所有异常和错误的父类。有两个子类:Error、Exception。

构造方法:

Throwable();
Throwable(String message);

重要方法:

printStackTrace();
打印栈轨迹。

1.Error class(错误)

错误,合理的应用程序不应该试图捕获的严重问题。无法处理。
例如:StackOverFlowError

2.Exception class(异常)

异常,合理的应用程序想要捕获的条件。可以处理。
根据异常出现的时期不同分为两类:编译时异常、运行市异常。

编译时异常

在编译时期就已经出现了,由于在编译的时候已经出现了,所以要求必须处理。要么抛出,要么捕获。
编译时异常又叫已检查异常。
CloneNotSupportedException —— 克隆不支持异常。
ParseException

运行时异常(RuntimeException)

编译的时候不报错的,但是在运行的时候出现。由于在编译的时候不报错,所以可以不处理,也可以处理。往往语法没有错误。
运行时异常又叫未检查异常。
例如:
ArithmeticException —— 算术异常。
ArrayIndexOutOfBoundsException —— 数组下标越界异常。
NullPointerException —— 空指针异常。
ClassCastException —— 类型转换异常。
PatternSyntaxException —— 正则格式异常。
NumberFormatException —— 数字格式化异常。

自定义异常

1.让自己创建的异常类继承Exception。默认是编译时异常,运行时异常需要继承RuntimeException。
2.定义异常信息属性。可以自定义,也可以使用super调用父类的异常信息属性。
3.定义构造方法。有参、无参都可以。
4.定义获取异常信息属性的方法。

例一:

@SuppressWarnings("serial")
class FileCannotReadException extends Exception {
public FileCannotReadException() {
}
public FileCannotReadException(String message) {
    super(message);     //调用父类信息属性。
}
}

例二:

@SuppressWarnings("serial")
class PathNotExistException extends Exception {
private String message;     //自定义属性。
public PathNotExistException() {
}

public PathNotExistException(String message) {
    this.message = message;
}
public String getMessage() {
    return message;
}
}

异常捕获的方式

格式
格式一:
try{
}catch(Exception e){

}
格式二:
try{
}catch(Exception e){

}finally{
}

方式

1.如果出现多个异常的话,可以使用多个catch来分别捕获不同的异常来分别处理。
2.如果所有异常的处理的方式都一样,可以捕获一个父类异常对象,做统一处理。
3.如果多个异常需要进行分组处理,同一组异常之间可以使用|分隔不同的异常来做分组的处理。这个方式是从JDK1.7开始。

特点

1.对于运行时异常而言,可以随意抛出随意捕获;对于编译时异常,只有在抛出的时候才能捕获。
2.如果方法声明throws了一个父类异常,那么在处理的时候必须处理这个父类异常。
3.捕获异常的时候需要先捕获子类异常再捕获父类异常。
4.异常对方法的重载没有任何的影响。方法的重载只和方法签名有关,方法名一致而参数列表不同。
5.子类重写的方法的编译时异常必须是父类方法异常的子类或者本身。子类不能抛出比父类更多的异常,范围不能更大,而且指的是编译时异常。对于运行时异常不做限定。

3、针对异常的态度

1、项目在开发阶段,如果捕获了异常,在catch中做打印栈轨迹,抛出一个RuntimeException来停止项目。
2、项目上线了,如果捕获了异常,在catch中做跳转错误页面处理,并记录错误日志。
日志是指项目在运行过程中产生的信息。

你可能感兴趣的:(JavaSE笔记纯干货,java,异常)