java-----异常

目录

异常:代表程序出现的问题

运行时异常和编译时异常的区别?

异常的作用:

异常的处理方式:

异常中常见的方法:

抛出异常:

自定义异常: 


异常:代表程序出现的问题

Exception:叫做异常,代表程序可能出现的问题。我们通常会用Exception以及他的子类来封装程序出现的问题。

运行时异常:RuntimeException及其子类,编译阶段不会出现异常提醒。运行时出现的异常(如:数组索引越界异常)

编译时异常:编译阶段就会出现异常提醒的。(如:日期解析异常)

运行时异常和编译时异常的区别

编译时异常,除了RuntimeException和他的子类,其他都是编译时异常。

编译阶段需要进行处理,作用在于提醒程序员。

运行时异常:

        RuntimeException本身和所有子类,都是运行时异常

        编译阶段不报错,是程序运行时出现的。

        一般是由于参数传递错误带来的问题。

异常的作用:

作用一:异常是用来查询bug的关键参考信息

public class demo4 {
    public static void main(String[] args) {
        int []arr={1,2,3,4};
        System.out.println(arr[5]);
    }
}

我们把这段代码在控制台进行运行,会发现控制台会报下面的错误:

Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: 5
    at ExceptionDemo.demo4.main(demo4.java:6)

会发现出现了数组越界异常,并且at是指出错代码的位置,所以异常第一个作用就是告诉你出现了bug,以及bug的信息是什么?

作用二:异常可以作为方法内部的一种特殊返回值,以便通知调用者底层的执行情况

想想你下你作为一个调用者,假如要给名字进行赋值,但是你不知道赋值规则是什么?其实编写者在写规则的时候给名字命名了规则,比如必须包含某种符号等,你进行了调用,但是并没有把赋值结果告诉你,只是在控制台进行了调用,你就会很懵逼。这就需要返回异常的信息。

异常的处理方式:

1.JVM默认的处理方式

      .把异常的名称,异常原因以及异常出现的位置信息输出在控制台

      .程序停止执行,异常下面的代码不会执行

public class demo5 {
    public static void main(String[] args) {
        System.out.println(2/0);
        System.out.println("代码执行了吗");//异常下面的代码并没有执行
    }

下面试控制台运行结果

Exception in thread "main" java.lang.ArithmeticException: / by zero 异常名称
    at ExceptionDemo.demo5.main(demo5.java:5) 异常位置

Process finished with exit code 1
 

2.捕获异常

格式:

try{

        可能出现异常的代码;

}catch(异常类名 变量名){

        异常的处理代码

}

目的:当代码出现异常时,可以让程序继续往下执行,不会停止虚拟机.

例子:

public class demo1 {
    public static void main(String[] args) {
        try {
            System.out.println(2/0);//此处出现了异常,程序就会在这里创建一个ArithmeticException对象->new ArithmeticException()
//拿着这个对象到catch的小括号中进行对比,看该异常是否被捕获,然后执行catch对应的代码.
        }catch (ArrayIndexOutOfBoundsException e){
            System.out.println(e);
        }catch (ArithmeticException e){
            System.out.println(e);
        }catch (Exception e){
            System.out.println(e);
        }
        System.out.println("看看我执行了吗");//catch里面的代码执行完毕,会执行try...catch体系下面的代码
    }
}

控制台结果:

try....catch四问?

1.如果try中没有问题,怎么执行?

public class demo1 {
    public static void main(String[] args) {
        int []arr={1,2,3,4,5};

        try {
            System.out.println(arr[0]);
        }catch (ArrayIndexOutOfBoundsException e){
            System.out.println(e);
        }catch (ArithmeticException e){
            System.out.println(e);
        }catch (Exception e){
            System.out.println(e);
        }
        System.out.println("看看我执行了吗");
    }
}


控制台输出:
1
看看我执行了吗

可以看到:try没有遇到问题,会把try里面所有代码执行完毕,不会执行catch里面的代码

2.如果try中可能会遇到多个问题,怎么执行?

public class demo1 {
    public static void main(String[] args) {
        int []arr={1,2,3,4,5};

        try {
            System.out.println(arr[6]);
            System.out.println(2/0);
        }catch (ArrayIndexOutOfBoundsException e){
            System.out.println("索引越界");
        }catch (ArithmeticException e){
            System.out.println("数学异常");
        }catch (Exception e){
            System.out.println(e);
        }
        System.out.println("看看我执行了吗");
    }
}


控制运行结果:
索引越界
看看我执行了吗

可以看到:

当我们执行System.out.println(arr[6]);这里出现数组越界异常,他会直接进行进行对应的catch捕获,然后执行对应的代码,再执行try..catch块下面的代码。其中有一个小注意点:

当我们要捕获的异常,存在父子关系的时候:要把父亲放在最下面,想一下,如果父亲在下面,不管什么异常都会被父亲所捕获,那么下面的异常永远无法被捕获到。

第三问:try中的问题没有被捕获会怎么样?

public class demo1 {
    public static void main(String[] args) {
        int []arr={1,2,3,4,5};

        try {
            System.out.println(2/0);
        }catch (ArrayIndexOutOfBoundsException e){
            System.out.println("索引越界");
        }catch (NullPointerException e){
            System.out.println("数学异常");
        }
        System.out.println("看看我执行了吗");
    }
}


控制台输出:
Exception in thread "main" java.lang.ArithmeticException: / by zero
	at ExceptionDemo.demo1.main(demo1.java:8)

Process finished with exit code 1

可以看到,try中没有捕获到对应的异常,那么就会执行虚拟机默认的处理方式

第四问:try中遇到多个问题,下面的代码还会执行吗?

