Java基础回顾——异常处理

文章目录

  • 介绍
  • 语法
    • 抛出异常
    • 方法定义使用throws
    • 多catch
    • finally
  • 自定义异常
  • 断言
  • logging
  • 其他日志库
    • commons logging
    • Log4j

介绍

一些错误是用户造成的(类型输入错误),一些错误的随机出现(网络终端、内存耗尽。。。),并且永远不可能避免

获取失败信息:

1、约定错误码

2、异常处理机制

Java内置了一套异常处理机制,使用异常来表示错误
异常是一种class,可以在任何地方抛出,但只需要在上层捕获,这样就和方法调用分离了

在这里插入图片描述

Error表示严重错误,程序对此一般无能为力
Exception是运行时错误,可以被捕获并处理;
Exception分为两大类:
1、RuntimeException以及它的子类
2、非RuntimeException

Java规定:
1、必须捕获的异常,包括Exception及其子类,但不包括RuntimeException及其子类,这种类型的异常称为Checked Exception
2、不需要捕获的异常,包括Error以及子类,RuntimeException及其子类

语法

抛出异常

捕获异常使用try—catch—语句

public class Main {public static void main(String[] args) {byte[] bs = toGBK("中文");System.out.println(Arrays.toString(bs));}static byte[] toGBK(String s) {try {// 用指定编码转换String为byte[]:return s.getBytes("GBK");} catch (UnsupportedEncodingException e) {// 如果系统不支持GBK编码,会捕获到UnsupportedEncodingException:System.out.println(e); // 打印异常信息return s.getBytes(); // 尝试使用用默认编码}}
}

方法定义使用throws

方法定义的时候,使用throws表示该方法抛出的异常类型,调用方在调用的时候必须强制捕获这些异常,否则编译器会报错

public class Main {public static void main(String[] args) {try {byte[] bs = toGBK("中文");System.out.println(Arrays.toString(bs));} catch (UnsupportedEncodingException e) {System.out.println(e);}}static byte[] toGBK(String s) throws UnsupportedEncodingException {// 用指定编码转换String为byte[]:return s.getBytes("GBK");}
}

多catch

每个catch分别捕获对应的Exception及其子类。
存在多个catch的时候,catch的顺序非常重要:子类必须写在前面。

public static void main(String[] args) {try {process1();process2();process3();} catch (UnsupportedEncodingException e) {System.out.println("Bad encoding");} catch (IOException e) {System.out.println("IO error");}
}

finally

无论是否有异常发生,都希望执行一些语句,finally语句块保证有无错误都会执行。

public static void main(String[] args) {try {process1();process2();process3();} catch (UnsupportedEncodingException e) {System.out.println("Bad encoding");} catch (IOException e) {System.out.println("IO error");} finally {System.out.println("END");}
}

自定义异常

常见的做法是自定义一个BaseException作为“根异常”,然后,派生出各种业务类型的异常。

BaseException需要从一个适合的Exception派生,通常建议从RuntimeException派生:

public class BaseException extends RuntimeException {
}

其他业务类型的异常就可以从BaseException派生:

public class UserNotFoundException extends BaseException {
}public class LoginFailedException extends BaseException {
}...

断言

断言(Assertion)是一种调试程序的方式。在Java中,使用assert关键字来实现断言。

public static void main(String[] args) {double x = Math.abs(-123.45);assert x >= 0;System.out.println(x);
}

语句assert x >= 0;即为断言,断言条件x >= 0预期为true。如果计算结果为false,则断言失败,抛出AssertionError。

使用assert语句时,还可以添加一个可选的断言消息:

assert x >= 0 : "x must >= 0";

Java断言的特点是:断言失败时会抛出AssertionError,导致程序结束退出。因此,断言不能用于可恢复的程序错误,只应该用于开发和测试阶段。

JVM默认关闭断言指令,即遇到assert语句就自动忽略了,不执行。

要执行assert语句,必须给Java虚拟机传递-enableassertions(可简写为-ea)参数启用断言。

logging

代码改好删除System.out.println()非常麻烦

日志就是Logging,它的目的是为了取代System.out.println()。

输出日志,而不是用System.out.println(),有以下几个好处:

