java学习之异常三

news2024/11/16 17:27:50

目录

一、throws

一、基本说明

 二、使用细节

二、自定义异常

一、 基本概念

​编辑二、自定义异常的步骤

三、实例

 四、练习

 三、throw和throws的区别

四、本章作业 

第一道

 第二题

 第三题

第四题


一、throws

一、基本说明

 

package com.hspedu.throws_;

import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;

/**
 * @author GQQ
 * @version 1.0
 */
public class Throws01 {
    public static void main(String[] args) throws FileNotFoundException{
        f1();
    }
    public static void f1() throws FileNotFoundException,NullPointerException,ClassCastException {
       //创建了一个文件流对象
        //1.这里的异常是一个FileNotFoundException 编译异常,必须要明确的处理
        //2.使用前面讲过的try-catch-finally
        //3.使用 throws ,抛出异常,让调用f1方法的调用者处理
        //4.throws可以抛出方法中产生的异常类型:FileNotFoundException,也可以抛出其父类Exception
        //5.throws 关键字后也可以是 异常列表,即可以抛出多个异常
        FileInputStream fis = new FileInputStream("d:\\aa.jpg");




    }
}

 二、使用细节

 

package com.hspedu.throws_;

import java.io.FileInputStream;
import java.io.FileNotFoundException;

/**
 * @author GQQ
 * @version 1.0
 */
public class ThrowsDetail {
    public static void main(String[] args) {
        f2();//运行异常,默认throws处理
    }

    public static void f2() {
        //1.对于编译异常, 程序中必须处理, 比如 try-catch 或者 throws
        //2.对于运行时异常,程序中如果没有处理, 默认就是 throws 的方式处理

        int n1 = 10;
        int n2 = 0;
        double res = n1 / n2;
    }

    public static void f1() throws FileNotFoundException {
        //在f1()中调用方法f3(), f3()抛出一个编译异常: FileNotFoundException
        //编译异常必须要显式的处理,两种:t-c-f/throws
        f3();
    }

    public static void f3() throws FileNotFoundException {//编译异常
        FileInputStream fis = new FileInputStream("d:\\aa.jpg");
    }

    public static void f4() {
        //1.在此处调用f5()是OK的
        //2.f5()抛出的是一个运行异常
        //3.运行异常有默认处理机制,并不要求显式处理
        f5();
    }

    public static void f5() throws ArithmeticException {//运行异常

    }
}

class Father {
    public void method() throws RuntimeException {

    }
}

class Son extends Father {
    //3.子类重写父类的方法时,抛出的异常类型要么和父类一致,或者是父类异常类型的子类型
    //子类抛出的异常类型 范围 <= 父类
    //4. 在 throws 过程中, 如果有方法 try-catch , 就相当于处理异常, 就可以不必 throws
    @Override
    //如果是throws Exception就会报错
    //如果是throws FileNotFoundException 也会报错因为这是编译异常,跟运行异常之间不存在继承关系
    public void method() throws NullPointerException {//NullPointerException是RuntimeException的子类

    }
}

二、自定义异常

一、 基本概念


二、自定义异常的步骤

三、实例

package com.hspedu.customexception_;

/**
 * @author GQQ
 * @version 1.0
 */
public class CustomException {
    public static void main(String[] args)/*throws Exception*/{
        int age = 124;
        if(!(age >= 18 && age <= 120)){
            //可以通过构造器,设置打印出的信息
            throw new AgeException("年龄需要在18-120之间");
        }
        System.out.println("年龄范围正确...");//如果只是扔出异常而没有catch,则不会执行此语句
    }
}
//自定义一个异常
//一般情况下,自定义异常是继承自RuntimeException
//2.即把自定义异常做成运行时异常,好处是: 我们可以使用默认的处理机制
//3.如果写成是extends Exception,则是编译异常,
// 4.就必须在main方法中显式的抛出异常 throws Exception,或者使用t-c-f
class AgeException extends RuntimeException{
    public AgeException(String message) {
        super(message);
    }
}

 

 四、练习

 

package com.hspedu.customexception_;

/**
 * @author GQQ
 * @version 1.0
 */
public class CustomExceptionExercise {
    public static void main(String[] args) {
        try{
            ReturnExceptionDemo.methodA();
        } catch (Exception e){
            System.out.println(e.getMessage());
        }
        ReturnExceptionDemo.methodB();
    }


}
class ReturnExceptionDemo{
    static void methodA(){
        try {
            System.out.println("进入方法A");
            throw new RuntimeException("制造异常");
        }finally {
            System.out.println("用A方法的finally");
        }
    }
    static void methodB(){
        try {
            System.out.println("进入方法B");
            return;
        } finally{
            System.out.println("调用B方法的finally");
        }

    }
}