        从上面代码可以看出,try中遇到问题,就不会往下执行,会直接执行catch捕获的代码。但是try...catch块下面的代码还会执行。

异常中常见的方法:

方法名称说明
public  String getMessag()返回此throwable的详细消息字符串
public String toString()返回此可抛出的简短描述
public void printStackTrace()把异常的错误信息输出在控制台

这里只演示比较常用的

public class demo1 {
    public static void main(String[] args) {
        int []arr={1,2,3,4,5};

        try {
            System.out.println(arr[6]);
        }catch (ArrayIndexOutOfBoundsException e){
            e.printStackTrace();
        }catch (NullPointerException e){
            System.out.println("数学异常");
        }
        System.out.println("看看我执行了吗");
    }
}

控制台输出:
看看我执行了吗
java.lang.ArrayIndexOutOfBoundsException: 6
	at ExceptionDemo.demo1.main(demo1.java:8)

可以看到这个e.printStackTrace();仅仅把错误的信息输出在控制台,不会停止程序运行

抛出异常:

throws

写在方法定义出,表示声明一个异常 告诉调用这,使用本方法可能会有哪些异常?

编译时异常:必须要写

运行时异常:可以不写
格式:

public void 方法() throws 异常类名1...{

        ....

}

例子:

public class throwDemo1 {
    public static void main(String[] args) {
        int []arr={};
        int max= 0;
        try {
            max = getMax(arr); //getMax抛出异常之后,调用者可以选择处理或者不处理,但是这样的话会导致下面代码不能执行,所以用try...catch的方法
        } catch (Exception e) {
            e.printStackTrace();
        }
        System.out.println(max);

    }
    public static int getMax(int []arr){ /*throws NullPointerException 运行时异常我们可以省略不写*/
        if(arr==null){
            //手动创建一个异常对象,并把这个异常交给方法的调用者处理
            //此时方法会结束,下面的代码不会再执行了。
            throw new NullPointerException();
        }
        int max=arr[0];
        for (int i = 0; i < arr.length; i++) {
            if(arr[i]>max){
                max=arr[i];
            }
        }
        return max;
    }
}

throw

下在方法内,结束方法

手动抛出异常对象,交给调用者,方法中下面的代码不在执行

public void 方法(){

        thorw new NullPointerException();

}

//

自定义异常: 

目的:让控制台的错误更加的见名知意

public void setName(String name) {
    int len=name.length();
    if(len<3||len>10){
        throw new NameFormatException("长度应该是3-10");//这里时自定义抛出的异常,满足自定义的需求
    }
    this.name = name;
}

//自定义的异常类
public class NameFormatException extends RuntimeException{
    public NameFormatException() {
    }

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

案例:

package ExceptionDemo;

import java.util.Scanner;

public class demo3 {
    public static void main(String[] args) {
        Scanner sc=new Scanner(System.in);

        GirlFriend gf=new GirlFriend();
        try {
            System.out.println("输入姓名");
            String name=sc.nextLine();
            gf.setName(name);

            System.out.println("输入年龄");
            int age=sc.nextInt();
            gf.setAge(age);
        } catch (NumberFormatException e) {
            e.printStackTrace();
        }catch (AgeOutOfBoundsException e){
            e.printStackTrace();
        }
        System.out.println(gf);

    }
}

控制台输出:
输入姓名
aa
Exception in thread "main" ExceptionDemo.NameFormatException: 长度应该是3-10
	at ExceptionDemo.GirlFriend.setName(GirlFriend.java:30)
	at ExceptionDemo.demo3.main(demo3.java:13)

Process finished with exit code 1

可以看到,输出异常的时候会打印自定义的信息:长度应该是3-10

        

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

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

相关文章

Python 连接mysql数据库,并且执行查询

之前一直在写Java&#xff0c;但是随着python的崛起&#xff0c;自己也被慢慢的带入到了这样的一个阵营&#xff0c;学习python&#xff0c;了解机器学习 曾经有一个.... 不谈曾经&#xff0c;现在的我是一个小菜鸟&#xff0c;用学习Java实现业务的需求来学习python 项目的目…

科研绘图系列:R语言树结构聚类热图(cluster heatmap)

文章目录 介绍加载R包导入数据数据预处理画图修改图形导出数据系统信息介绍 热图结合树结构展示聚类结果通常用于展示数据集中的模式和关系,这种图形被称为聚类热图或层次聚类热图。在这种图中,热图部分显示了数据矩阵的颜色编码值,而树结构(通常称为树状图或聚类树)则显…

iptables限制网速

1、使用hashlimit来限速 #从eth0网卡进入INPUT链数据&#xff0c;使用模块hashlimit 限制网速为100kb/s或2mb/s,超过限制的数据包会被DROP。OUTPUT链同理&#xff0c;mode为srcip&#xff0c;有4个mode选项: srcip&#xff08;默认匹配每个源地址IP&#xff0c;配置指定源地址…

计算机网络33——文件系统

1、chmod 2、chown 需要有root权限 3、link 链接 4、unlink 创建临时文件&#xff0c;用于非正常退出 5、vi vi可以打开文件夹 ../是向外一个文件夹 6、ls ls 可以加很多路径&#xff0c;路径可以是文件夹&#xff0c;也可以是文件 ---------------------------------…

Tcping:一款实用的端口存活检测工具

简介 tcping 是一个基于TCP协议的网络诊断工具,通过发送 TCP SYN/ACK包来检测目标主机的端口状态。 官网:tcping.exe - ping over a tcp connection 优点: (1)监听服务器端口状态:tcping 可以检测指定端口的状态,默认是80端口,也可以指定其他端口。 (2)显示ping返…

桌面便签哪个好用?好用的便签软件推荐?

随着信息技术的发展&#xff0c;我们的生活方式也发生了翻天覆地的变化。从纸质笔记本到电子便签&#xff0c;这不仅仅是载体的转换&#xff0c;更是思维习惯的一次革新。在这个数字时代&#xff0c;如何利用科技工具来辅助我们更好地管理时间和信息&#xff0c;成为了值得探讨…

Java刷题知识总结(一)

1.局部变量参与运算前是必须要初始化的&#xff0c;比如下面的代码就会编译出错&#xff0c;提示y必须要初始化。 public static void main(String[] args) {int x 1;int y;int z x y; } 2.ArrayList和Vector主要区别是什么&#xff1f; A Vector与ArrayList一样&#xf…

计算机毕业设计 扶贫助农系统的设计与实现 Java实战项目 附源码+文档+视频讲解

博主介绍&#xff1a;✌从事软件开发10年之余&#xff0c;专注于Java技术领域、Python人工智能及数据挖掘、小程序项目开发和Android项目开发等。CSDN、掘金、华为云、InfoQ、阿里云等平台优质作者✌ &#x1f345;文末获取源码联系&#x1f345; &#x1f447;&#x1f3fb; 精…

记一次Apache点击startup立马闪退的修复

人们总是在靠近幸福时患得患失 --生菜特斯拉 这两天频繁在各个虚拟机中使用apache搭建服务&#xff0c;但是时而会出现点击startup.bat启动脚本后立马出现闪退&#xff0c;所以记录一下。 一、环境复现 实验器材 1、win10虚拟机 2、apache项目 3、JDK&#xff08;1.8&am…

Linux高级I/O:多路转接模型

目录 一.常见的IO模型介绍二.多路转接I/O1.select1.1.函数解析1.2. select特点和缺点1.3.基于 select 的多客户端网络服务器 2.poll2.1.poll函数解析2.2.poll特点和缺点2.3.基于poll的tcp服务器 3.epoll3.1.系列函数解析3.2.epoll原理解析2.3.基于 select 的多客户端网络服务器…

Java 入门指南:JVM(Java虚拟机)—— Java 类加载器详解

类加载器 类加载器&#xff08;Class Loader&#xff09;是 Java 虚拟机&#xff08;JVM&#xff09;的一部分&#xff0c;它的作用是将类的字节码文件&#xff08;.class 文件&#xff09;从磁盘或其他来源加载到 JVM 中。类加载器负责查找和加载类的字节码文件&#xff0c;并…

BEV学习--Nuscenes数据集解读

一、Nuscenes数据集简介 Nuscenes数据的采集来自不同城市的1000个场景中&#xff0c;采集车上配备了完善的传感器&#xff0c;包括6个相机&#xff08;CAM&#xff09;、1个激光雷达&#xff08;LIDAR&#xff09;、5个毫米波雷达&#xff08;RADAR&#xff09;、IMU和GPS&…

论文(六):Fire-Net: A Deep Learning Framework for Active Forest Fire Detection

文章目录 1.Introduction2.Study Area2.1Landsat-8 Dataset2.2Inventory data 3.Methodology3.1Image Pre-processing3.2Proposed Deep Learning Architecture (Fire-Net)3.2.1Convolution Layers3.2.2 Evaluation Indices/methods or accuracy assessment. 4.Results4.1 Austr…

新一代图像生成E2E FT:深度图微调突破

文章地址&#xff1a;Fine-Tuning Image-Conditional Diffusion Models is Easier than You Think 项目主页&#xff1a;https://gonzalomartingarcia.github.io/diffusion-e2e-ft/ 代码地址&#xff1a;https://github.com/VisualComputingInstitute/diffusion-e2e-ft 机构&am…

SpringBoot 整合 apache fileupload 轻松实现文件上传与下载(通用版)

我们以Thymeleaf页面模板引擎为例&#xff0c;简单介绍利用 apache fileupload 工具实现文件上传的功能。 2.1、添加相关依赖包 首先创建一个基础的 Spring Boot 项目&#xff0c;并引入相关的依赖包。 2.2、添加相关配置参数 2.3、文件上传示例 对应文件上传的Controller类&…

传知代码-基于多尺度动态卷积的图像分类

代码以及视频讲解 本文所涉及所有资源均在传知代码平台可获取 概述 在计算机视觉领域&#xff0c;图像分类是非常重要的任务之一。近年来&#xff0c;深度学习的兴起极大提升了图像分类的精度和效率。本文将介绍一种基于动态卷积网络&#xff08;Dynamic Convolutional Netw…

计算机网络17——IM聊天系统——客户端核心处理类框架搭建

目的 拆开客户端和服务端&#xff0c;使用Qt实现客户端&#xff0c;VS实现服务端 Qt创建项目 Qt文件类型 .pro文件&#xff1a;配置文件&#xff0c;决定了哪些文件参与编译&#xff0c;怎样参与编译 .h .cpp .ui&#xff1a;画图文件 Qt编码方式 Qt使用utf-8作为编码方…

【delphi】正则判断windows完整合法文件名,包括路径

在 Delphi 中&#xff0c;可以使用正则表达式来检查 Windows 文件名称或路径是否合法。合法的文件名和路径要求符合以下几点&#xff1a; 禁止的字符&#xff1a;文件名和路径不能包含以下字符&#xff1a;<, >, :, ", /, \, |, ?, *。文件名不能以空格或点结束。…

idea多模块启动

文章目录 idea多模块启动2018版本的idea2019版本的idea idea多模块启动 2018版本的idea 1.首先看一下view> Tool Windows下有没有Run Dashboard 如果有&#xff0c;点击一下底部的窗口就会出现 如果不存在&#xff0c;执行下一步 2.查看自己项目的工作空间位置 点击 File&…

Java中的事件(动作监听-ActionListener)

&#xff08;一&#xff09;、ActionListener接口 ActionListener接口用于处理用户界面上的动作事件&#xff0c;例如&#xff1a;按钮点击、菜单选择等。实现ActionListener接口需要重写actionPerformed(ActionEvent e)方法&#xff0c;该方法会在动作发生时被调用。 &#…