Java程序运行的问题——异常

什么是异常?

Java程序在运行时出现的问题就叫异常

jdk中将异常一新封装成了一个个的类,当出现问题时,就会创建异常对象,抛出异常信息(问题原因、位置)

1.异常

1.1的继承体系

Throwable 是所有错误(error)和异常(Exception)的父类

错误(error)是程序运行过程中出现的严重问题(内存不够),只能修改代码避免这种错误

Exception 是Throwable 的子类,用来表示java程序中可能出现的异常,并要求对异常进行合理的处理

RuntimeException 和CheckedExceptions 两个是Exception的子类

RuntimeException及其子类 (运行时异常) java运行过程中出现的异常

CheckedExceptions 编译时异常

1.2异常和错误的区别

异常:是指程序在编译、运行期间发生了某种异常,可以对异常进行具体的处理,如果不处理异常,程序会结束

错误:是指程序运行时发生了某种错误,Error错误通常没有具体的处理方法,一般情况下错误都发生在JVM,我们无法处理

1.3 异常处理

1.jvm默认处理方式

一旦发生异常,产生异常代码的下面的代码就不再执行

public class Test {
    public static void main(String[] args) { 
//        5.jvm 接收到异常后,按默认处理方法处理
//        int[] arr=new int[1000*1000*1024];
//        System.out.println(arr[0]);
          int [] arr=new int[3];
          int j=method(arr); //3.main方法接收到方法跑过来的异常对象
                            //4.jvm 当前main方法有没有处理这个异常的代码,
                            //如果没有,继续抛给main方法的调用者,这里指的是jvm
          System.out.println(j);
    }