  • 可以设置输出样式,避免自己每次都写"ERROR: " + var;
  • 可以设置输出级别,禁止某些级别输出。例如,只输出错误日志;
  • 可以被重定向到文件,这样可以在程序运行结束后查看日志;
  • 可以按包名控制日志级别,只输出某些包打的日志;
  • 可以……

Java标准库内置了日志包java.util.logging,可以直接用

日志的输出可以设定级别。JDK的Logging定义了7个日志级别,从严重到普通:

SEVERE
WARNING
INFO
CONFIG
FINE
FINER
FINEST

默认级别是INFO,因此,INFO级别以下的日志,不会被打印出来。使用日志级别的好处在于,调整级别,就可以屏蔽掉很多调试相关的日志输出。

其他日志库

commons logging

第三方日志库,由apache创建的日志模块

下载地址:https://commons.apache.org/proper/commons-logging/download_logging.cgi

下载后,解压,jar文件与Java文件放到同一个目录

使用:

第一步,通过LogFactory获取Log类的实例; 第二步,使用Log实例的方法打日志。

Log4j

是一个非常流行的日志框架

通过配置文件配置

下载地址:https://logging.apache.org/log4j/2.x/download.html

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

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

相关文章

20倍压缩比!微软提出大模型提示压缩框架LLMLingua

近期,越来越多研究在探索大型语言模型(LLM)在实际应用中的推理和生成能力。随着 ChatGPT 等模型的广泛研究与应用,如何在保留关键信息的同时,压缩较长的提示成为当前大模型研究的问题之一。 为了加速模型推理并降低成本…

题目讲解(1到5)

1 编写一个能够输出 Hello,World! 的程序。 提示: 使用英文标点符号;Hello,World! 逗号后面没有空格。H 和 W 为大写字母。 输入格式 无 输出格式 无 输入输出样例 输入 #1复制 无 输出 #1复制 Hello,World! 这个不会写没啥讲的自裁吧,程序…

C : DS二叉排序树之删除(详细思路解答)

Description 给出一个数据序列,建立二叉排序树,并实现删除功能 对二叉排序树进行中序遍历,可以得到有序的数据序列 Input 第一行输入t,表示有t个数据序列 第二行输入n,表示首个序列包含n个数据 第三行输入n个数据…

JS逆向实战——开发者工具检测

说明:仅供学习使用,请勿用于非法用途,若有侵权,请联系博主删除 作者:zhu6201976 一、背景 在JS逆向领域,Chrome开发者工具是核心,抓包、调试、看调用栈等都离不开它。可以说,逆向人…

Linux基础入门笔记

Linux基础入门笔记,具体可见下载链接 大家阅读时可善用目录功能,可以提高大家的阅读效率 下载地址:Linux笔记 初始linux 操作系统:操作系统是用户和计算机硬件之间的桥梁,调度和管理计算机硬件进行工作常见操作系统 W…

【算法Hot100系列】删除链表的倒数第 N 个结点

💝💝💝欢迎来到我的博客,很高兴能够在这里和您见面!希望您在这里可以感受到一份轻松愉快的氛围,不仅可以获得有趣的内容和知识,也可以畅所欲言、分享您的想法和见解。 推荐:kwan 的首页,持续学…

什么牌子猫粮比较好?质量口碑较好的主食冻干猫粮分享

由于猫咪是肉食动物,对蛋白质的需求很高,如果摄入的蛋白质不足,就会影响猫咪的成长。而冻干猫粮本身因为制作工艺的原因,能保留原有的营养成分和营养元素,所以冻干猫粮蛋白含量比较高,营养又高,…

自定义 spring-boot组件自动注入starter

1&#xff1a;创建maven项目 2&#xff1a;pom文件 <?xml version"1.0" encoding"UTF-8"?> <project xmlns"http://maven.apache.org/POM/4.0.0" xmlns:xsi"http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocati…

javaSE学习-4-类和对象

1. 面向对象的初步认知 1.1 什么是面向对象 面向对象编程&#xff08;OOP&#xff09;是一种程序设计范式&#xff0c;它将程序中的数据和操作数据的方法封装到对象中。在面向对象的世界里&#xff0c;一切都被视为对象&#xff0c;这些对象可以拥有数据&#xff08;成员变量&…

SQL面试题挑战01:打折日期交叉问题

目录 问题&#xff1a;SQL解答&#xff1a;第一种方式&#xff1a;第二种方式&#xff1a; 问题&#xff1a; 如下为某平台的商品促销数据&#xff0c;字段含义分别为品牌名称、打折开始日期、打折结束日期&#xff0c;现在要计算每个品牌的打折销售天数&#xff08;注意其中的…

【IDEA】Intellij IDEA相关配置

IDEA 全称 IntelliJ IDEA&#xff0c;是java编程语言的集成开发环境。IntelliJ在业界被公认为最好的Java开发工具&#xff0c;尤其在智能代码助手、代码自动提示、重构、JavaEE支持、各类版本工具(git、svn等)、JUnit、CVS整合、代码分析、 创新的GUI设计等方面的功能可以说是超…

lua安装

lua安装 1.Lua介绍 特点&#xff1a;轻量、小巧。C语言开发。开源。 设计的目的&#xff1a;嵌入到应用程序当中&#xff0c;提供灵活的扩展和定制化的功能。 luanginx&#xff0c;luaredis。 2.windows安装lua windows上安装lua&#xff1a; 检查机器上是否有lua C:\U…