Java异常机制

1.

什么是异常?异常机制有什么用?

/*什么是异常?异常机制有什么用?
*以下这个程序执行的过程中发生了不正常的情况,这个不正常的情况叫做:异常
* Java语言是很完善的语言,提供了异常的处理方式,以下程序执行过程出现了不正常的情况
* Java把异常信息输出到控制台,供我们参考。程序员看到异常信息后,可以对程序进行修改,让程序更加的健壮
* 
*
 */
public class Test0 {
    public static void main(String[] args) {
        System.out.println(10/0);
    }
}
/*
Exception in thread "main" java.lang.ArithmeticException: / by zero
	at Test0.main(Test0.java:7)
	这个信息称为异常信息
 */

2.

异常以什么方式存在?

/**
 * Java语言异常是以什么方式存在的
 */
public class Test0 {
    public static void main(String[] args) {
        //异常其实是一个类,可以被实例化成一个异常对象
        NumberFormatException nfe=new NumberFormatException("数字格式化异常");
        System.out.println(nfe);//java.lang.NumberFormatException: 数字格式化异常

        NullPointerException npe=new NullPointerException("空指针异常");
        System.out.println(npe);//java.lang.NullPointerException: 空指针异常
    }
}
/**
 * 通过以上验证可以知道,异常其实是一个异常类实例化出来的对象
 * 可以说明,在上个程序中的除0的错误,其实是Java的虚拟机JVM,自动创建一个数字格式化异常对象出来
 * 把异常信息给打印到控制台
 */

3.异常的处理机制

(1).异常在Java中以类和对象的形式存在。那么异常的继承结构是怎么样的?

Object

Object下有Throwable(可抛出的)

Throwable下有两个分支:Error(不可处理的,直接退出JVM)和Exception(可处理的)

Exception下有两个分支:

Exception的直接子类:编译时异常。(在编写程序阶段的时候预先对这些异常进行处理,否则会报错)

RunTimeException:运行时异常(在编写程序阶段程序员可以预先进行处理,也可以不管)

(2).编译时异常和运行时异常都是发生在运行阶段!!!,编译阶段异常是不会发生的!!!

那为什么叫编译时异常呢,却不在编译阶段发生异常?

是这样的,因为编译时异常必须在编译(编写)阶段进行预先处理,如果不处理编译器会报错,因此得名,

所有异常都是发生在运行阶段的,因为只有在运行的阶段才会new对象。

(3).编译时异常和运行时异常的区别。

编译时异常一般发生的概率比较高

举个例子:

你看到外面下雨了,倾盆大雨的。

你出门之前会预料到:如果不打伞,我可能会生病(生病是一种异常)。

而且这个异常发生的概率还挺高,所以出门之前要拿一把伞。

“拿一把伞”就是对“生病异常”发生之前的一种处理方式

运行时异常一般发生的概率比较低

举个例子:

小明走在大街上,可能会被天上的飞机的轮子砸到(也算是一种异常)

但是这种异常发生的概率比较低。

在出门之前没必要对这些发生概率较低的事件做出预处理

(4)编译时异常有时候也叫做受检异常,受控异常

4.异常的两种处理方式:

/**
 * Java语言对异常的处理包括两种方式:
 * 第一种方式:在方法声明的位置上,使用throws关键字,抛给上一级。
 * 第二种方式:使用try...catch语句进行异常的捕捉。
 * 举个例子:
 * 比如说你是一个公司的一个小职员,因为你的失误损失了1000元,你有两种处理方法。
 * 第一种方式:我把这件事告诉我的领导(异常上抛),谁调用我我就抛给谁,抛给上一级
 * 第二种方式:我自己掏钱把这个钱补上(异常的捕捉),这件事情发生了,谁也不知道因为我给抓住了
 *
 * 注意:Java中异常发生之后,如果一直上抛,最终抛给了main方法,main方法继续向上抛,抛给了
 * 调用者JVM,JVM知道这个异常发生之后,只有一个结果,终止Java程序的运行
 */
public class Test0 {
    public static void main(String[] args) {
        /*
        main()方法中调用了doSome方法
        因为doSome方法声明的位置上有:throws ClassNotFoundException
        我们在调用doSome方法时必须对这种异常进行预先的处理
        如果不处理编译器就会报错
         */
        doSome();//Error:(21, 15) java: 未报告的异常错误java.lang.ClassNotFoundException; 必须对其进行捕获或声明以便抛出

    }
/*
我们来举个例子,doSome方法声明的位置上使用了:throws ClassNotFoundException
这个代码表示doSome()方法在执行的过程当中,有可能会出现ClassNotFoundException异常
叫做类没找到异常。这个异常的直接父类是Exception,所以ClassNotFoundException属于编译时异常
 */
    private static void doSome() throws ClassNotFoundException{

    }
}

那怎么改进呢?

1.继续上抛

//继续上抛,抛给调用者
public class Test1 {
    public static void main(String[] args) throws ClassNotFoundException {
        doSome();
    }

    private static void doSome() throws ClassNotFoundException{
        

    }
}

2.进行捕捉

//自己处理
public class Test1 {
    public static void main(String[] args)  {
        try {
            doSome();
        } catch (ClassNotFoundException e) {
            e.printStackTrace();
        }
    }

    private static void doSome() throws ClassNotFoundException{


    }
}

再举个例子:

import java.io.FileInputStream;

public class Test1 {
    public static void main(String[] args)  {
        doSome();
    }

    private static void doSome() {
        new FileInputStream("D:\\paid.txt");
        //Error:(9, 9) java: 未报告的异常错误java.io.FileNotFoundException; 必须对其进行捕获或声明以便抛出
    }
}
//这里为什么会出现错误,是这样的,因为我们会调用sun公司写的方法,我们可以去看其源代码
//会发现,它传给调用上一级异常,所以程序员要对这个异常进行处理,选择继续上抛或捕捉。
//从这里看到我们发现异常机制也是有好处的,能避免更多的不必要错误,减少了我们的负担

注意:throws后面可以接多个异常,可以抛多个异常,并且还可以抛异常的父异常。

一般不建议在main()方法上使用throws,因为这个异常如果真正的发生了,一定会抛给JVM。JVM只有终止。

异常处理机制的作用就是增强程序的健壮性。怎么能做到,异常发生了也不影响程序的执行。所以

一般main方法的异常建议使用try...catch进行捕捉。main就不要继续上抛了

try...catch中的catch是可以写多个的,但是要注意,多个catch中catch中捕捉的内容要遵循从小到大的顺序

意思就是说catch后面捕捉的内容可以是要捕捉的异常的父异常

 

异常对象最常用的方法:

 获取异常的简单描述信息:
 String msg = exception.getMessage();
 打印异常追踪的堆栈信息:
 exception.printStackTrace();

/**
 * 异常对象有两个非常重要的方法:
 * 获取异常的简单描述信息:
 * String msg = exception.getMessage();
 * 打印异常追踪的堆栈信息:
 * exception.printStackTrace();
 */

public class Test1 {
    public static void main(String[] args)  {
        //创建一个NullPointerException对象
        NullPointerException e=new NullPointerException("空指针异常!!!!!!!");
        //实际上这个方法就是获取异常对象内字符串的内容
        String msg=e.getMessage();
        System.out.println(msg);//空指针异常!!!!!!!

        //打印异常的堆栈信息
        e.printStackTrace();
        //java.lang.NullPointerException: 空指针异常!!!!!!!
        //	at Test1.main(Test1.java:12)
    }
}

 

 

 

 

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值