考察知识点:如果抛出了异常throw new RuntimeException("制造异常");,或者是出现了return语句就表示要结束此方法,剩余的代码不会再执行,但是如果有finally,那么finally中的代码必须执行,所以此时就会优先执行finally中的代码

 三、throw和throws的区别

四、本章作业 

第一道

 

我的代码

package com.hspedu.homework;

/**
 * @author GQQ
 * @version 1.0
 */
public class EcmDef {
    public static void main(String[] args) {
        /*
        编写应用程序EcmDef.java,接收命令行的两个参数(整数),计算两数相除。
        计算两个数相除,要求使用方法 cal(int n1,int n2)
        对数据格式不正确、缺少命令行参数、除0 进行异常处理
        数据格式不正确:NumberFormatException
        缺少命令行参数:ArrayIndexOutOfBoundsException
        除0:ArithmeticException
         */
        try {
            //如果用这个循环条件的话,即使传入了3个参数也不会报错
            for (int i = 0; i < args.length; i++) {
                int n1 = Integer.parseInt(args[0]);
                int n2 = Integer.parseInt(args[1]);
                cal(n1,n2);
            }
        } catch (NumberFormatException e) {
           throw new NumberFormatException("数据格式不正确");
        }catch (ArrayIndexOutOfBoundsException e) {
            throw new ArrayIndexOutOfBoundsException("缺少命令行参数");
        }catch (ArithmeticException e) {
            throw new ArithmeticException("被除数为0,运算异常");
        }
        System.out.println("程序继续执行...");
    }
    public static void cal(int n1 ,int n2){
        System.out.println("res = " + n1 / n2);
    }
}

代码问题:

 在命令行输入参数时,数组args的数据就已经传入到main方法中了,所以

就算没有发生异常,此循环也会被执行  参数的个数   次,此时循环次数就是3

for (int i = 0; i < args.length; i++) {
    int n1 = Integer.parseInt(args[0]);
    int n2 = Integer.parseInt(args[1]);
    cal(n1,n2);
}

运行结果

 并且此代码只在   命令行参数只有一个的时候 会抛出异常,不能判断命令行参数 为多个或者0个的情况

正确代码

package com.hspedu.homework;

/**
 * @author GQQ
 * @version 1.0
 */
public class EcmDef02 {
    public static void main(String[] args) {
        //首先对传入的参数个数进行判断
        try {
            if(args.length != 2){
                throw new ArrayIndexOutOfBoundsException("参数个数不正确");//扔出异常后需要用try-catch来捕获异常
            }
            int n1 = Integer.parseInt(args[0]);
            int n2 = Integer.parseInt(args[1]);
            cal(n1,n2);
        } catch (ArrayIndexOutOfBoundsException e) {
            System.out.println(e.getMessage());;
        } catch (NumberFormatException e) {
            System.out.println("数字类型转换异常");
        }catch (ArithmeticException e) {
            System.out.println("数学运算异常(除数为0)");
        }
        System.out.println("继续执行程序...");
    }
    public static void cal(int n1, int n2){
        System.out.println("res=" + n1 / n2);
    }
}

 

 

 第二题

package com.hspedu.homework;

/**
 * @author GQQ
 * @version 1.0
 */
public class HomeWork02 {
    public static void main(String[] args) {
        //String[] args是一个空数组,里面没有存储任何数据
        System.out.println(args.length);

        //由于args是一个空数组,这里会发生ArrayIndexOutOfBoundsException
        //发生异常后,下面的代码都不会执行
        if(args[4].equals("john")){
            System.out.println("BB");
        }else{
            System.out.println("AA");
        }
        Object o= args[2];//ok,String是Object的子类
        Integer i =(Integer)o;//ClassCastException,Integer和String没有继承关系
        //String i =(String)o;//OK


    }

}

 第三题

package com.hspedu.homework;

/**
 * @author GQQ
 * @version 1.0
 */
public class HomeWork03 {
    public static void main(String[] args) {
        try {
            func();
            System.out.println("A");//在try中如果抛出了异常,剩余代码块就不执行,所以此处不输出
        } catch (Exception e) {
            System.out.println("C");//捕获异常并打印 即第三步 C
        }
        System.out.println("D");//由于异常已经被捕获,所以可以正常输出 D,结果就是BCD
    }

