JAVA笔记--异常处理(第一篇)

2023-10-30

 目录

一、异常概念

1、什么是异常

2、try与catch关键字

二、try_catch_finally

1、catch

2、异常处理过程分析

3、finally

三、throw_throws与异常规则

1、throw throws

2、异常处理的语法规则

四、自定义异常与assert

1、自定义异常

2、受检和非受检异常

i、受检异常:Exception

ii、非受检异常:RuntimeException

iii、面试题

3、assert

五、新特性与debug技术

1、新特性

2、debug


一、异常概念

1、什么是异常

异常时阻止当前方法或作用域继续执行的问题,在程序中导致程序中断运行的一些指令。

2、try与catch关键字

Throwable是异常的基类,分为Error和Exception,在编程中我们关注Exception;

Exception分为编译期异常(受检)和运行期异常(非受检)

异常会导致程序中断,无法继续执行

在开发中我们需要把可能出现异常的代码使用try语句块包裹起来

处理异常可以让程序保持运行状态

package yichang;

public class Test {
    public static void main(String[] args) {
        div(10,0);
    }
    //除法运算
    private static void div(int num1,int num2){
        try {
            int result = num1 / num2;
            System.out.println("result="+result);

        }catch (ArithmeticException e){ //数学算数异常
            System.out.println("除数不能为0");
        }
        System.out.println("程序运行结束");
    }
}

二、try_catch_finally

1、catch

catch可以有多个异常,顺序为从子类到父类:

package yichang;

public class Test {
    public static void main(String[] args) {
        div(10,0);
    }
    //除法运算
    private static void div(int num1,int num2){
        int[] arr = {1,2,3,4,5};
        try {
            System.out.println(arr[4]); //数组下标越界
            arr=null;
            System.out.println(arr.length);
            int result = num1 / num2;
            System.out.println("result="+result);

        }catch (ArithmeticException e){
            System.out.println("除数不能为0");
        }catch (ArrayIndexOutOfBoundsException e){
            System.out.println("数组下标越界");
        }catch (NullPointerException e){
            System.out.println("空指针异常");
        }
        System.out.println("程序运行结束");
    }
}

 catch异常的父类:

package yichang;

public class Test {
    public static void main(String[] args) {
        div(10,0);
    }
    //除法运算
    private static void div(int num1,int num2){
        int[] arr = {1,2,3,4,5};
        try {
            System.out.println(arr[4]); //数组下标越界
            arr=null;
            System.out.println(arr.length); //空指针
            int result = num1 / num2;
            System.out.println("result="+result);

        }catch (Exception e){
            System.out.println("出错了!异常类型为:"+e);
        }
        System.out.println("程序运行结束");
    }
}

2、异常处理过程分析

一旦产生异常,则系统会自动产生一个异常类的实例化对象;

此时如果存在了try语句,则自动会找到匹配的catch语句执行,如果没有异常,则程序退出,系统报告错误;

所有的catch根据方法的参数匹配异常类的实例化对象,如果匹配成功,侧表示由此catch进行处理;

3、finally

表示有没有异常都会执行的代码块

/**
* 面试题:final会不会执行   会
*
*/
package yichang;

public class Test {
    public static void main(String[] args) {
        method();
    }
    //除法运算
    private static int method(){
        int a=10;
        int b=5;
        try{
            System.out.println("a="+a);
            System.out.println("b="+b);
            int c = a/b;
            System.out.println("a/b="+c);
            return c;
        }catch (Exception e){
            //代码测试时使用
            e.printStackTrace();//打印栈信息
        }finally {
            System.out.println("finally");
        }
        return -1;
    }
}

三、throw_throws与异常规则

1、throw throws

throws关键字主要在方法的声明上使用,表示方法中不处理异常,而交给调用处处理。实际上对于Java程序来讲,如果没有加入任何的异常处理,默认有JVM进行异常的处理操作。

throw关键字表示在程序中手动抛出一个异常,因为从异常处理机制来看,所有的异常一旦产生之后,实际上抛出的就是一个异常类的实例化对象,那么此对象也可以有throw直接抛出。

两者一般在一起用

package yichang;

public class Test1 {
    public static void main(String[] args) {
        div2(10,0);
    }
    private static int div2(int a,int b) throws ArithmeticException{
       try{
           int c=a/b;
           return c;

       }catch (ArithmeticException e){
           throw new ArithmeticException("除数不能为0");
       }finally {
           System.out.println("运行结束");
       }
    }
}

 throw在方法内使用,throws在方法声明中使用

2、异常处理的语法规则

