Java中的异常
https://www.yqxbc.com win10系统 发布时间:2017-05-22 00:00 来源:一起学编程 浏览:加载中

Java中的异常

异常与错误的异同

异常:异常是指程序在运行过程中出现的非正常的事件流,它会导致程序的中断,可能可以使用程序恢复。

错误:错误是不可以被控制也不可以被解决的。

它们都是Throwable的子类

异常的分类

运行时异常(RuntimeException)

运行时异常抛出后可不处理,将由JVM在运行期抛出

常见运行时异常:NullPointerExceptionIndexOutOfBoundException,ClassCastException,ArithmeticException.

编译期异常(CheckedException)

编译期异常一旦抛出就要强制处理

常见编译期异常:IOException,SqlException.

Java异常体系 
这里写图片描述

try/catch/finally

用于抓取异常并处理异常

用法

try{
  //可能会发生异常的代码
}catch(异常类型 引用名){
  //处理异常代码
}finally{
  //必须执行的代码
}

其中,try用于检测块中可能出现异常的代码,eatch用于抓取try中的异常并处理,eatch可以写多个,finally用于不管程序是否异常都将执行(不执行的方法:System.exit(),关闭虚拟机)。

return/finally

用于终止代码的执行,但是由于finally无论如何都会执行,所以return不能阻止finally的执行。

throw/throws

throw用于在方法中抛出异常,如:

throw new IOException();

throws用于方法的签名上,指出方法引发的异常,如:

private static void a() throws IOException{
throw new IOException();
}

层层抛出异常与自定义异常

运行时异常抛出后可不处理,但是编译期异常抛出后就必须强制处理,也可以在方法签名中指出,由调用方法者进行处理

自定义异常

异常可自己定义,若继承RuntimeException,则为运行时异常,若继承Exception,则为编译期异常,自定义异常需要覆写父类的构造函数,例:

package com.chinasofti.exception;

public class ComputerException extends Exception{

    public ComputerException() {
        super();
    }
    public ComputerException(String message, Throwable cause, boolean enableSuppression, boolean writableStackTrace) {
        super(message, cause, enableSuppression, writableStackTrace);
    }
    public ComputerException(String message, Throwable cause) {
        super(message, cause);
    }
    public ComputerException(String message) {
        super(message);
    }
    public ComputerException(Throwable cause) {
        super(cause);
    }   
}

而自定义的异常又可以继承自定义的异常,如:

package com.chinasofti.exception;

public class GameException extends ComputerException{

    public GameException() {
        super();
    }
    public GameException(String message, Throwable cause, boolean enableSuppression, boolean writableStackTrace) {
        super(message, cause, enableSuppression, writableStackTrace);
    }
    public GameException(String message, Throwable cause) {
        super(message, cause);
    }
    public GameException(String message) {
        super(message);
    }
    public GameException(Throwable cause) {
        super(cause);
    }
}

层层抛出异常

编译期异常如果抛出后可以在方法签名中指出从而由调用方法者处理,而层层抛出异常就是调用方法者在catch中再次用throw抛出异常,例:

package com.chinasofti.exception;

public class App {
    public static void main(String[] args) {
        try {
        lol();
        } catch(GameException e) {
            e.printStackTrace();
        }
    }
    private static void lol() throws GameException{
        try {
            computer();
        } catch (ComputerException e) {
            throw new GameException("游戏异常");
        }
    }
    private static void computer () throws ComputerException{
        throw new ComputerException("计算机异常");
    }
}