    public static void func() {//静态方法
        try {
            //第一步是抛出异常,但是一旦抛出异常,就不会执行剩余代码
            //但是finally中的代码必须执行,所以先输出B,再抛出异常
            throw new RuntimeException();//第二步
        } finally {
            System.out.println("B");//第一步 B
        }
    }

}

第四题

package com.hspedu.homework;

/**
 * @author GQQ
 * @version 1.0
 */
public class HomeWork04 {
    public static void main(String[] args) {
        try{
            showExce();//调用此方法后抛出一个异常,剩余代码不再执行
            System.out.println("A");
        }catch(Exception e){
            System.out.println("B");
        } finally{
            System.out.println("C");
        }
        System.out.println("D");

    }
    public static void showExce() throws Exception{
        throw new Exception();//抛出异常
    }
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/503726.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Linux常用命令(2)

文章目录 Linux常用命令&#xff08;2&#xff09;拷贝 cp语法拷贝hello.txt生成一个新文件hello1.txt拷贝hello.txt文件到hello目录里面去拷贝hello目录生成一个新目录hello1拷贝hello1目录到主目录里面去并且命名为hello2目录 更名/移动 mv删除 rm管理员命令echo / cat将信息…

JVM 程序计数器(PC 寄存器)

PC Register 介绍 JVM中的程序计数寄存器( Program Counter Register) 中&#xff0c;Register 的命名源于 CPU 的寄存器, 寄存器存储指令相关的现场信息。 CPU 只有把数据装载到寄存器才能够运行JVM 中的 PC 寄存器是对物理 PC 寄存器的一种抽象模拟PC 寄存器用来存储指向下一…

Vue 子组件触发父组件事件,传递多个参数以及异常情况处理

Start 今天这篇文章记录一下子组件调用父组件事件&#xff0c;传参的逻辑。以及一些特殊的情况。 1. 示例 1.1 父组件 <template><div>我是父组件<hr /><child to-say"toSay" /></div> </template><script> import ch…

toFixed()*100保留的小数位数和预想的不一致

目录 一、问题 二、原因及解决方法 三、总结 一、问题 1.因为演示需要&#xff0c;要造一些假数据&#xff0c;一些数据要求保留2位小数。这需求真的不难&#xff0c;不就是parseFloat().toFixed()不就完了。 2.所以很快就写了如下代码&#xff1a; let aMath.random()*(1…

ChatGPT国内镜像网站大盘点(国内可用免费ChatGPT镜像站点)

目录 ChatGPT国内镜像网站 很多网友想要国内可用免费ChatGPT镜像站点&#xff0c;ChatGPT可以说是最近大火的AI工具&#xff0c;但是国内的小伙伴是无法使用ChatGPT的&#xff0c;要想在国内直接使用ChatGPT的话不仅需要通过技术手段让网络满足要求&#xff0c;还需要国外的手…

搭建ESP-12E外围电路

搭建ESP-12E外围电路 原理图&#xff1a; PCB&#xff1a; 参考的原理图: 扩展知识&#xff1a; USB转串口部分电路设计&#xff08;CH340N&#xff09;&#xff1a; CH340N引脚封装 参考文章 CH340C的ESP8266一键下载电路设计_ch340c esp8266_坚持努力&#xff0c;冲~的博客…

Binlog日志详解

binlog基本概念 binlog是一个二进制格式的文件&#xff0c;用于记录用户对数据库更新的SQL语句信息&#xff0c;例如&#xff1a;更改数据库表和更改内容的SQL语句都会记录到binlog里&#xff0c;但是不会记录SELECT和SHOW这类操作 binlog的特点 binlog在MySQL的Server层实现…

电路基础(第一章电路模型和电路定律)

第一章 电路模型和电路定律 简介&#xff1a; 电路基础第一篇知识笔记&#xff0c;在书上抄&#xff0c;在网上找&#xff0c;总之把基础的东西搞懂。近期要恶补一下基础了&#xff0c;谁想工作的时候天天被骂啊&#xff0c;弄啥啥不会。开卷。 学习教程参考教材《电路》——邱…

【NLP开发】Python实现聊天机器人(ChatterBot,集成前端页面)

&#x1f37a;NLP开发系列相关文章编写如下&#x1f37a;&#xff1a; &#x1f388;【NLP开发】Python实现词云图&#x1f388;&#x1f388;【NLP开发】Python实现图片文字识别&#x1f388;&#x1f388;【NLP开发】Python实现中文、英文分词&#x1f388;&#x1f388;【N…

关于说服(一)

首先有一个原则&#xff1a;没有人喜欢被改变 不好的话术反而会引起别人的抵触心理 为避免触发反抗机制&#xff0c;可以稍微改变一下话术&#xff1a;将 “你应该” 改为 “我需要”** 没人喜欢说教者 说教者常用句式 1 你为什么不肯去试一试 ->(隐喻) 你在逼别人复习反…

复刻ChatGPT语言模型系列-(一)基座模型选取

前言 今天开始我将会推出一系列关于复刻ChatGPT语言模型的博文。本系列将包括以下内容&#xff1a; 复刻ChatGPT语言模型系列-&#xff08;一&#xff09;基座模型选取复刻ChatGPT语言模型系列-&#xff08;二&#xff09;参数高效微调复刻ChatGPT语言模型系列-&#xff08;三…

玩机搞机--定制系统 编译系统选项 隐藏设置 关闭app联网 增加设置选项

在接待一些定制rom的过程中。对于有些客户的有些要求作出对应的系统编译操作选项。例如 1-----默认开启usb 2-----默认开启usb安全设置&#xff0c;使其开机就可以投屏操控 3------默认开启关机充电自动重启 4-----对于客户特定的app&#xff0c;使其不能联网操作 5-----对…

【Java入门合集】第四章继承(一)

【Java入门合集】第四章继承&#xff08;一&#xff09; 博主&#xff1a;命运之光专栏&#xff1a;JAVA入门 学习目标 1.掌握继承性的主要作用、实现、使用限制&#xff1b; 2.掌握this和super的含义及其用法&#xff1b; 3.掌握方法覆写的操作&#xff1b; 4.掌握final关键字…

Linux——进程信号

进程信号 信号的基础生活中技术上 信号的产生信号捕捉接口信号发送接口向任意进程发送信号向自己发送信号 进程退出时——核心转储 信号的保存信号其它相关概念信号如何实现捕捉的 信号的处理sigset_t信号集操作函数sigprocmasksigpending对于信号保存更深入的理解sigaction 可…

JavaWeb ( 八 ) 过滤器与监听器

2.6.过滤器 Filter Filter过滤器能够对匹配的请求到达目标之前或返回响应之后增加一些处理代码 常用来做 全局转码 ,session有效性判断 2.6.1.过滤器声明 在 web.xml 中声明Filter的匹配过滤特征及对应的类路径 , 3.0版本后可以在类上使用 WebFilter 注解来声明 filter-cla…

JVM 类加载子系统

内存结构概述 粗略图: 详细图&#xff1a; 类加载器与类的加载过程 类加载子系统负责从文件系统或者网络中加载 Class 文件&#xff0c; class 文件在文件开头有特定的文件标识ClassLoader 只负责 class 文件的加载,至于它是否可以运行, 则由 Execution Engine 决定加载的类信…

AI读心重磅突破登Nature!大脑信号1秒被看穿,还能预测未来画面

夕小瑶科技说 分享 来源 | 新智元 最近&#xff0c;来自洛桑联邦理工学院的研究团队提出了一种全新的方法&#xff0c;可以用AI从大脑信号中提取视频画面。论文已登Nature&#xff0c;却遭网友疯狂「打假」。 现在&#xff0c;AI不仅会读脑&#xff0c;还会预测下一个画面了&a…

实验十九、利用运算电路解方程

一、题目 研究利用运算电路解方程。已知一元二次方程为 2 X 2 X − 6 0 2X^2X-60 2X2X−60&#xff0c;试求其解。 二、仿真电路 按方程式搭建电路&#xff0c;如图1所示。该电路为加减运算电路&#xff0c;由于同相和反相端电阻参数对称&#xff0c;故省略掉了同相输入端…

2.docker—数据卷操作

文章目录 1、配置数据卷2、数据卷容器3、小结 1、配置数据卷 挂载 # 创建启动容器时&#xff0c;使用 –v 参数 设置数据卷 sudo docker run ... –v 宿主机目录(文件):容器内目录(文件) ...sudo docker run -it --namec1 -v /home/sjj/data:/root/data_container centos:7 /…

【C++进阶之路】类和对象(中)

文章目录 前言六大默认成员函数 一.构造函数性质默认构造函数构造函数(需要传参) 二.析构函数性质默认析构函数练习 三.拷贝构造函数基本性质&#xff1a;形参必须是引用默认拷贝构造浅拷贝深拷贝自定义类型 四.赋值运算符重载函数基本特征全局的运算符重载函数局部的运算符重载…