JAVA异常处理(三种异常处理机制)_java异常处理的三种方法-程序员宅基地

技术标签: java  JAVA基础知识  intellij-idea  java-ee  

目录

前言

一、异常体系

二、异常示例

1.运行时异常

2.编译时异常

三、异常处理

1.默认异常处理

2.异常处理1 & throws

3.异常处理2  & try . . . catch . . .

4.异常处理3 & 前面两者的结合

5.运行时异常的处理

四、自定义异常 

自定义编译时异常

总结


前言

异常是程序在编译执行的过程中可能出现的问题,语法错误不算在异常体系

提前处理异常,程序会更加安全


一、异常体系

Error:

        系统级别问题、JVM退出等,代码无法控制

Exception:

        Java.lang包下,称为异常类,它表示程序本身可以处理的问题

        Runtime Exception及其子类:

                运行时异常,编译阶段不会报错(如空指针,数组索引越界异常)

        除Runtime Exception之外所有异常:

                编译时异常,编译期必须处理的,否则程序不能通过编译(如日期格式化)

  


二、异常示例

1.运行时异常

编译阶段不会报错,运行时才会提示错误

public static void main(String[] args) {

    //数组索引越界异常:ArrayIndexOutOfBoundsException
    int[] arr = {1, 2, 3};
    System.out.println(arr[3]);

    //空指针异常:NullPointerException,直接输出没问题,但是调用空指针的变量功能就会报错
    String name = null;
    System.out.println(name);          //可以输出
    System.out.println(name.length()); //报错

    //类型转换异常:ClassCastException
    Object o = 12;
    String s = (String) o;

    //数学操作异常:ArithmeticException
    int c = 10/0;

    //数字转换异常:NumberFormatException
    String number = "a2";
    Integer i = Integer.valueOf(number);
}

2.编译时异常

编译阶段就报错,必须要处理

如下图,日期解析异常 


三、异常处理

1.默认异常处理

通常我们不对代码可能出现的异常进行处理,Java就会默认处理我们的异常,如下:

默认会在出现异常的代码处,自动创建一个异常对象:ArithmeticException

异常会从方法中出现的抛给调用者,调用者抛给JVM虚拟机

虚拟机收到异常对象后,先在控制台输出异常栈信息数据

直接从出现异常的地方关闭程序

2.异常处理1 & throws

添加throws ***到方法签名

规范写法throws Exception

将方法内部出现的异常抛给本方法调用者

throws仅仅是将函数中可能出现的异常向调用者声明,而自己则不具体处理。

        throws声明:如果一个方法内部的代码会抛出检查异常(checked exception),而方法自己又没有完全处理掉或并不能确定如何处理这种异常,则javac保证你必须在方法的签名上使用throws关键字声明这些可能抛出的异常,表明该方法将不对这些异常进行处理,而由该方法的调用者负责处理,否则编译不通过。

public static void main(String[] args) throws ParseException {
    parseTime("2015-10-10 10:10:10");
    }

    public static void parseTime(String data) throws ParseException {

        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-mm-dd HH:mm:ss");
        Date d = sdf.parse(data);
    }

3.异常处理2  & try . . . catch . . .

监视捕获异常,用在方法内部,可以将方法内部出现的异常直接捕获处理

发生异常的方法自己独自完成异常处理,程序还能继续往下执行

public static void main(String[] args)  {
parseTime("2015-10-10 10:10:10");
}

public static void parseTime(String data)  {

    try {
        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-mm-dd HH:mm:ss");
        Date d = sdf.parse(data);
    } catch (ParseException e) {
        throw new RuntimeException(e);
    }
}

4.异常处理3 & 前面两者的结合

 方法将异常通过throws抛给调用者,调用者收到异常后捕获处理。

public static void main(String[] args)  {
    try {
        parseTime("2015-10-10 10:10:10");
        System.out.println("成功");
    } catch (ParseException e) {
        e.printStackTrace();
        System.out.println("失败");
    }
}

public static void parseTime(String data) throws ParseException {

    SimpleDateFormat sdf = new SimpleDateFormat("yyyy-mm-dd HH:mm:ss");
    Date d = sdf.parse(data);
}

5.运行时异常的处理