i、try语句不能单独存在,可以和catch、finally组成try...catch...finally、try...catch、try...finally三种结构,catch语句可以有一个或多个,finally语句最多一个,try、catch、finally这三个关键字均不能单独使用。

ii、try、catch、finally三个代码块中变量的作用域分别独立而不能相互访问。、

iii、多个catch块时候,java虚拟机会匹配其中一个异常类或其子类,就执行这个catch块,而不会在执行别的catch块。

package yichang;

import java.util.InputMismatchException;
import java.util.Scanner;

public class Test1 {
    public static void main(String[] args) {
        input();
    }
    private static void input(){
        Scanner input = new Scanner(System.in);
        try {
            int i = input.nextInt();
            System.out.println(i);
        }catch (InputMismatchException e){
            System.out.println("输入不匹配");
        }

    }
}

四、自定义异常与assert

在Java中,已经提供了很多异常类的定义,但是我们实际开发中,可能需要一些自己的异常类,那么可以通过继承Exception类或已有的异常类的方式完成一个自定义异常类的操作。

自定义异常通常都是通过继承一个异常类来实现

Throwable、Exception、RuntimeException

自定义异常通常的实现是,重写父类的构造方法;异常对象本身没有实际功能,只是一个有意义的标识。

1、自定义异常

异常类

package yichang;

public class MyException extends Exception {
    public MyException(){
        super();
    }
    public MyException(String message){
        super(message);
    }
}

 用户类

package yichang;

public class User {
    private String name;
    private  String password;
    private int age;
    private String sex;
    public User() {
        super();
    }
    public User(String name, String password, int age, String sex) {
        super();
        this.name = name;
        this.password = password;
        this.age = age;
        this.sex = sex;
    }
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
    public String getPassword() {
        return password;
    }
    public void setPassword(String password) {
        this.password = password;
    }
    public int getAge() {
        return age;
    }
    public void setAge(int age) {
        this.age = age;
    }
    public String getSex() {
        return sex;
    }
    public void setSex(String sex) {
        this.sex = sex;
    }
    @Override
    public String toString() {
        return "User{" +
                "name='" + name + '\'' +
                ", password='" + password + '\'' +
                ", age=" + age +
                ", sex='" + sex + '\'' +
                '}';
    }
}

 用户使用

package yichang;

public class UserService {
    public User login(String username,String password)throws MyException {
        if(!"admin".equals(username)){
            throw new MyException("用户名错误");
        }
        if(!"12345".equals(password)){
            throw new MyException("密码错误");
        }
        User user = new User("admin","12345",18,"男");
        return user;
    }
}

 测试demo

package yichang;

import java.util.Scanner;

public class LonginDemo {
    public static void main(String[] args) {
        System.out.println("请输入用户名");
        Scanner input = new Scanner(System.in);
        String name = input.nextLine();
        System.out.println("请输入密码");
        String pass = input.nextLine();

        UserService us = new UserService();
        try {
            User user = us.login(name,pass);
            System.out.println("登录成功");
            System.out.println(user);
        } catch (MyException e) {
            e.printStackTrace();
        }

    }
}

2、受检和非受检异常

i、受检异常:Exception

定义方法时必须声明所有可能会抛出的exception;在调用这个方法时,必须捕获它的checked exception,不然就得把它的exception传递下去;exception是从java.lang.Exception类衍生出来的。例如:IOException,SQLException就属于Exception;

ii、非受检异常:RuntimeException

在定义方法时不需要声明会抛出runtime exception;在调用这个方法时不需要捕获这个runtime exception;runtime exception是从java.lang.RuntimeException或者java.lang.Error类衍生出来的。例如:NullPointException,IndexOutOfBoundsException就属于runtime exception;

iii、面试题

Exception与RuntimeException区别

Exception:受检异常,在编译器检查,在调用抛出这个异常的方法时,必须显示的使用try...catch...

RuntimeException:非受检异常,在运行期检查,在调用抛出异常的方法时,可以不用显示的使用try...catch...

在定义异常时,根据实际业务选择使用

3、assert

assert关键字,表示断言

当程序执行到某个固定位置的时候,程序中的某个变量的取值肯定是预期的结果,那么这种操作可以使用断言完成。

语法:

assert 表达式;

package yichang;

public class AssertDemo {
    public static void main(String[] args) {
        int result = add(10,10);
        assert result ==10:"结果不正确";
    }
    private static int add(int a,int b){
        return a+b;
    }
}

五、新特性与debug技术

1、新特性

jdk1.5后出现Scanner输入,1.5之前接受控制台输入,直接使用IO流,通过BufferedReader

