java进阶4-异常

异常体系结构

当出现问题时告诉我们,并把详细消息告诉我们

异常分类

Object下有Throwable(可抛出的)
Throwable下有两个分支:Error(不可处理,直接退出JVM)和Exception(可处理的)
Exception下有两个分支:
Exception的直接子类:编译时异常(要求程序员在编写程序阶段必须预先对这些异常进行处理,如果不处理编译器报错,因此得名编译时异常。)。
RuntimeException:运行时异常。(在编写程序阶段程序员可以预先处理,也可以不管,都行。)

runtimeException

程序本身错误,包括逻辑,语法等

runtimeException 之外

程序外部错误,用try。。catch捕获处理

try{ }…catch(){…}…finaly{…}

try 内放有可能有异常的代码
catch 捕获异常
finaly 无论如何都要执行的代码

public class ExceptionTest10 {
    public static void main(String[] args) {
        FileInputStream fis = null; // 声明位置放到try外面。这样在finally中才能用。
        try {
            // 创建输入流对象
            fis = new FileInputStream("nihao.txt");
            // 开始读文件....

            String s = null;
            // 这里一定会出现空指针异常!
            s.toString();
            System.out.println("hello world!");

            // 流使用完需要关闭,因为流是占用资源的。
            // 即使以上程序出现异常,流也必须要关闭!
            // 放在这里有可能流关不了。
            //fis.close();
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        } catch(IOException e){
            e.printStackTrace();
        } catch(NullPointerException e) {
            e.printStackTrace();
        } finally {
            System.out.println("hello 浩克!");
            // 流的关闭放在这里比较保险。
            // finally中的代码是一定会执行的。
            // 即使try中出现了异常!
            if (fis != null) { // 避免空指针异常!
                try {
                    // close()方法有异常,采用捕捉的方式。
                    fis.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }

        System.out.println("hello kitty!");

    }
}

程序中如果没有异常处理机制,程序在程序运行过程中,告知异常,并停止运行。
try中的代码出现异常,系统抛出异常,try中在出现异常的代码将不会执行,即使捕获到错误永远也不会执行;
catch捕获异常处理,catch中接收的是系统给我们的异常对象,没有适合的catch捕获到异常,程序将会停止运行。只要catch到了异常,处理不处理,程序都将往下执行。

取得异常信息

getMessage()

简单信息

printStackTrace()

异常堆栈信息

finaly和return

遇到return了,先执行finaly再执行return

throws 声明异常

方法后使用throws,声明异常,哪个方法调用这个声明了异常的方法,必须处理,否则依然用throws抛出。

public void doOther() throws Exception{

    }

throw 自己抛出异常

在编程时遇到了自己不想要的情况,创建制造一个异常告知大家出现了问题,需要处理。

public void push(Object obj) throws MyStackOperationException {
        if(index >= elements.length - 1){
            // 改良之前
            //System.out.println("压栈失败,栈已满!");
            //return;

            // 创建异常对象
            //MyStackOperationException e = new MyStackOperationException("压栈失败,栈已满!");
            // 手动将异常抛出去!
            //throw e; //这里捕捉没有意义,自己new一个异常,自己捉,没有意义。栈已满这个信息你需要传递出去。

            // 合并(手动抛出异常!)
            throw new MyStackOperationException("压栈失败,栈已满!");
        }
        // 程序能够走到这里,说明栈没满
        // 向栈中加1个元素,栈帧向上移动一个位置。
        index++;
        elements[index] = obj;
        // 在声明一次:所有的System.out.println()方法执行时,如果输出引用的话,自动调用引用的toString()方法。
        System.out.println("压栈" + obj + "元素成功,栈帧指向" + index);
    }

异常捕获顺序 catch

从大到小

自定义异常

通常继承Exception或RuntimeException,看情况继承哪个

方法覆盖时如果要抛出异常

父类方法有抛出异常的情况,子类在重写时不能抛出比父类中被重写的方法更多的异常,但可以抛出子异常(继承了父异常类的子异常)

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值