前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Java基础-异常机制

Java基础-异常机制

作者头像
cwl_java
发布2019-11-12 13:07:30
4630
发布2019-11-12 13:07:30
举报
文章被收录于专栏:cwl_Javacwl_Javacwl_Java

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。

本文链接:https://blog.csdn.net/weixin_42528266/article/details/102972118

异常( Exception 也称例外)就是在程序的运行过程中所发生的不正常的事件,它会中 断正在运行的程序

  • 所需文件找不到
  • 网络连接不通或中断
  • 算术运算错 (被零除…)
  • 数组下标越界
  • 装载一个不存在的类或者对null对象操作
  • 类型转换异常 ……

当Java程序出现以上的异常时,就会在所处的方法中产生一个异常对象。这个异常对象 包括异常的类型,异常出现时程序的运行状态以及对该异常的详细描述。

在这里插入图片描述
在这里插入图片描述
try-catch
  • 情况1:try块中代码没有出现异常
    • 不执行catch块代码,执行catch块后边的代码
  • 情况2:try块中代码出现异常,catch中异常类型匹配(相同或者父类)
    • 执行catch块代码,执行catch块后边的代码
  • 情况3:try块中代码出现异常, catch中异常类型不匹配
    • 不执行catch块代码,不执行catch块后边的代码,程序会中断运行
  • 注意
    • 出现异常后,Java会生成相应的异常对象,Java系统,寻找匹配的catch块,找到后将异常对象付给catch块异 常参数
    • 出现异常后,try块中尚未执行的语句不会执行
    • 出现异常后并处理后,catch块后面的语句还会执行
catch块中如何处理异常
  • 输出用户自定义异常信息
System.err.println("除数不能为零。");
System.err.println("被除数和除数必须是整数。");
  • 调用异常对象的方法输出异常信息
toString ( )方法,显示异常的类名和产生异常的原因
void printStackTrace() 输出异常的堆栈信息
String getMessage()返回异常信息描述字符串,是printStackTrace()输出信息的一部分
  • 继续向上抛出异常
    • throw e
常见的异常类型
在这里插入图片描述
在这里插入图片描述
try-catch-finally
  • 在try-catch块后加入finally块,可以确保无论是否发生异常,finally块中的代码总能被执行
    • 无异常 try-finally
    • 有异常 try-catch-finally
  • 通常在finally中关闭程序块已打开的资源,比如:文件流、释放数据库连接等。
  • finally块中语句不执行的唯一情况
    • 异常处理代码中执行System.exit(1)退出Java虚拟机
  • Finally块的具体执行过程
    • 执行try或catch中代码
    • 遇到return/throw,先执行finally中语句块
    • 执行return/throw
多重catch
  • 一段代码可能会引发多种类型的异常
  • 当引发异常时,会按顺序来查看每个 catch 语句,并执行第一个与异常类型匹配的catch语句
  • 执行其中一条 catch 语句后,其后 catch 语句将被忽略
  • 在安排catch语句的顺序时,首先应该捕获最特殊的异常, 然后再逐渐一般化,即先子类后父类

异常分类

Error
  • Error类层次描述了Java运行时系统内部错误和资源耗尽错误,一般指与JVM或动态加载等相关的 问题,如虚拟机错误,动态链接失败,系统崩溃等。
  • 这类错误是我们无法控制的,同时也是非常罕见的错误。所以在编程中,不去处理这类错误。
  • 打开JDK包:java.lang.Error,查看他的所有子类

注:我们不需要管理Error!

Exception
  • 所有异常类的父类,其子类对应了各种各样可能出现的异常事件。
  • Exception分类
    • 运行时异常Runtime Exception(unchecked Exception)
    • 可不必对其处理,系统自动检测处理
    • 一类特殊的异常,如被 0 除、数组下标超范围等,其产生比较频繁,处理麻烦,如果显式的声 明或捕获将会对程序可读性和运行效率影响很大
    • 检查异常 Checked Exception
    • 必须捕获进行处理,否则会出现编译错误

注意:只有Java提供了Checked异常,体现了Java的严谨性,提高了Java的健壮性。同时也是一个 备受争议的问题。

异常处理

声明异常throws
  • 当Checked Exception产生时,不一定立刻处理它,可以再把异常Throws出去
  • 如果一个方法抛出多个已检查异常,就必须在方法的首部列出所有的异常,之间以逗号隔开
  • 子类声明的异常范围不能超过父类声明范围
    • 父类没有声明异常,子类也不能
    • 不可抛出原有方法抛出异常类的父类或上层类
手动抛出异常throw
  • Java异常类对象除在程序执行过程中出现异常时由系统自动生成并抛出,也可根据需要手工创建 并抛出。
  • 在捕获一个异常前,必须有一段代码先生成异常对象并把它抛出。这个过程我们可以手工做, 也可以由JRE来实现,但是他们调用的都是throw子句。
  • 注意抛出运行时异常和Checked异常的区别
    • 抛出Checked异常,该throw语句要么处于try块中,要么方法签名中石油throws抛出
    • 抛出运行时异常,没有以上要求
自定义异常
  • 在程序中,可能会遇到任何标准异常类都没有充分的描述清楚的问题,这种情况下可以 创建自己的异常类
  • 从Exception类或者它的子类派生一个子类即可
  • 习惯上,定义的类应该包含2个构造器:一个是默认构造器,另一个是带有详细信息的 构造器
代码示例
package com.cwl.base.day05.exception;

import java.io.File;
import java.io.FileNotFoundException;

/**
 * @program: java_base
 * @description:
 * @author: ChenWenLong
 * @create: 2019-11-08 15:42
 **/
public class TestException {

    public static void main(String[] args) {
//		int i = 1/0;
//		Computer c  = null;
//		if(c!=null){
//			c.start();   //对象是null,调用了对象方法或属性!
//		}

//		String str = "1234abcf";
//		Integer i = new Integer(str);

//		try{
//			Thread.sleep(3000);
//		}catch(Exception e){
//			e.printStackTrace();
//		}finally{
//			System.out.println("aaa");
//		}

        File f = new File("c:/tt.txt");
        if (!f.exists())  {
            try {
                throw new FileNotFoundException("File can't be found!");
            } catch (FileNotFoundException e) {
                e.printStackTrace();
            }
        }


    }
}

class Computer{
    void start(){
        System.out.println("计算机启动!");
    }
}
package com.cwl.base.day05.exception;

/**
 * @program: java_base
 * @description:
 * @author: ChenWenLong
 * @create: 2019-11-08 15:43
 **/
public class MyException extends Exception {

    public MyException(){

    }

    public MyException(String message){
        super(message);
    }

}

class TestMyException{
    void test()throws MyException{
        ///
    }

    public static void main(String[] args) {
        try {
            new TestMyException().test();
        } catch (MyException e) {
            e.printStackTrace();
        }
    }
}
本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2019-11-08 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • try-catch
  • catch块中如何处理异常
  • 常见的异常类型
  • try-catch-finally
  • 多重catch
  • 异常分类
    • Error
      • Exception
      • 异常处理
        • 声明异常throws
          • 手动抛出异常throw
            • 自定义异常
              • 代码示例
              领券
              问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档