try{

        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));

        String info = br.readLine();

        //br.close()

}catch(IOException|NumberFormatException e){//简介catch,但是要写并列的异常

        e.printStackTrace();

}

 这种使用就可以自动关闭流,不需要手动关闭

2、debug

调试时程序员编码过程中找逻辑错误的一个很重要的手段;

断点:遇到断点,暂挂,等候命令

debug as --> Java Application

 Rerun 'xxxx':重新运行程序,会关闭服务后重新启动程序。

Update 'tech' application (Ctrl + F5):更新程序,一般在你的代码有改动后可执行这个功能。而这个功能对应的操作则是在服务配置里,如图2.3。

 Resume Program (F9):恢复程序,比如,你在第20行和25行有两个断点,当前运行至第20行,按F9,则运行到下一个断点(即第25行),再按F9,则运行完整个流程,因为后面已经没有断点了。

Pause Program:暂停程序,启用Debug。目前没发现具体用法。

Stop 'xxx' (Ctrl + F2):连续按两下,关闭程序。有时候你会发现关闭服务再启动时,报端口被占用,这是因为没完全关闭服务的原因,你就需要查杀所有JVM进程了。

View Breakpoints (Ctrl + Shift + F8):查看所有断点,后面章节会涉及到。

Mute Breakpoints:哑的断点,选择这个后,所有断点变为灰色,断点失效,按F9则可以直接运行完程序。再次点击,断点变为红色,有效。如果只想使某一个断点失效,可以在断点上右键取消

 注意:需要debug模式启动项目

 

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

JAVA笔记--异常处理(第一篇) 的相关文章

  • 我可以确定谁在调用 Java 中的函数或实例化类吗? [复制]

    这个问题在这里已经有答案了 可能的重复 在Java中 如何使用堆栈跟踪或反射找到方法的调用者 https stackoverflow com questions 421280 in java how do i find the caller
  • 检查发送到网页的请求数

    我正在编写一个 Java 多线程应用程序 它可以访问不同 Web 服务器的数百万个 有时甚至数十亿个 URL 这个想法是检查这些 URL 是否给出有效的 200OK 响应或 404 其他代码 我如何知道我的程序是否不会在他们的服务器上造成高
  • Spring boot 2.0.5.RELEASE和mongo 4.0连接问题

    我正在关注使用 MongoDB 访问数据教程春季网站 https spring io guides gs accessing data mongodb 我将 Mongo DB 服务器版本 4 安装为服务当我使用客户端连接到它时 它的身份验证
  • 使用正则表达式验证输入字符串是否为 0-255 之间的数字

    我在将输入字符串与正则表达式匹配时遇到问题 我想验证输入数字在 0 255 之间并且长度最多应为 3 个字符 代码工作正常 但当我输入 000000 至任意长度时 显示 true 而不是 false 这是我的代码 String IP 000
  • 如何将抽象工厂与单例模式结合起来? [关闭]

    Closed 这个问题不符合堆栈溢出指南 help closed questions 目前不接受答案 我正在用 java 编码 并且对这些模式很陌生 谁能给我一个也使用单例的工厂抽象的例子 这是一个实现类的示例单例模式 这个实现也是线程安全
  • Java Spark DataFrameReader java.lang.NegativeArraySizeException

    学习 Spark for java 并尝试阅读 csv文件为DataFrame使用DataFrameReader 甚至不能得到一个超级简单的 csv文件工作 因为我不断收到异常java lang NegativeArraySizeExcep
  • 如何为java注释处理器编写自动化单元测试?

    我正在尝试使用 java 注释处理器 我可以使用 JavaCompiler 编写集成测试 事实上我现在正在使用 hickory 我可以运行编译过程并分析输出 问题 即使我的注释处理器中没有任何代码 单个测试也会运行大约半秒 对于以 TDD
  • 强制 Java 最低版本以“java -version:”运行在 Windows 上不起作用

    我想强制应用程序运行的 JVM 最低版本为 1 6 或更高版本 即 1 6 我的理解是 您可以使用 version 命令行参数来执行此操作 我尝试了一下 在Linux下似乎可以正常工作 但在Windows下却不行 LINUX 我在 Linu
  • SwingWorker 在另一个 SwingWorker 的 did 方法中

    首先 我需要通知您 我正在尽最大努力学习如何用 Java 编写代码 虽然有点困难 但我相信我能做到 我过去提交了几个有关 SwingWorkers 等的问题 每一个我都以为我已经做到了 但后来发现我仍然需要学习 希望这一次不是那样的一次 话
  • 在 Java 中创建带注释的对象时收到通知

    Intent 我有一个自定义 Java 注释 DynamicField public class RESTEndpointInvoker DynamicField key httpTimeout private long httpTimeo
  • java中日期转换dd-MMM-yyyy到dd-MM-yyyy

    在Java中将23 Mar 2011转换为23 03 2011的最简单方法是什么 感谢大家 这似乎解决了这个问题 try Calendar cal Calendar getInstance cal setTime new SimpleDat
  • 使用 Box2d(适用于 Android)进行碰撞检测?

    有人可以解释一下使用 box2d for android 进行碰撞检测的工作原理吗 我无法理解 BBContactListener 以什么方式工作 BBContactListener listener new BBContactListen
  • bufferedinputstream 中标记读取限制有什么用

    我是Java流的新手 我想读取特定的文件内容 然后需要从头开始读取 我创建了一个 BufferedInputStream 但我对 BufferedInputStream mark int markLimit 的文档感到困惑 文档说 publ
  • 如何列出hadoop hdfs中目录及其子目录中的所有文件

    我在 hdfs 中有一个文件夹 其中有两个子文件夹 每个子文件夹大约有 30 个子文件夹 最后 每个子文件夹都包含 xml 文件 我想列出所有 xml 文件 仅给出主文件夹的路径 在本地我可以这样做apache commons io 的 h
  • Java 中更高级的泛型

    假设我有以下课程 public class FixExpr Expr
  • Java 验证日期为 yyyyMMddHHmmss

    我想在java中验证给定的日期格式为yyyyMMddHHmmss 状况 应符合格式 yyyyMMddHHmmss 它应该验证当前日期 它应该验证与当前小时有 3 小时或 3 小时差异的小时数 如果满足所有三个条件 Java 方法应返回 tr
  • ASTParser:解析绑定后查找声明节点

    我创建了一个启用了绑定的 AST 当我稍后解析绑定时 我得到了一个有效的 ITypeBinding 但是 当我想要获取绑定的声明 Node 时 它 总是返回 null 除非 ITypeBinding 在 sourceFile 中声明 这是我
  • Spring Transactional 减慢了整个过程

    我正在尝试分析我有两堂课的情况 其中一个类是 ProcessImpl 它是起点并在内部调用其他子事务 我不知道出了什么问题 processImpl正在导入一些东西并将相关数据写入数据库 Specs Spring orm版本 3 2 18 发
  • Struts2中的变量声明

    Struts2中如何声明变量并为该变量赋值 使用设置标签
  • 使用正则表达式匹配阿拉伯文文本

    我试图使用正则表达式仅匹配阿拉伯语文本 但出现异常 这是我的代码 txt matches P Arabic 这是例外情况 线程 main 中的异常 java util regex PatternSyntaxException 索引 9 附近

