12. Java异常及异常处理处理

news2024/9/25 22:40:29

Java —— 异常及处理

        • 1. 异常
        • 2. 异常体系
        • 3. 常见Exception
        • 4. 异常处理
          • 4.1 try finally catch关键字
          • 4.2 throws和throw 自定义异常
          • 4.3 finally,final,finalize三者的区别

1. 异常
异常:在程序执行过程中发生的意外状况,可能导致程序中断或产生错误结果
异常对象:java(面向对象)将错误用类来描述,一旦程序执行错误,将会创建对应的错误对象(用以向程序员或用户展示错误原因等)
异常处理的意义:提高代码的健壮性和可靠性,使程序可以处理非预期的情景,并且继续正常的处理
2. 异常体系
异常超类:Thorwable类(表示可抛出)是所有异常和错误的超类
异常的两个子类:Exception异常类,Error错误异常类
Exception程序捕捉处理的异常:表示由于网络故障、文件损坏、设备错误、用户输入非法等情况导致的异常
Error系统错误:表示Java运行时环境出现的错误(JVM内存资源耗尽)
  • java异常体系图
    在这里插入图片描述

Throwable的父类也是Object,继承其父类的 getClass()和getName()方法

  • 常用方法
// 返回抛出异常的详细信息
public string getMessage();
public string getLocalizedMessage();
//返回异常发生时的简要描述
public public String toString()
//打印异常信息到标准输出流上
public void printStackTrace();
public void printStackTrace(PrintStream s);
public void printStackTrace(PrintWriter s)
//记录栈帧的的当前状态
public synchronized Throwable fillInStackTrace();
package exception;

/**
 * 常见使用方法
 */
public class ExceptionAPI {
    public static void main(String[] args) {
        System.out.println("程序开始!");
        try {
            String line = "1i0";
            System.out.println(Integer.parseInt(line));
        } catch (NumberFormatException e) {
            // 显示红色报错信息
            e.printStackTrace();
            // 获取错误信息
            System.out.println("错误信息:" + e.getMessage());
            System.out.println("错误信息Localized:" + e.getLocalizedMessage());

            System.out.println("简要描述:" + e.toString());
            System.out.println("当前状态:" + e.fillInStackTrace());
        }
        System.out.println("结束");
    }
}
3. 常见Exception
Exception的两类异常:RuntimeException运行时异常(非受控),CheckedException编译时异常(受控)

常见UncheckedException异常

异常异常描述
ArrayIndexOutOfBoundsException数组越界异常
NulPointerException空指针异常
llegalArgumentException非法参数异常
NegativeArraySizeException数组长度为负异常
llegalStateException非法状态异常
ClassCastException类型转换异常

常见RuntimeException异常

异常异常描述
NoSuchFieldException表示该类没有指定名称抛出来的异常
NoSuchMethodException表示该类没有指定方法抛出来的异常
llegalAccessException不允许访问某个类的异常
ClassNotFoundException类没有找到抛出异常
4. 异常处理
4.1 try finally catch关键字

组合:try...catch 对某一段代码可能抛出异常进行的捕获
   try...finally 对一段代码不管执行情况如何,都会走finally中的代码
   try...catch...finally 对异常捕获后,再走fimally中的代码逻辑

  • 异常处理过程:一般是子类型在前,超类型在后

对指定代码内容添加一定包围功能(try…finally)快捷键:ctrl+alt+t

try…catch

package exception;
/**
 * java异常处理机制
 * java异常超类:Throwable
 * 两个子类:Error,表示系统级别错误
 */
public class TryCatch {
    public static void main(String[] args) {
        System.out.println("程序开始执行!");
        // try catch异常处理
        try{
            String line = "";
//             String line = null;
            System.out.println(line.length());
            System.out.println(line.charAt(0));
        } catch (NullPointerException e){
            // 程序没有异常就不会执行该异常处理
            System.out.println("异常:空指针异常!");
        } catch (StringIndexOutOfBoundsException e){
            // try中的代码执行捕获到第一个异常之后,直接跳到相应的处理机制,后面的异常将不再执行
            System.out.println("异常:索引超出范围!");
        } catch (NoSuchFieldError | StackOverflowError e){
            // 多个异常的相同处理机制
            System.out.println("发生异常!");
        } catch (Exception e){
            // 超类异常(多种异常,超类异常一般写在最后)
            System.out.println("出错!");
        }
        System.out.println("执行完毕!");
    }
}

