JAVA之旅(十)——异常的概述,Try-Catch,异常声明Throws,多异常处理,自定义异常,Throw和Throws的区别

JAVA之旅(十)——异常的概述,Try-Catch,异常声明Throws,多异常处理,自定义异常,Throw和Throws的区别


不知不觉,JAVA之旅这个系列已经更新到第十篇了,感觉如梦如幻,时间过得很快,转眼一个月就这样过去了,我们不多说,继续我们的JAVA之旅

一.异常的概述

异常算是程序中一个比较重要的环节了,我们首先来看一下异常的体系,我们举一个小例子,定义一个除法方法

//公共的   类   类名
public class HelloJJAVA {
    // 公共的 静态 无返回值 main方法 数组
    public static void main(String[] str) {

        Demo d = new Demo();
        System.out.println(d.div(6, 2));
    }
}

class Demo {
    /**
     * 定义一个除法
     *
     * @param a
     * @param b
     * @return
     */
    int div(int a, int b) {

        return a / b;
    }
}

这段程序很好理解吧,就是除嘛,传6和2进去,的出来的结果肯定是3呀,但是,我现在传一个4和0,那输出的结果又会是什么呢?

OK,异常出现了

  • 异常:就是程序在运行时出现的不正常情况

异常的由来

  • 问题也是现实生活中一个具体的事物,也可以通过JAVA的类的形式进行描述,并封装成对象,其实就是JAVA对不正常情况进行描述后的对象体现
  • 对于问题的划分,分为两种,一种是严重问题,一种是非严重问题,对于严重的问题JAVA通过ERROR类描述,非严重的,用Exception类来进行描述
  • 对于ERROR,一般不编写针对性的代码进行描述
  • 对于Exception可以通过正对性的处理方式进行处理

无论ERROR还是Exception,都具备一些共性的内容,比如:不正常情况的信息,引发原因等

  • Throwable
    • Error
    • Exception

Error的错误很多,你基本上很多都可以根据名字追到是什么错误

但是我们今天不讲Error,我们看的是异常

二.Try-Catch

Try-Catch就是抛出异常,也就是异常的处理

    try {
            //需要被检测的代码
        } catch (Exception e) {
            // 处理异常的代码(处理方式)
        }

既然知道了处理方式,那我们就可以针对上面的异常进行处理了

//公共的   类   类名
public class HelloJJAVA {
    // 公共的 静态 无返回值 main方法 数组
    public static void main(String[] str) {

        Demo d = new Demo();
        try {
            System.out.println(d.div(4, 2));
        } catch (Exception e) {
            System.out.println("异常");
        }

    }
}

class Demo {
    /**
     * 定义一个除法
     *
     * @param a
     * @param b
     * @return
     */
    int div(int a, int b) {

        return a / b;
    }
}

对捕获的异常对象进项常见的处理方法

  • getMessage() 错误信息
  • toString() 转换成string的异常信息
  • printStackTrace 打印内存中的跟踪信息

三.异常声明Throws

我们不确定这段代码有没有问题,那我们就得去标识,怎么标识?Throws

/**
     * 定义一个除法
     *
     * @param a
     * @param b
     * @return
     */
    int div(int a, int b) throws Exception{

        return a / b;
    }

在功能上通过throws的关键字来声明了该功能有可能会出现问题,所以我们使用的时候就会有提示;

你不处理我就不让你用,提高了安全性

三.多异常处理

对多异常的处理方式是怎么样的呢?

  • 1.声明异常时,建议声明更为具体的异常,这样处理的可以更加具体
  • 2对方声明几个异常,就对应有几个catch块,如果多个catch块中的异常出现继承关系,父类异常catch放在最下面,不要定义多余的catch块
  • 3.建议在进行catch处理时,catch钟一定要定义具体处理方式,不要简单的定义一句显示格式

标准格式

    try {

        } catch (Exception e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } catch (NullPointerException e) {

        }

也就是多catch

四.自定义异常

我们知道,异常分很多种,我们也可以自定义异常,也就是自己定义一些规则,因为项目中会出现一些特有的异常,而这些问题并未被JAV封装成异常,针对这些问题,我们可以按照JAVA对问题封装的思想,将特有的问题进行自定义的异常封装