随机推荐

  • VB6反编译详解

    标 题 VB6反编译详解 一 作 者 kenmark时 间 2006 07 09 16 59 链 接 http bbs pediy com showthread php threadid 28715 详细信息 VB6反编译详解 by Ken
  • Juc04_阻塞队列概述、方法、实现类、Linked和Array区别、注意事项

    文章目录 什么是阻塞队列 BlockingQueue的主要方法 BlockingQueue的实现类 Linked和Array区别 不推荐使用快捷的线程池 什么是阻塞队列 阻塞队列 从名字可以看出 它也是队列的一种 那么它肯定是一个先进先出F
  • 在 Shell 中用 echo 输出变量丢失换行符的问题

    原文链接 http hi baidu com moligaloo item b404cf0736d085dd72e6765f 若 foo txt 是一个含有多行文本的文本文件 如 hello world 使用如下命令 foo cat foo
  • chrome浏览器如何避免network报错:ERR_CERT_AUTHORITY_INVALID并添加为例外或继续前往

    版权声明 转载请注明作者 独孤尚良dugushangliang 出处 https blog csdn net dugushangliang article details 101421339 本文接续https blog csdn net
  • 事务故障、系统故障和介质故障的恢复

    数据库系统 故障与恢复 事务故障 系统故障和介质故障的恢复 1 事务故障的恢复 2 系统故障的恢复 3 介质故障的恢复 重装数据库 然后重做已完成的事务 1 事务故障的恢复 1 反向扫描日志文件 查找该事务的更新操作 2 对该事务的更新执行
  • hid自定义report 影响键盘_基于STM32CUBE的USB键盘例程.docx

    前面说了USB鼠标 这次趁热打铁 说一下USB键盘 依然只说如何修改 不说背后的原理 原因你懂的 涉及的知识点太多了 会不会写成USB三部曲 不知道 猜猜我下一步再写个啥 1 生成工程 首先 STM32CubeMX的配置部分不说了 和USB
  • (三)高德地图之自定义缩放及缩放动画效果

    这一节主要实现的功能是地图的自定义缩放及缩放的动画效果 还是直接放上代码更直观些 主要部位里面基本有注解 还是老样子 首先是新建activity zoom animate xml布局文件
  • Unity urp2d ShaderGraph 实现一个黑白转彩色的场景渐变效果 设计思路

    设计背景 2022网易MG比赛 策划案里关卡背景是一个信中被损坏的场景 主角要去修复这个场景的故事 然后原本的场景呈现黑白色的效果 但主角旁边画面是彩色的 关卡结局还要有镜头拉远 然后整个画面以主角为中心扩散恢复颜色的视觉效果 效果展示 项
  • 为什么说Python是普通人编程领域的王者

    点击上方 菜鸟学Python 选择 星标 公众号 超级无敌干货第一时间推给你 Python 自上个世纪诞生 一直过着不温不火的生活 直到近几年 乘着数据科学的东风 从低调的脚本小兵 成为了全能型的战士 同时也被被培训机构狠狠地炒火了一把 然
  • 稀疏数组

    稀疏数组 1 什么是稀疏数组 稀疏数组可以看做是普通数组的压缩 但是这里说的普通数组是值无效数据量远大于有效数据量的数组 下面蓝色的就是普通的二维数组转换成稀疏数组的形式 2 为什么要用稀疏数组 当二维数组中的很多值的默认值为0 因此也记录
  • iOS开发多线程-线程间的通信

    一 简单说明 线程间通信 在1个进程中 线程往往不是孤立存在的 多个线程之间需要经常进行通信 线程间通信的体现 1个线程传递数据给另1个线程 在1个线程中执行完特定任务后 转到另1个线程继续执行任务 线程间通信常用方法 void perfo
  • 05-----检测某个端口是否开放和查看服务器防火墙状态

    1 检测某个端口是否开放 nc vv 192 168 1 117 8890 结果 2 查看服务器防火墙状态 service firewalld status 或者使用下面的命令查看防火墙状态 主要看系统 systemctl status f
  • CCNP学习考试心得(转)

    CCNP学习考试心得 转 more 当计算机屏幕上显示 Congralation时 我不禁长出一口气 心中想 终于考完了 我所说的终于考完是指 我终于完成了ccnp的考试 四个月的学习 对于某些人来说可能太长了 但是要真正掌握ccnp的内容
  • C++学习系列之打印金字塔和倒金字塔

    实例要求 用符号 打印一个金字塔 用符号 打印一个倒金字塔 金字塔代码 include
  • VSCode中开发JavaWeb项目(Maven+Tomcat+热部署)

    1 安装插件 首先需要安装所用到的插件 分别用来支持Java 热部署和Tomcat服务器的插件 在插件市场中搜索Java 第一个就是Extension Pack for Java 内置了6个依赖插件 直接一键安装即可 然后是热部署插件 市场
  • python recvfrom设置超时_如何在python的socket recv方法上设置超时?

    我需要在python的socket recv方法上设置超时 怎么做 仅供参考 如果您选择使用超时 您需要知道如何处理超时 这个SO问题讨论了超时发生时的处理 stackoverflow com questions 16745409 典型的方
  • elementui实现横向时间轴_横向时间轴(进度条)

    1 2 3 4 5 6 7 8 9 10 timeline box 11 width 100 12 height 8rem 13 position relative 14 15 16 timeline container 17 height
  • 2023 年及未来最佳的软件构建工具

    当今世界 加快任务完成速度和尽可能减少人力投入是一切事物都需要关注的问题 软件开发也不例外 无论你在哪个领域 游戏 区块链 还是应用创建 软件开发的竞争都异常激烈 只要能够帮助到你 采用任何手段都无关紧要 而这也正是构建工具的作用 这些工具
  • Linux——I/O复用(2)—— poll和epoll

    poll原型 poll系统调用和select类似 也是在指定时间内轮询一定数量的文件描述符 以 测试其是否有就绪者 int poll struct pollfd fds int nfds int timeout fds struct pol
  • JAVA笔记--异常处理(第一篇)

    目录 一 异常概念 1 什么是异常 2 try与catch关键字 二 try catch finally 1 catch 2 异常处理过程分析 3 finally 三 throw throws与异常规则 1 throw throws 2 异