异常的基本概念

异常

1、什么是异常, java提供异常处理机制有什么用?
以下程序执行过程中发生了不正常的情况,而这种不正常的情况叫做:异常
java语言是很完善的语言,提供了异常的处理方式,以下程序执行过程中出现了不正常情况,
java把该异常信息打印输出到控制台,供程序员参考。程序员看到异常信息之后,可以对
程序进行修改,让程序更加的健壮。

什么是异常:程序执行过程中的不正常情况。
异常的作用:扩强程序的健壮性。
2、以下程序执行控制台出现了:
Exception in thread “main” java. lang . ArithmeticException: / by zero
at com. bjpowernode . javase. exception. ExceptionTest01. main(ExceptionTest01. java:14)
这个信息被我们称为:异常信息。这个信息是JVM打印的。

public class ExceptionTest01 {
    public static void main(String[] args) {
/*        int a = 10;
        int b = 0;
        int c = a/b;
        //实际上jvm走到此处会new一个异常对象 new ArithmeticException​(String s)
        //并且jvm将new的异常对象抛出,打印输出信息控制台
        System.out.println(a + "/" + b + "=" + c);*/

/*        Exception in thread "main" java.lang.ArithmeticException: / by zero
        at Exception.ExceptionTest01.main(ExceptionTest01.java:11)
        这个信息被我们称为:异常信息。这个信息是JVM打印的*/

        int a = 10;
        int b = 0;
        if (b==0){
            System.out.println("除数不能为0");
            return;
        }
        int c = a / b;
        System.out.println(a + "/" + b + "=" + c);

    }
}

java语言中异常是以什么形式存在的呢?
1、异常在java中以类的形式存在,每一个异常类都可以创建异常对象。
2、异常对应的现实生活中是怎样的?
火灾(异常类) :
2008年8月8日,小明家着火了(异常对象)
2008年8月9日,小刚家着火了(异常对象)
2008年9月8日,小红家着火了(异常对象)
类是:模板。
对象是:实际存在的个体。
钱包丢了(异常类) :
2008年1月8日,小明的钱包丢了(异常对象)
2008年1月9日,小芳的钱包丢了(异常对象)

异常是通过实例化对象创建出来并且抛出到控制台上

public class ExceptionTest02 {
    public static void main(String[] args) {
        //通过异常类 实例化 异常对象

        NumberFormatException numberFormatException = new NumberFormatException("数字格式化异常");
        System.out.println(numberFormatException);
        //java.lang.NumberFormatException: 数字格式化异常

        NullPointerException nullPointerException = new NullPointerException("空指针异常发生");
        System.out.println(nullPointerException);
        //java.lang.NullPointerException: 空指针异常发生

    }
}

java的异 常处理机制

1.1、异常在java中以类和对象的形式存在。那么异常的继承结构是怎样的?
我们可以使用UM图来描述一下 继承结构.
画UM图有很多工具,例如: Rational Rose (收费的)、starUM等… …
object
object下有Throwable (可抛出的)
Throwable下有两个分支: Error (不可处理,直接退出JVM)和Exception (可处理的)
Exception’下有两个分支:
Exception的直接子类:编译时异常(要求程序员在编写程序阶段必须预先对这些异常
RuntimeException:运行时异常
(在编写程序阶段程序员可以预先处理,也可以不管)

1.2、编译时异常和运行时异常,都是发生在运行阶段。编译阶段异常是不会发生的。
编译时异常因为什么而得名?
因为编译时异常必须在编译(编写)阶段预先处理,如果不处理编译器报错,因此得名。
所有异常都是在运行阶段发生的。因为只有程序运行阶段才可以new对象.
因为异常的发生就是new异常对象。
编译时异常一般发生的概率比较高。
举个例子:
你看到外面下雨了,倾盆大雨的。你出门之前会预料到:如果不打伞,我可能会生病(生病是一-种异常)。而且这个异常发生的概率很高,所以我们出门之前要拿一把伞。"拿一把伞就是对“生病异常"发生之前的一种处理方式。对于一-些发生概率较高的异常,需要在运行之前对其进行预处理。
运行时异常一般发生的概率比较低。
举个例子:
小明走在大街上,可能会被天上的飞机轮子砸到。被飞机轮子砸到也算一种异常。但是这种异常发生概率较低。在出门之前你没必要提前对这种发生概率较低的异常进行预处理。如果你预处理这种异常,你将活的很累。假设你在出门之前,你把能够发生的异常都预先处理,你这个人会更加的安全,但是你这个人活的很累。

假设java中没有对异常进行划分,没有分为:编译时异常和运行时异常,
所有的异常都需要在编写程序阶段对其进行预处理,将是怎样的效果呢?
首先,如果这样的话,程序肯定是绝对的安全的。
但是程序员编写程序太累,代码到处都是处理异常
1.4、编译时异常还有其他名字:
受检异常: CheckedException
受控异常
1.5、运行时异常还有其它名字:
未受检异常: UnCheckedException
非受控异常
1.6、再次强调:所有异常都是发生在运行阶段的。
1.7、Java语言中对异常的处理包括两种方式:
第一种方式:在方法声明的位置上,使用throws关键字,抛给.上一级。
谁调用我,我就抛给谁。抛给 上一级。
第二种方式:使用try catch语句进行异常的捕捉。
这件事发生了,谁也不知道,因为我给抓住了。
举个例子:
我是某集团的一个销售员,因为我的失误,导致公司损失了1000元,
损失1000元"这可以看做是一一个异常发生了。我有两种处理方式,
第一种方式:我把这件事告诉我的领导[异常上抛]
第二种方式:我自己掏腰包把这个钱补上。[异 常的捕捉]
张三–>李四—>王五–> CEO
思考:
异常发生之后,如果我选择了,上抛,抛给了我的调用者,调用者需要
对这个异常继续处理,那么调用者处理这个异常同样有两种处理方式。
1.8、注意: Java中异常发生之后如果一直上抛,最终抛给了main方法,main方法继续向上抛,抛给了调用者JVM, JVM知道这个 异常发生,只有一 一个结果。终止java程序的执行.

例如

/*
以下代码报错的原因是什么?
因为doSome()方法声明位置上使用了: throws ClassNotFoundException
而Clas sNotFoundException是编译时异常。必须编写代码时处理,没有处理
编译器报错。
*/
public class ExceptionTest04 {
    public static void main(String[] args) {
        // main方法中调用doSome()方法
        //因为doSome()方法声明位置上有: throws ClassNotFoundException
        //我们在调用doSome()方法的时候必须对这种异常进行预先的处理。
        //如果不处理,编译器就报错。
        //编译器报错信息: Unhandled exception: java. lang. Clas sNotFoundException
        doseme();   //报错位置
    }

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

        System.out.println("dosome");
    }
}

修改有两种方法 一种向上抛出,一种 try catch

public class ExpeceptionTest05 {	
	//此程序用了两个main方法,是错误的,只是方便解释两种方法
        //抛出给上一级jvm
        public static void main(String[] args) throws ClassNotFoundException {
            doseme();
        }
        //异常捕捉
        public static void main(String[] args)  {
            try {
                doseme();
            } catch (ClassNotFoundException e) {
                e.printStackTrace();
            }
        }

        public  static void doseme() throws ClassNotFoundException{
            System.out.println("dosome");
    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值