如何去自定义异常?

需求,在本程序中,对于出书是-1?也视为是错误的,是无法进行运算的,那么就需要对这个问题进行自定义的描述

当在函数内部出现throw抛出异常对象,那么必须要给对应的处理动作

要么在函数上声明让调用者处理

throw关键字自定义异常,一般情况下,函数内出现异常,却没有需要声明,发现打印的就黑锅只有异常的名称,却没有信息,因为自定义的异常并未定义的信息

如何定义异常信息

//公共的   类   类名
public class HelloJJAVA {
    // 公共的 静态 无返回值 main方法 数组
    public static void main(String[] str) {
        Demo d = new Demo();
        try {
            d.dev(4, -1);
        } catch (FushuException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
    }
}

/**
 * 负数异常
 *
 * @author LGL
 *
 */
class FushuException extends Exception {

    private String msg;

    public FushuException(String msg) {
        this.msg = msg;
    }

    @Override
    public String getMessage() {
        // TODO Auto-generated method stub
        return msg;
    }
}

class Demo {
    int dev(int a, int b) throws FushuException {
        if (b < 0) {
            // 手动通过throw关键字抛出自定义异常对象
            throw new FushuException("出现了除数是负数的异常");
        }
        return a / b;
    }
}

这段代码挺好玩的

但是其实我们有一点是不知道的,这个其实父类已经完成了,所以子类只要构造时,将构造信息传递给父类就行了,用super,那么就可以直接通过getMessage()方法来获取自定义的异常信息了

/**
 * 负数异常
 *
 * @author LGL
 *
 */
class FushuException extends Exception {

    private String msg;

    public FushuException(String msg) {

        super(msg);
    }

}

五.Throw和Throws的区别

我们来一个小插曲,就是异常的两个类的区别

Throw和Throws的区别