    public static int method(int[] arr){
        int i=arr[3];   //1.当程序运行到arr[3]时,jvm检查有没有索引3,
                        // 没有jvm会自动抛出一个异常.ArrayIndexOutOfBoundsException
                        //2.检查method方法有没有处理这个异常的代码,
                       // 没有找到,继续把这个异常抛给method的调用者
        return i;
    }
}
```

1.4编译时异常和运行时异常

  运行时异常:RuntimeException及其子类

​                                IndexOutOfBoundsException

​                               NullPointerException  空指针异常

​                               ClassCastException   类型转换异常

编译时异常:

​     非RuntimeException及其子类的异常。就在编译阶段会出现的异常

​    ClassNotFoundException

​    FileNotFoundException

编译时异常必须处理

1.5 处理异常

捕获:java对异常有针对性额语句进行捕获,对出现的异常进行指定方式处理

格式:

try{

  //可能出现异常的代码

}catch(异常类 变量){

 //遗产处理语句

}

int i=10;
int j=0;
int [] arr=null;
try {
    j=arr[3];
    int s = i / j;
}catch (ArithmeticException e){
    System.out.println("算术异常");
    e.printStackTrace();
}catch (NullPointerException e){
    System.out.println("空指针异常");
}catch (Exception e){
    System.out.println("异常");

}

多个catch的异常不能相同,如果异常存在子类父类关系,子类在上面,父类在下面

1.5.1 finally代码块

无论try是否发生异常,finally语句一定会执行

格式:

try{

  //可能出现异常的代码

}catch(异常类 变量){

 //遗产处理语句

}finally{

  //无论try是否发生异常,finally语句一定会执行

一般finally里面里释放资源(io,数据库连接)的代码块

}

1.6 抛出异常 throw

 在java中,提供这个throw关键字,用力抛出一个指定的异常对象。

1.创建一个异常对象

2.将这个异常对象告诉调用者:throw 异常对象

public static void main(String[] args) { //5.jvm 接收到异常后,按默认处理方法处理
//        int[] arr=new int[1000*1000*1024];
//        System.out.println(arr[0]);
          //int [] arr=new int[3];
        int[] arr=null;
          int j=method(arr,3); //3.main方法接收到方法跑过来的异常对象
                            //4.jvm 当前main方法有没有处理这个异常的代码,
                            //如果没有,继续抛给main方法的调用者,这里指的是jvm
          System.out.println(j);
    }

    public static int method(int[] arr,int i){
        if(arr==null){
            throw  new NullPointerException();
        }
        if(i>=arr.length){
         //           return -1;
            throw new ArrayIndexOutOfBoundsException();
        }
        if(i<0){
            throw new ArrayIndexOutOfBoundsException();
        }
        int j=arr[i];   //1.当程序运行到arr[3]时,jvm检查有没有索引3,
                        // 没有jvm会自动抛出一个异常.ArrayIndexOutOfBoundsException
                        //2.检查method方法有没有处理这个异常的代码,
                       // 没有找到,继续把这个异常抛给method的调用者
        return j;

    }

1.7 声明异常 throws

public static int method(int[] arr,int i) throws NullPointerException,ArrayIndexOutOfBoundsException

如果在方法内部抛出编译时异常,没有捕获,方法上必须使用throws 声明,让调用者处理

1.8 异常常见方法

printStackTrace的堆栈跟踪功能显示出程序运行到当前类的执行流程

/**

 * Returns the detail message string of this throwable.

 * @return  the detail message string of this {@code Throwable} instance

 *          (which may be {@code null}).

 */

public String getMessage() {

    return detailMessage;

}

//返回该异常的详细信息

public void printStackTrace() {

        printStackTrace(System.err);

   }

//在控制台输出该异常的的名字和信息、以及出现的位置

2.自定义异常

自定义的异常用法通常包含四步:

1.定义异常类
2.写继承关系
3.空参构造
4.代参构造

如下:我自定义了一个异常类NameFormatException,用来在用户年龄错误时抛出

public class NameFormatException extends RuntimeException{
    public NameFormatException() {
    }
    public NameFormatException(String cause) {
        super(cause);
    }
}

public class Student {
    private String name;
    private int age;
    public Student() {
    }
    public Student(String name, int age) {
        this.name = name;
        this.age = age;
    }

    public String getName() {
        return name;
    }
    public void setName(String name) {
        //判断年龄是否符合
        if(name.length()<3&&name.length()>10){
            throw new NameFormatException(name+"ss");
        }
        this.name = name;
    }

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        if(age<18&&age>30){
            throw new RuntimeException();
        }
        this.age = age;
    }

    @Override
    public String toString() {
        return "Student{" +
                "name='" + name + '\'' +
                ", age=" + age +
                '}';
    }
}

注:文章来自闫军锋老师课堂笔记扩充修改

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

关于OpenFeign的返回类型包装问题

在一天夜里。我在使用feign的调用时&#xff0c;突然出现了一点点问题。 就是对于feign类型的包装问题。产生了疑问。 在后来&#xff0c;也就是今天。在网上取取经。看到了一个答案。说&#xff1a;feign的调用会有一个编码器和解码器。 使用feign的解码器。他的原理也很简…

NineAi3.5 –支持GPT绘图,语音播报,联网访问,上下文关联,语音模式

NineAi3.5 –支持GPT绘图&#xff0c;语音播报&#xff0c;联网访问&#xff0c;上下文关联&#xff0c;语音模式 基于ChatGPT开发的一个人工智能技术驱动的自然语言处理工具&#xff0c;它能够通过学习和理解人类的语言来进行对话&#xff0c; 还能根据聊天的上下文进行互动&…

热门IT【视频教程】-华为/思科/红帽/oracle

华为认证 网络工程师-入门基础课&#xff1a;华为HCIA认证课程介绍-CSDN博客 网络工程师进阶课&#xff1a;华为HCIP认证课程介绍-CSDN博客 职场进阶&#xff0c;踏上高峰——HCIE-Datacom认证-CSDN博客 华为HCIA试听课程 &#xff1a; 超级实用&#xff0c;华为VRP系统文件…

4核8G服务器租用优惠价格418元一年,可买3年

京东云4C8G云服务器优惠价格418元1年、1899元三年&#xff0c;配置为&#xff1a;轻量云主机4C8G-180G SSD系统盘-5M带宽-500G月流量&#xff0c;京东云主机优惠活动 atengyun.com/go/jd 可以查看京东云服务器详细配置和精准报价单&#xff0c;活动打开如下图&#xff1a; 京东…

【Go】十四、封装、继承

文章目录 1、封装2、继承3、继承的注意点 1、封装 隐藏实现细节保证数据安全&#xff08;控制变量或方法的访问范围&#xff0c;private&#xff09; Go中实现封装&#xff1a; 结构体、字段的首字母小写&#xff08;Java的private&#xff09;提供一个工厂模式函数&#xf…

SpringBoot+uniApp宠物领养小程序系统 附带详细运行指导视频

文章目录 一、项目演示二、项目介绍三、运行截图四、主要代码1.保存宠物信息代码2.提交订单信息代码3.查询评论信息代码 一、项目演示 项目演示地址&#xff1a; 视频地址 二、项目介绍 项目描述&#xff1a;这是一个基于SpringBootuniApp框架开发的宠物领养微信小程序系统。…

数据可视化-ECharts Html项目实战(9)

在之前的文章中&#xff0c;我们学习了如何在ECharts中编写气泡图&#xff0c;词云图。想了解的朋友可以查看这篇文章。同时&#xff0c;希望我的文章能帮助到你&#xff0c;如果觉得我的文章写的不错&#xff0c;请留下你宝贵的点赞&#xff0c;谢谢。 数据可视化-ECharts Ht…

vue 文件下载

1.返回路径下载 注: 针对一些浏览器无法识别的文件格式&#xff08;如pdf、xls、ppt&#xff09;。可以直接在地址栏上输入URL即可触发浏览器的下载功能。 情况1 //地址栏输入文件URLwindow.location.href URLwindow.open(URL) 注:该方式将下载逻辑放在后端处理&#xff0c…

面试时如何回答接口测试怎么进行

一、什么是接口测试 接口测试顾名思义就是对测试系统组件间接口的一种测试&#xff0c;接口测试主要用于检测外部系统与系统之间以及内部各个子系统之间的交互点。测试的重点是要检查数据的交换&#xff0c;传递和控制管理过程&#xff0c;以及系统间的相互逻辑依赖关系等。 …

权限提升-Linux系统权限提升篇VulnhubCapability能力LD_Preload加载数据库等

知识点 1、Web或用户到Linux-数据库类型 2、Web或用户到Linux-Capability能力 3、普通用户到Linux-LD_Preload加载so配合sudo 章节点&#xff1a; 1、Web权限提升及转移 2、系统权限提升及转移 3、宿主权限提升及转移 4、域控权限提升及转移 基础点 0、为什么我们要学习权限…

Python接口自动化 —— 什么是接口测试、为什么要做接口测试?

简介 上一篇和大家一起科普扫盲接口后&#xff0c;知道什么是接口&#xff0c;接口类型等&#xff0c;对其有了大致了解之后&#xff0c;我们就回到主题-接口测试。 什么是接口测试 接口测试是测试系统组件间接口的一种测试。接口测试主要用于检测外部系统与系统之间以及内部各…

C语言-冒泡排序算法

题目描述 设计一个程序&#xff0c;实现冒泡排序算法&#xff0c;并输出{9,8,7,6,5,4,3,2,1,0} 的排序过程。 输出 每个排序过程输出一行&#xff0c;直到排序完成。 样例输出 Expected 9 8 7 6 5 4 3 2 1 0 0 9 8 7 6 5 4 3 2 1 0 1 9 …

HDLbits 刷题 -- Always if

学习&#xff1a; An if statement usually creates a 2-to-1 multiplexer, selecting one input if the condition is true, and the other input if the condition is false. always (*) beginif (condition) beginout x;endelse beginout y;end end This is equivalent …

衍生品交易概况

场内 场外 交易台架构 报价、交易、研究、程序个股、股指Flow、Exotic线性、非线性 对冲管理 管理风险敞口 做好情景分析 尊重市场选择 及时调整策略 理解头寸 善于学习 场外衍生品交易员的一天 盘前 回顾市场、决定今天总体方向处理隔夜敞口 盘中 处理客户询价…

关于 HEAP CORRUPTION DETECTED:after Normal block 错误的原因及解析

目录 一、HEAP CORRUPTION DETECTED:after Normal block 出现的报错情况&#xff1a; 二、问题原因&#xff08;重要&#xff09;&#xff1a; 三、举例 1.错误代码如下&#xff1a; 2.错误原因及分析&#xff08;重要&#xff09;&#xff1a; 3.解决方法 ​编辑 4.正…

两数之和-考察哈希表的运用

题目 给定一个整数数组 n u m s nums nums和一个整数目标值 t a r g e t target target&#xff0c;请你在该数组中找出和为目标值 t a r g e t target target的那 两个整数&#xff0c;并返回它们的数组下标。 你可以假设每种输入只会对应一个答案。但是&#xff0c;数组中同…

计算机网络数据链路层知识总结

物理层知识总结传送门 计算机网络物理层知识点总结-CSDN博客 功能 功能概述 一些基本概念 结点:主机、路由器链路﹔网络中两个结点之间的物理通道&#xff0c;链路的传输介质主要有双绞线、光纤和微波。分为有线链路、无线链路。数据链路︰网络中两个结点之间的逻辑通道&a…

“数字化”持续走热,VR全景助力制造业上“云”

制造业要升级&#xff0c;数字化改造是重要途径。 早年间&#xff0c;由于对数字化的认识不足&#xff0c;一些企业明明有数字化改造需求&#xff0c;却不敢、不愿、不会上“云”。直到此次两会期间&#xff0c;2024年政府工作报告再次提出推动制造业数字化转型&#xff0c;越…

第十三届蓝桥杯JavaA组省赛真题 - 求和

解题思路&#xff1a; 这&#xff0c;真的是&#xff0c;省赛真题吗... public class Main {public static void main(String[] args) {long res 0;for (int i 1; i < 20230408; i) {res i;}System.out.print(res);} }