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

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 {@Overrideprotected void finalize() throws Throwable {// 对象的资源清理操作}
}

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

JVM命令行监控工具

JVM命令行监控工具 概述 性能诊断是软件工程师在日常工作中需要经常面对和解决的问题&#xff0c;在用户体验至上的今天&#xff0c;解决好应用的性能问题能带来非常大的收益。 Java作为最流行的编程语言之一&#xff0c;其应用性能诊断一直受到业界广泛关注&#xff0c;可能…

vue3 集成 tailwindcss

tailwindcss 介绍 Tailwind CSS 是一个流行的前端框架&#xff0c;用于构建现代、响应式的网页和 Web 应用程序。它的设计理念是提供一组可复用的简单、低级别的 CSS 类&#xff0c;这些类可以直接应用到 HTML 元素上&#xff0c;从而加速开发过程并提高样式一致性。 主要特点…

超市微信小程序是怎么做的

市微信小程序是利用微信小程序平台为超市或零售商提供线上销售服务的一种应用。通过小程序&#xff0c;超市可以向消费者提供更加便捷、快速、个性化的购物体验&#xff0c;从而提升销售业绩、增加客户满意度。以下是超市微信小程序可以实现的一些主要功能。 一、商品展示与搜索…

linux centos出现No space left on device解决方案

问题是因为系统磁盘空间不足 解决方法: 找到那个磁盘不足问题 df -lh 发现/dev/mapper/cl-root磁盘已用50G,有如下 解决方案&#xff1a; 1、如果是虚拟机可以通过分配空间使其空间增加 2、将其他不常用磁盘空间分配给cl-root如&#xff08; /dev/mapper/cl-home &#…

XSS原理

原理&#xff1a; 这是一种将任意 Javascript 代码插入到其他Web用户页面里执行以达到攻击目的的漏洞。攻击者利用浏览器的动态展示数据功能&#xff0c;在HTML页面里嵌入恶意代码。当用户浏览改页时&#xff0c;这些潜入在HTML中的恶意代码会被执行&#xff0c;用户浏览器被攻…

6-3 递增的整数序列链表的插入 分数 5

List Insert(List L, ElementType X) {//创建结点List node (List)malloc(sizeof(List));node->Data X;node->Next NULL;List head L->Next; //定位real头指针//空链表 直接插入if (head NULL) {L->Next node;node->Next head;return L;}//插入数据比第…

哈夫曼树哈夫曼编码知识点

目录 前言 哈夫曼树 1.相关背景 2.基本概念 3.什么是哈夫曼树 3.特点 4.哈夫曼树的构造&#xff08;哈夫曼算法&#xff09; 5.带权路径长度计算 哈夫曼编码&#xff08;哈夫曼树的应用&#xff09; 1.基本概念 2.编码方式 3.编码依据 4.小试牛刀&#xff08;习题&am…

智慧楼宇3D数据可视化大屏交互展示实现了楼宇能源的高效、智能、精细化管控

智慧园区是指将物联网、大数据、人工智能等技术应用于传统建筑和基础设施&#xff0c;以实现对园区的全面监控、管理和服务的一种建筑形态。通过将园区内设备、设施和系统联网&#xff0c;实现数据的传输、共享和响应&#xff0c;提高园区的管理效率和运营效益&#xff0c;为居…

socket can查看详细信息 命令 ip -details -statistics link show can0

ip -details -statistics link show can0 ip -details link show can0 ip -statistics link show can0 也可以像第一行那样结合使用

Synchronized的实现和锁升级

1.JVM是如何处理和识别Synchronized的&#xff1f; 我们从字节码角度分析synchronized的实现&#xff1a; Synchronized(锁对象){}同步代码块底层实现方式是monitorenter和monitorexit指令。 修饰普通同步方法时底层实现方式是执行指令会检查方法是否设置ACC_SYNCHRONIZED&am…

登陆认证权限控制(1)——从session到token认证的变迁 session的问题分析 + CSRF攻击的认识

前言 登陆认证&#xff0c;权限控制是一个系统必不可少的部分&#xff0c;一个开放访问的系统能否在上线后稳定持续运行其实很大程度上取决于登陆认证和权限控制措施是否到位&#xff0c;不然可能系统刚刚上线就会夭折。 本篇博客回溯登陆认证的变迁历史&#xff0c;阐述sess…

如何打造一个网络框架模块对接服务器

一、了解网络框架的基本原理 在开始打造网络框架模块之前&#xff0c;首先需要了解网络框架的基本原理。网络框架是一个软件模块&#xff0c;用于处理网络通信的各种细节&#xff0c;包括数据传输、协议解析、错误处理等。常见的网络框架有HTTP、TCP/IP、WebSocket等。 对啦&…

在Remix中编写你的第一份智能合约

智能合约简单来讲就是&#xff1a;部署在去中心化区块链上的一个合约或者一组指令&#xff0c;当这个合约或者这组指令被部署以后&#xff0c;它就不能被改变了&#xff0c;并会自动执行&#xff0c;每个人都可以看到合约里面的条款。更深层次的理解就是&#xff1a;这些代码会…

微信小程序案例:2-2本地生活

文章目录 一、实现步骤&#xff08;一&#xff09;创建项目&#xff08;二&#xff09;创建页面&#xff08;三&#xff09;准备图片素材&#xff08;四&#xff09;编写页面结构1、编写轮播区域页面结构2、编写九宫格区域页面结构 &#xff08;五&#xff09;编写页面样式1、编…

Redis-持久化机制

持久化机制介绍 RDBAOFRDB和AOF对比 RDB rdb的话是利用了写时复制技术&#xff0c;他是看时间间隔内key值的变化量&#xff0c;就比如20秒内如果有5个key改变过的话他就会创建一个fork子进程&#xff08;bgsave&#xff09;&#xff0c;通过这个子进程&#xff0c;将数据快照进…

Golang网络编程:即时通讯系统Instance Messaging System

系统基本架构 版本迭代 项目改造 无人机是client&#xff0c;我们是server&#xff0c;提供注册登入&#xff0c;场景选择等。信道模拟器是server&#xff0c;我们是client&#xff0c;我们向信道模拟器发送数据&#xff0c;等待信道模拟器计算结果&#xff0c;返回给无人机。…

MFC 鼠标悬停提示框

MFC 鼠标悬停提示框 运行效果 在MFC窗口中添加一个控件 工具栏中拖拽List Box到MFC窗口给List Box添加变量 CListBox m_listbox 增加成员变量 CWnd* m_tip_parent_wnd; CToolTipCtrl m_tip;给m_listbox创建提示框 void create_tip_window(CWnd* tip_wnd, CToolTipCtrl* ti…

[nltk_data] Error loading stopwords: <urlopen error [WinError 10054]

报错提示&#xff1a; >>> import nltk >>> nltk.download(stopwords) 按照提示执行后 [nltk_data] Error loading stopwords: <urlopen error [WinError 10054] 找到路径C:\\Users\\EDY\\nltk_data&#xff0c;如果没有nltk_data文件夹&#xff0c;在…

Magica Cloth 使用方法笔记

Magica Cloth 使用方法笔记 官方使用文档链接&#xff1a; インストールガイド – Magica Soft 鱼儿效果案例&#xff1a; https://www.patreon.com/posts/69459293 安装环境&#xff1a; 关于在Unity 2018.4.12版本 下 导入 Magic Cloth 之前&#xff0c;需要提前置入的…

FreeRTOS学习笔记(一)

一、基础知识思维导图 vtaskdelay函数会开启中断&#xff0c;所以在临界区不能用vtaskdelay 二、任务的创建与删除 2.1、任务的动态创建与删除 ........#define START_TASK_PRIO 1 #define START_TASK_STACK_SIZE 128 TaskHandle_t start_task_handler; void …