ICode9

精准搜索请尝试: 精确搜索
首页 > 编程语言> 文章详细

JavaSE进阶 | 异常处理机制

2022-11-11 14:50:38  阅读:290  来源: 互联网

标签:java 函数 学习 系统 语言 平台 方法 安装 


1、异常概述

1、什么是异常,java提供异常处理机制有什么用? 什么是异常:程序执行过程中的不正常情况;并把异常信息打印输出到控制台 异常的作用:根据异常优化代码,增强程序的健壮性。 2、以下程序执行控制台出现了: Exception in thread "main" java.lang.ArithmeticException: / by zero at com.bjpowernode.javase.exception.ExceptionTest01.main(ExceptionTest01.java:14) 这个信息被我们称为:异常信息;由Java虚拟机(JVM)打印的。
package com.bjpowernode.javase.exception;

public class ExceptionTest01 {
    public static void main(String[] args) {
        int x = 10;
        int y = 0;
        int z = x / y;
        System.out.println(x+"/"+y+"="+z); //java.lang.ArithmeticException: / by zero

        //有了这个异常提示,我们就可以优化代码,增加程序的健壮性
        int x = 10;
        int y = 0;
        if(y==0){
            System.out.println("除数不能为0");
            return;
        }
        int z = x / y;
        System.out.println(x+"/"+y+"="+z);

    }
}

2、java中异常以类和对象的形式存在

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

public class ExceptionTest02 {
    public static void main(String[] args) {
        //1.通过"异常类"实例化(创建)对象
        NumberFormatException nfe = new NumberFormatException("数字格式化异常");
        System.out.println(nfe); //调用toString方法,java.lang.NumberFormatException: 数字格式化异常

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

        //3.
        int a = 10;
        int b = 0;
        // 实际上JVM在执行到此处的时候,会new异常对象:new ArithmeticException("/ by zero");
        // 并且JVM将new的异常对象抛出,打印输出信息到控制台了。
        int c = a / b;//这里出现异常
        System.out.println(a+"/"+b+"="+c);

    }
}

3、UML及starUML

(1)什么是UML?有什么用? UML是一种统一建模语言;一种图标式语言(画图的) UML不是只有java中使用。只要是面向对象的编程语言,都有UML。 在UML图中可以描述类和类之间的关系,程序执行的流程,对象的状态等。 (2)异常在java中以类和对象的形式存在。那么异常的继承结构是怎样的? 我们可以使用UML图来描述一下继承结构。 例如:Object Object下有Throwable(可抛出的) Throwable下有两个分支:Error(不可处理,直接退出JVM)和Exception(可处理的) (3)重点 Exception的直接子类:编译时异常(要求程序员在编写程序阶段必须预先对这些异常进行处理,如果不处理编译器报错,因此得名编译时异常) RuntimeException:运行时异常(在编写程序阶段程序员可以预先处理,也可以不管,都行)

异常的继承结构图

4、编译时异常和运行时异常区别

1、编译时异常和运行时异常,都是发生在运行阶段。编译阶段,异常是不会发生的。 (1)编译时异常因为什么而得名? 因为编译时异常必须在编译(编写)阶段预先处理,如果不处理编译器报错,因此得名。 所有异常都是在运行阶段发生的;因为只有程序运行阶段才可以new对象;因为异常的发生就是new异常对象。 2、编译时异常和运行时异常的区别? (1)编译时异常一般发生的概率比较高。 例如:你看到外面下雨了,你出门之前会预料到:如果不打伞,可能会生病(生病是一种异常)。而且这个异常发生的概率很高,所以我们出门之前要拿一把伞。 “拿一把伞”就是对“生病异常”发生之前的一种处理方式。 对于一些发生概率较高的异常,需要在运行之前对其进行预处理。 (2)运行时异常一般发生的概率比较低。 例如:小明走在大街上,可能会被天上的飞机轮子砸到;被飞机轮子砸到也算一种异常。但是这种异常发生概率较低。 在出门之前你没必要提前对这种发生概率较低的异常进行预处理。假设你在出门之前,你把能够发生的异常都预先处理,你这个人会更加的安全,但是你这个人活的很累。 3、假设java中没有对异常进行划分,没有分为:编译时异常和运行时异常? 所有的异常都需要在编写程序阶段对其进行预处理,将是怎样的效果呢?首先,如果这样的话,程序肯定是绝对的安全的;但是程序员编写程序太累,代码到处都是处理异常的代码。并且不太符合实际。 4、编译时异常又称作:受检异常(CheckedException)、受控异常 运行时异常还有其它名字:未受检异常(UnCheckedException)、非受控异常 5、Java语言中对异常的处理包括两种方式: 第一种方式:在方法声明的位置上,使用throws关键字,抛给上一级。谁调用我,我就抛给谁。抛给上一级。 第二种方式:使用try..catch语句进行异常的捕捉。这件事发生了,谁也不知道,因为我给抓住了。 例如:我是某集团的一个销售员,因为我的失误,导致公司损失了1000元, “损失1000元”这可以看做是一个异常发生了。我有两种处理方式, (1)我把这件事告诉我的领导【异常上抛】 (2)我自己掏腰包把这个钱补上【异常的捕捉】 思考:异常发生之后,如果我选择了上抛,抛给了我的调用者,调用者需要对这个异常继续处理,那么调用者处理这个异常同样有两种处理方式。 6、注意:Java中异常发生之后如果一直上抛,最终抛给了main方法,main方法继续向上抛,抛给了调用者JVM,JVM知道这个异常发生,只有一个结果。终止java程序的执行!

5、运行时异常可以不处理

(1)程序执行到此处发生了ArithmeticException异常, 底层new了一个ArithmeticException异常对象, 然后抛出了,由于是main方法调用了100 / 0, 所以这个异常ArithmeticException抛给了main方法, main方法没有处理,将这个异常自动抛给了JVM;JVM最终终止程序的执行。 (2)ArithmeticException 继承 RuntimeException,属于运行时异常。 在编写程序阶段不需要对这种异常进行预先的处理。
package com.bjpowernode.javase.exception;

public class ExceptionTest03 {
    public static void main(String[] args) {
        
        //1.这里为什么不进行异常处理?属于运行时异常
        System.out.println(100 / 0);

        //2.这里的HelloWorld没有输出,没有执行
        System.out.println("Hello World!");

    }
}

6、方法声明位置上使用throws

以下代码报错的原因是什么? 答:因为doSome()方法声明位置上使用了:throws ClassNotFoundException而ClassNotFoundException是编译时异常。必须编写代码时处理,没有处理编译器报错。
package com.bjpowernode.javase.exception;

public class ExceptionTest04 {
    public static void main(String[] args) {
        // main方法中调用doSome()方法
        // 因为doSome()方法声明位置上有:throws ClassNotFoundException
        // 我们在调用doSome()方法的时候必须对这种异常进行预先的处理。
        // 如果不处理,编译器就报错。
        //编译器报错信息: Unhandled exception: java.lang.ClassNotFoundException
        //doSome(); //err
    }

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

标签:java,函数,学习,系统,语言,平台,方法,安装,
来源:

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有