可以不进行处理,编译阶段不会报错,但建议处理,在最外层捕获

public static void main(String[] args) {
	System.out.println("开始");
    try {
        int d = 10/0;
    } catch (Exception e) {
        throw new RuntimeException(e);
    }
    System.out.println("结束");
}

四、自定义异常 

 JAVA无法为所有的问题提供异常类,如果企业想通过异常的方式来管理某个业务问题,就需要自定义异常类了。

 按照国际惯例,自定义的异常应该总是包含如下的构造函数:
                一个无参构造函数
                一个带有String参数的构造函数,并传递给父类的构造函数。
                一个带有String参数和Throwable参数,并都传递给父类构造函数。
                一个带有Throwable 参数的构造函数,并传递给父类的构造函数。

注意:如果自定义异常是为了提示,在使用的时候,一定要用try..catch,不要直接用throw往外抛。

自定义编译时异常

定义一个异常类继承Exception

重写构造器

public class Ageilleagaleception  extends Exception{
    public Ageilleagaleception (){

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

在出现异常的地方用throw new自定义对象抛出

 public static void checkAge(int age) throws Ageilleagaleception {
        if(age < 0 || age > 200){
            throw new Ageilleagaleception(age+"is illegal");
        }else {
            System.out.println("年龄正确");
        }
    }

 自定义运行时异常

定义一个类继承RuntimeException

重写构造器

 在出现异常的地方用throw new自定义对象抛出


总结

程序运行时,发生的不被期望的事件,它阻止了程序按照程序员的预期正常执行,这就是异常

异常处理不能替代简单的测试,不要过分的细化异常

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/weixin_65243968/article/details/125784591

智能推荐

CPU核心数和线程数的关系-程序员宅基地

文章浏览阅读3.4k次。名称说明cpu个数:是指物理上,也及硬件上的核心数;核数:是逻辑上的,简单理解为逻辑上模拟出的核心数;线程数:是同一时刻设备能并行执行的程序个数,如果没有超线程技术,一个CPU核心对应一个线程。线程数越多,越有利于同时运行多个程序,因为线程数等同于在某个瞬间CPU能同时并行处理的任务数。AMD线程数:线程数..._cpu核数和线程数的关系

glide源码中包含了那种设计模式_内部泄露版!2020 美团 Android 面试真题解析-程序员宅基地

文章浏览阅读172次。这份Android面试真题涵盖了图片,网络和安全机制,网络,数据库,插件化、模块化、组件化、热修复、增量更新、Gradle,架构设计和设计模式,Android Framework 、Android优秀三方库源码等。适合中高级工程师。一、图片1、图片库对比2、LRUCache原理3、图片加载原理4、自己去实现图片库,怎么做?5、Glide源码解析6、Glide使用什么缓存?7、Glide内存缓存如何..._glide adapter 泄漏

【高效程序员系列】1、好马配好鞍------舒适的工作环境_超安静的工作环境-程序员宅基地

文章浏览阅读694次。本篇有点发牢骚的感觉,呵呵,如果你的工作环境不舒服,就和我一起发发牢骚吧,否则可以略过本篇。软件开发人员的劳动成果是什么?软件。往细了说,就是代码。代码是如何产生的?是我们经过思考得出的解决问题的方法,然后通过敲击键盘和点击鼠标产生的文件。所以代码只是一种表现形式,最重要的是我们思考问题得出的方法。如何让我们花更多的时间去思考、验证和修正解决问题的方法,而不是纠缠于其他非思考的外部活动,这是本_超安静的工作环境

meta-data介绍-程序员宅基地

文章浏览阅读1.2w次,点赞5次,收藏20次。简介-meta是什么meta-data是应用的清单文件AndroidManifest.xml中application,activity,activity-alias,provider,receiver,service下的子标签,比intent-filter多些父标签.像友盟这些统计服务一般只需要一个AppID等,只需要定义在Application中,如果你想给某个组件添加meta-data,那..._meta-data

Windows 10文件浏览器多标签浏览插件_windows 文件夹多开插件-程序员宅基地

文章浏览阅读9.1k次。四知回--Windows 10文件浏览器多标签浏览插件  Windows10 文件浏览器本身是单窗口的,打开多个目录时会打开多个浏览器窗口,切换和使用均不方便。之前看有提到clover这个软件可以多标签浏览;尝试了一下,简直是中国软件的典范,不停的弹出广告窗口,实在受不了了。 找了这个不弹窗安心用的小软件可以多标签浏览。先看下效果功能打开后,使用的还是Windows..._windows 文件夹多开插件

tcpdump/libpcap与BPF与Linux(LPF-Linux Packet Filter)_linux bpf和libpcap-程序员宅基地

文章浏览阅读2.2k次。http://blog.chinaunix.net/uid-20535506-id-1931559.html《Linux下Sniffer程序的实现》这篇文章对其关系表述的比较准确。 另外一篇英文参考Inside the Linux Packet Filter 很深入 http://www.linuxjournal.com/article/48521,LINUX中PF_PAC_linux bpf和libpcap

随便推点

在KEIL中生成bin文件的方法_fromelf.exe在哪?-程序员宅基地

文章浏览阅读4.6k次,点赞7次,收藏30次。生成hex文件KEIL中默认生成的是axf文件。如果想要生成hex文件,则只需要简单地勾一下:生成bin文件要生成bin文件,则需要用到fromelf。Keil自带了一个小工具,可以通过执行指令来将AXF文件转换为BIN文件这就需要调用一个外部程序fromelf.exe来将AXF文件转换为BIN格式文件。fromelf.exe文件的位置在安装目录Keil_v5\ARM\ARMCC\bin或者Keil_v5\ARM\ARMCLANG\bin目录下。在Options..._fromelf.exe在哪?

技术经验分享——给还在迷茫中的程序猿_程序员技术分享讲什么-程序员宅基地

文章浏览阅读1.8k次。写这篇分享的初衷:我想把我自己的一些经验分享给大家,希望新人们能少走一些弯路。这篇文章的由来:2011/11/24 团队内部 求职经验分享 整理后所得。—————————————我是分割线—————————————————我的求职结果:新太实习offer,淘宝实习offer腾讯offer,深信服offer—_程序员技术分享讲什么

【Java基础】Java8-StreamAPI_java8 stream-程序员宅基地

文章浏览阅读398次。概述 Stream API(java.util.stream.*) Stream 是 Java8 中处理集合的关键抽象概念,它可以指定你希望对集合进行的操作,可以执行非常复杂的查找、过滤和映射数据等操作。 使用Stream API 对集合数据进行操作,就类似于使用 SQL 执行的数据库查询。也可以使用 Stream API 来并行执行操作。 Stream API 提供了一种高效且易于..._java8 stream

Qt5.13.2中配置opencv4.5.0踩坑记录_-- ffmpeg: download: opencv_videoio_ffmpeg.dll很慢-程序员宅基地

文章浏览阅读7k次,点赞10次,收藏38次。目录cmake编译opencv时速度过慢或超时mingw32-make时报错错误一 [modules\core\CMakeFiles\opencv_core.dir\build.make:1494: modules/core/CMakeFiles/opencv_core.dir/vs_version.rc.obj] Error 1错误二 [modules\core\CMakeFiles\opencv_core.dir\build.make:1708: bin/libopencv_co..._-- ffmpeg: download: opencv_videoio_ffmpeg.dll很慢

JVM-各个版本的优缺点、特征分析和应用和常见缺陷_jvm版本-程序员宅基地

文章浏览阅读1k次。Java是如何实现跨平台的?目录Java是如何实现跨平台的?各个版本特性:JAVA SE7Java 7 更新[編輯]JAVA SE8Java 8 更新Java SE 9跨平台是怎样实现的呢?这就要谈及Java虚拟机(Java Virtual Machine,简称 JVM)。JVM也是一个软件,不同的平台有不同的版本。我们编写的Java源码,编译后会生成一种 .class 文件,称为字节码文件。Java虚拟机就是负责将字节码文件翻译成特定平台下的机器码然..._jvm版本

html布局之 图标文字混排_html头部怎么把字体和图标放在一起-程序员宅基地

文章浏览阅读4.6k次,点赞2次,收藏3次。摘要:做html布局的时候经常用到图标和文字的混排,使用的时候经常要调很长时间,今天来总结一下。_html头部怎么把字体和图标放在一起

推荐文章

热门文章

相关标签