try…catch…finally

package exception;

import java.io.FileOutputStream;
import java.io.IOException;

/**
 * finally 关键字用来创建在 try 代码块后面执行的代码块
 * 无论是否发生异常,finally 代码块中的代码总会被执行
 * 在 finally 代码块中,可以运行清理类型等收尾善后性质的语句
 *
 * @author LongYongchuan
 */
public class FinallyDemo {
    public static void main(String[] args) {
        System.out.println("程序开始!");
        try{
            String line = "11";
            System.out.println(line.length());
        } catch (Exception e) {
            System.out.println("出错了!");
        } finally {
            System.out.println("finally");
        }
        System.out.println("程序结束!");

        FileOutputStream fos = null;
        try {
            fos = new FileOutputStream("./document/fos.txt");
            fos.write(5);
        } catch (IOException e) {
            throw new RuntimeException(e);
        } finally {
            try {
                fos.close();
            } catch (IOException e) {
                throw new RuntimeException(e);
            }
        }
    }
}

编译器的自动关闭特性(只是编译器认可)

  • 只有实现了AutoCloseable接口的类才能在try后面加(进行初始化),java中所有流都实现了该接口
package exception;

import java.io.FileOutputStream;
import java.io.IOException;

public class AutoClose {
    public static void main(String[] args) {
        // 编译器优化代码(只有实现了AutoCloseable接口的类)
        try (
                // 初始化
                FileOutputStream fos = new FileOutputStream("./document/fos.dat")
        ) {
            fos.write(1);
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}
4.2 throws和throw 自定义异常

Java中,异常就是一个对象,它能够被程序员自定义抛出或者应用程序抛出,必须借助于throws和throw 语句来定义抛出异常
throws和throw通常是成对出现的:
      throws 语句用在方法声明后面,表示再抛出异常,由该方法的调用者来处理,抛出一个异常实例
      throw语句用在方法体内,表示抛出异常,由方法体内的语句处理

  • 自定义异常
  • Java异常机制可以保证程序更安全和更健壮,虽然Java类库已经提供很多可以直接处理异常的类,但是有时候为了更加精准地捕获和处理异常以呈现更好的用户体验,需要开发者自定义异常
  • 自定义异常
    1.类名要做到见名知义
    2.必须继承自Exception(直接或间接继承)
    3.提供从超类异常定义的所有构造器
    1. throw和throws通常成对出现(单独的throw对Exception时编译不通过,需要使用throws在方法上对异常抛出处理)
    2. 一般RuntimeException和throw使用,其他异常需结合throw和throws使用,一般不要在main方法上抛出异常(不负责的体现)
    3. 方法中出现throw异常时,throw后面的代码将不执行,而直接进入异常处理机制
  • 自定义异常
package exception;

public class IllegalAgeException extends Exception{
    // alt+insert键生成
    public IllegalAgeException() {
    }

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

    public IllegalAgeException(String message, Throwable cause) {
        super(message, cause);
    }

    public IllegalAgeException(Throwable cause) {
        super(cause);
    }

    public IllegalAgeException(String message, Throwable cause, boolean enableSuppression, boolean writableStackTrace) {
        super(message, cause, enableSuppression, writableStackTrace);
    }
}
  • 抛出异常
package exception;

public class Person{
    private String name;
    private int age;
    private char gender;
    private String[] otherInfo;

    public Person() {
    }

    public Person(String name, int age, char gender, String[] otherInfo) {
        this.name = name;
        this.age = age;
        this.gender = gender;
        this.otherInfo = otherInfo;
    }

    public String getName() {
        return name;
    }

    // 异常处理throws关键字(使用在方法声明之后,抛出异常处理,该异常由方法调用者处理)
    public void setName(String name){
        if (name.length() <= 0 || name.length() >= 5){
            // throw和throws通常成对出现(单独的throw对Exception时编译不通过,需要使用throws在方法上对异常抛出处理)
            throw new RuntimeException("名字长度不符合汉文名字");
        }
        this.name = name;
    }

    public int getAge() {
        return age;
    }

    public void setAge(int age) throws IllegalAgeException{
        // 抛出异常throw关键字
        if (age < 0 || age >100){
            // 一般RuntimeException和throw使用,其他异常需结合throw和throws使用
            throw new IllegalAgeException("年龄不合法");
            // 出现异常时,throw相当于return直接结束,不执行this.age = age;
        }
        this.age = age;
        System.out.println("年龄:" + age);
    }

    public char getGender() {
        return gender;
    }

    public void setGender(char gender) {
        this.gender = gender;
    }

    public String[] getOtherInfo() {
        return otherInfo;
    }

    public void setOtherInfo(String[] otherInfo) {
        this.otherInfo = otherInfo;
    }

}
  • 异常处理
package exception;

/**
 * throw关键字
 */
public class ThrowDemo {
    // 一般不要在main方法上抛出异常
    public static void main(String[] args){
        Person person = new Person();
        // throw单独的异常一般不必须抛出
        person.setName("萨克");

        // 使用throw和throws抛出的异常必须处理
        try {
            // 方法调用者处理异常
            person.setAge(50);

        } catch (IllegalAgeException e) {
            throw new RuntimeException(e);
        }
        System.out.println("此人姓名:" + person.getName());
    }
}

注:
  允许子类方法抛出父类方法的部分异常
  允许子类方法不再抛出异常
  允许子类方法抛出父类方法声明的子类型异常


  不允许子类方法抛出额外异常
  不允许子类方法抛出父类方法声明异常的超类型异常

4.3 finally,final,finalize三者的区别
  • finally 关键字用于定义在 try-catch 语句块中始终执行的代码块
  • final 关键字用于修饰类、方法和变量,分别表示最终类、最终方法和常量
  • finalize() 方法是 Object 类中的方法,用于对象在被垃圾回收前进行资源清理的操作
  1. finallyfinally 是 Java 中的一个关键字,用于定义在 try-catch 语句块中的一个代码块。无论是否发生异常,finally 代码块始终会被执行(常用于进行清理工作,例如关闭文件、释放资源等)
try {
    // 可能引发异常的代码
} catch (Exception e) {
    // 异常处理逻辑
} finally {
    // 始终会执行的代码,用于清理工作
}
  1. finalfinal 是用来修饰类、方法和变量的关键字
  • 当用 final 修饰一个类时,表示该类不能被继承,即该类为最终类
  • 当用 final 修饰一个方法时,表示该方法不能被子类重写,即该方法为最终方法
  • 当用 final 修饰一个变量时,表示该变量的值不能被修改,即该变量为常量
final class FinalClass {
    // 最终类,不能被继承
}

class SuperClass {
    final void finalMethod() {
        // 最终方法,不能被重写
    }
}

public class Example extends SuperClass {
    // 尝试重写finalMethod()会导致编译错误
}

class MyClass {
    final int MAX_VALUE = 10; // 常量,不能被修改
}
  1. finalize()finalize() 是 Object 类中的一个方法,用于在对象被垃圾回收前进行资源清理的操作。当垃圾回收器准备回收一个对象时,会先调用其 finalize() 方法(如果该对象重写了该方法),然后才对其进行垃圾回收。通常用于释放非Java堆内存资源,如关闭文件、释放连接等。但是,它已经过时,不推荐使用。
class MyClass {
    @Override
    protected void finalize() throws Throwable {
        // 对象的资源清理操作
    }
}

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

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

相关文章

使用Pritunl OpenVPN远程连接,实现安全高效的远程访问

文章目录 前言1.环境安装2.开始安装3.访问测试4.创建连接5.局域网测试连接6.安装cpolar7.配置固定公网访问地址8.远程连接测试 前言 Pritunl是一款免费开源的 VPN 平台软件&#xff08;但使用的不是标准的开源许可证&#xff0c;用户受到很多限制&#xff09;。这是一种简单有…

印度网络安全:威胁与应对

随着今年过半&#xff0c;我们需要评估并了解不断崛起的网络威胁复杂性&#xff0c;这些威胁正在改变我们的数字景观。 从破坏性的网络钓鱼攻击到利用人工智能的威胁&#xff0c;印度的网络犯罪正在升级。然而&#xff0c;在高调的数据泄露事件风暴中&#xff0c;我们看到了政…

禁用Chrome自动更新

chrome浏览器会强制用户自动更新&#xff0c;每次点击关于google时&#xff0c;会自动检测更新并下载&#xff0c;非常不好 1. 进入%userprofile%\AppData\Local\Google文件夹 2. 找到其中的Update文件夹&#xff0c;右键属性-安全&#xff0c;将所有组/用户的权限设置为拒绝…

8年测试老鸟,性能测试-数据库连接池问题定位/分析,一篇打通...

目录&#xff1a;导读 前言一、Python编程入门到精通二、接口自动化项目实战三、Web自动化项目实战四、App自动化项目实战五、一线大厂简历六、测试开发DevOps体系七、常用自动化测试工具八、JMeter性能测试九、总结&#xff08;尾部小惊喜&#xff09; 前言 1、环境准备 1&a…

JProfiler14.0(Java开发分析)

JProfiler是一款专业的Java应用程序性能分析工具&#xff0c;可帮助开发人员识别和解决Java应用程序中的性能问题。JProfiler支持Java SE、Java EE和Android平台&#xff0c;提供了多种分析选项&#xff0c;包括CPU分析、内存分析和线程分析等。 使用JProfiler&#xff0c;开发…

【手写数字识别】数据挖掘实验二

文章目录 Ⅰ、项目任务要求任务描述&#xff1a;主要任务要求(必须完成以下内容但不限于这些内容)&#xff1a; II、方法思想及实现原理陈述&#xff08;20分&#xff09;算法思想和实现原理数据集描述实验运行环境描述不同方法对MNIST数据集分类识别结果分析(不同方法识别对比…

拍摄的照片怎么做二维码?一分钟在线生成二维码

​手机拍摄的照片怎么做成二维码呢&#xff1f;用二维码来查看图片的方式现在很多人都在使用&#xff0c;其优点在于不占用自身空间&#xff0c;还可以拥有更快速度让他人查看图片内容&#xff0c;常见的图片二维码类型一般有信息展示、照片展示、商品海报、表情包等等。图片二…

2023性能测试入门,其实很简单,看看这篇,好好学习

注&#xff1a;性能测试&#xff0c;入门简单&#xff0c;深入难。经常有同学问&#xff0c;建议看看这篇 。 为了帮助大家快速的入门性能测试&#xff0c;接下来文章将从以下几个方面进行展开&#xff1a; 一、赶鸭子上架要我搞性能测试&#xff0c;怎么办&#xff1f; 二、想…

最新外卖点餐小程序开源源码 支持单店+多店双模式 含完整前后端代码包和搭建教程

随着移动互联网的普及&#xff0c;外卖点餐已成为人们日常生活中不可或缺的一部分。给大家分享一个全新的外卖点餐小程序开源源码&#xff01;该程序支持单店及多店模式&#xff0c;含完整的前后端代码和详细的搭建教程&#xff0c;让您轻松开启外卖点餐业务&#xff01; 一、…

企业数字化之库存管理篇

一、前言 接上一篇 《企业数字化之采购篇》&#xff0c;这一篇我们来了解一下如何做好库存管理&#xff0c;主要还是讲销售型企业成品库存的管理&#xff0c;对于生产制造型企业库存因涉及到物料、半成品、各种消耗品、成品&#xff0c;其存在一定依赖的相关性&#xff0c;会复…

简单强大的时序图绘制工具

今天分享一个简单强大的时序图绘制工具——WaveDrom。 WaveDrom Digital Timing Diagram everywhere WaveDrom draws your Timing Diagram or Waveform from simple textual description. It comes with description language, rendering engine and the editor. WaveDrom edi…

vue-7-vuex

一、Vuex 概述 目标&#xff1a;明确Vuex是什么&#xff0c;应用场景以及优势 1.是什么 Vuex 是一个 Vue 的 状态管理工具&#xff0c;状态就是数据。 大白话&#xff1a;Vuex 是一个插件&#xff0c;可以帮我们管理 Vue 通用的数据 (多组件共享的数据)。例如&#xff1a;购…

浅谈内存函数以及模拟实现

1.memcpy void * memcpy ( void * destination, const void * source, size_t num ); 函数memcpy从source的位置开始向后复制num个字节的数据到destination的内存位置。 这个函数在遇到 \0 的时候并不会停下来。 如果source和destination有任何的重叠&#xff0c;复制的结果都…

小白学习笔记—网络安全/黑客技术

作为一个合格的网络安全工程师&#xff0c;应该做到攻守兼备&#xff0c;毕竟知己知彼&#xff0c;才能百战百胜。 谈起黑客&#xff0c;可能各位都会想到&#xff1a;盗号&#xff0c;其实不尽然&#xff1b;黑客是一群喜爱研究技术的群体&#xff0c;在黑客圈中&#xff0c;一…

【HomeKit】HAT User Manual教程

前言&#xff1a;这篇文章是对于苹果协议文件《HomeKit Accessory Tester (HAT) User Manual》的学习&#xff0c;即 HomeKit配件测试仪(HAT) 用户手册&#xff0c;该版本是第11次修订 第一章 概述 本文档介绍了Apple HomeKit配件测试仪(HAT)的配置和使用方法。HAT是一个Mac应…

家政系统开发,家政保洁维修预约小程序开发;

家政系统是家政行业的专业管理系统软件&#xff0c;功能涉及到家政公司运营的方方面面&#xff0c;包括&#xff1a;推广、营销、管理、培训、周边服务等等&#xff1b; 家政系统功能介绍&#xff1a; 系统集成分销客户裂变、微信推广、团购引流、热文海报推广、短视频引流、搜…

Camera metadata

目录 背景 CameraMetadata基本概念 Google Metadata Google—Metadata结构 官方注释 Aandroid API cameraMetadata头部 : struct camera_metadata camera_metadata_buffer_entry struct camera_metadata_entry data区为什么是一个联合体&#xff1f; camera metadat…

什么是Fetch API?与传统的AJAX相比,有什么优势?

聚沙成塔每天进步一点点 ⭐ 专栏简介 前端入门之旅&#xff1a;探索Web开发的奇妙世界 欢迎来到前端入门之旅&#xff01;感兴趣的可以订阅本专栏哦&#xff01;这个专栏是为那些对Web开发感兴趣、刚刚踏入前端领域的朋友们量身打造的。无论你是完全的新手还是有一些基础的开发…

3分钟学会批量查询快递秘籍

随着网购的普及&#xff0c;我们经常需要查询快递来了解自己的包裹状态。然而&#xff0c;如果一个个手动查询&#xff0c;不仅费时而且麻烦。这时候&#xff0c;一款能够批量查询快递的软件就变得尤为重要。今天&#xff0c;我将向大家介绍一款名为“固乔快递查询助手”的软件…

Linux知识点 -- 网络基础 -- 数据链路层

Linux知识点 – 网络基础 – 数据链路层 文章目录 Linux知识点 -- 网络基础 -- 数据链路层一、数据链路层1.以太网2.以太网帧格式3.重谈局域网原理4.MAC地址5.MTU6.查看硬件地址和MTU的命令7.ARP协议 二、其他重要协议或技术1.DNS&#xff08;Domain Name System&#xff09;2.…