  • 1.Throws使用在函数上,Throw使用在函数内
  • 2.Throws后面跟异常类,可以跟多个,用逗号区别,Throw后面跟的是异常对象

OK,我们本篇幅就先到这里,异常的内容还是有很多的,不出意外我们下篇还是讲异常,大家感兴趣的话,可以加群:555974449

时间: 2024-09-23 22:25:53

JAVA之旅(十)——异常的概述,Try-Catch,异常声明Throws,多异常处理,自定义异常,Throw和Throws的区别的相关文章

JAVA之旅(十一)——RuntimeException,异常的总结,Package,jar包,多线程概述

JAVA之旅(十一)--RuntimeException,异常的总结,Package,jar包,多程序概述 继续JAVA之旅 一.RuntimeException 在Exception种有一个特殊的子类异常RuntimeException,翻译过来就是运行异常,如果在函数内容抛出该异常,函数上可以不用声明,编译一样通过,如果在函数上声明了该异常,调用者可以不用处理,编译一样通过 之所以不用函数声明,是因为不需要让调用调用者处理,当然该异常发生,希望程序停止,因为在运行时,出现了无法继续运算的情况

JAVA之旅(二十八)——File概述,创建,删除,判断文件存在,创建文件夹,判断是否为文件/文件夹,获取信息,文件列表,文件过滤

JAVA之旅(二十八)--File概述,创建,删除,判断文件存在,创建文件夹,判断是否为文件/文件夹,获取信息,文件列表,文件过滤 我们可以继续了,今天说下File 一.File概述 文件的操作是非常重要的,我们先来看下他的基本概念 用于将文件或者文件夹封装成对象 方便对文件和文件夹的操作 File对象可以作为参数传递给流的构造函数 我们写个小例子先 package com.lgl.hellojava; import java.io.File; public class HelloJJAVA {

JAVA之旅(二十二)——Map概述,子类对象特点,共性方法,keySet,entrySet,Map小练习

JAVA之旅(二十二)--Map概述,子类对象特点,共性方法,keySet,entrySet,Map小练习 继续坚持下去吧,各位骚年们! 事实上,我们的数据结构,只剩下这个Map的知识点了,平时开发中,也是能看到他的,所以还是非常值得去学习的一个知识点的,我们直接开车了 一.Map概述 泛型< k,v> 键值对,映射关系 基本特点 该集合存储键值对,是一对一对往里存,而且要保证键的唯一性 1.添加 put(key ,values) putAll() 2.删除 clear() remove(ob

JAVA之旅(三十二)——JAVA网络请求,IP地址,TCP/UDP通讯协议概述,Socket,UDP传输,多线程UDP聊天应用

JAVA之旅(三十二)--JAVA网络请求,IP地址,TCP/UDP通讯协议概述,Socket,UDP传输,多线程UDP聊天应用 GUI写到一半电脑系统挂了,也就算了,最多GUI还有一个提示框和实例,我们暂时不讲了,我们直接来重点吧,关于JAVA的网络请求是怎么实现的?当然是HTTP协议,但是不可否认,他的概念和思想都是我们必须去涉及的,包括后面的tcp和socket等,好吧,我们开车吧! 一.JAVA网络请求概述 关于JAVA的网络请求,我们大致的可以分为以下几个分类 网络模式 OSI TCP

JAVA之旅(三十五)——完结篇,终于把JAVA写完了,真感概呐!

JAVA之旅(三十五)--完结篇,终于把JAVA写完了,真感概呐! 这篇博文只是用来水经验的,写这个系列是因为我自己的java本身也不是特别好,所以重温了一下,但是手比较痒于是就写出了这三十多篇博客了,而且收到的好评也不错,于是就一直坚持了下来,非常感谢各位小伙伴哦! JAVA之旅合集 JAVA之旅(一)--基本常识,JAVA概念,开发工具,关键字/标识符,变量/常量,进制/进制转换,运算符,三元运算 JAVA之旅(二)--if,switch,for,while,do while,语句嵌套,流程

JAVA之旅(二十四)——I/O流,字符流,FileWriter,IOException,文件续写,FileReader,小练习

JAVA之旅(二十四)--I/O流,字符流,FileWriter,IOException,文件续写,FileReader,小练习 JAVA之旅林林总总也是写了二十多篇了,我们今天终于是接触到了I/O了.如果你初学,不懂IO流,你可以从前往后慢慢看,但是你工作了一段时间你会发现,流的使用场景以及技术点是非常的强硬的,我们势必要掌握这个知识点,如果你觉得翻阅API比较鼓噪,看视频得不到精髓,看书看不到要点,你就跟随我的JAVA之旅,一起去探索吧! 一.I/O概述 I/O全名:Input Output

JAVA之旅(二十一)——泛型的概述以及使用,泛型类,泛型方法,静态泛型方法,泛型接口,泛型限定,通配符

JAVA之旅(二十一)--泛型的概述以及使用,泛型类,泛型方法,静态泛型方法,泛型接口,泛型限定,通配符 不知不觉JAVA之旅已经写到21篇了,不得不感叹当初自己坚持要重学一遍JAVA的信念,中途也算是非常的痛苦吧,不过熬到现在,已经算是有点效果了,继续加油,估计三十来篇就能结束自己的JAVA之旅了,go,go! 一.泛型的概述 什么是泛型,我们可以用一个很典型的例子来说明 package com.lgl.hellojava; import java.util.ArrayList; import

JAVA之旅(十六)——String类,String常用方法,获取,判断,转换,替换,切割,子串,大小写转换,去除空格,比较

JAVA之旅(十六)--String类,String常用方法,获取,判断,转换,替换,切割,子串,大小写转换,去除空格,比较 过节耽误了几天,我们继续JAVA之旅 一.String概述 String时我们很常用的数据类型,他也是一个类的使用 我们来看 package com.lgl.hellojava; //公共的 类 类名 public class HelloJJAVA { public static void main(String[] args) { /** * String */ /**

JAVA之旅(十八)——基本数据类型的对象包装类,集合框架,数据结构,Collection,ArrayList,迭代器Iterator,List的使用

JAVA之旅(十八)--基本数据类型的对象包装类,集合框架,数据结构,Collection,ArrayList,迭代器Iterator,List的使用 JAVA把完事万物都定义为对象,而我们想使用数据类型也是可以引用的 一.基本数据类型的对象包装类 左为基本数据类型,又为引用数据类型 byte Byte int Integer long Long boolean Booleab float Float double Double char Character 我们拿Integer来举例子 //整