Java异常(比较全)

news2024/11/18 0:07:01

前言:想要学好异常,需要了解JVM虚拟机知识,这里涉及面试常问的内存溢出错误解决办法

一、异常是什么?

  1. 定义

程序运行过程中,由于某些原因导致程序出错,从而结束程序运行,这就称为异常

  1. java异常的结构图(超类、子类关系等结构)
    在这里插入图片描述
    在这里插入图片描述

    Java 中所有的错误和异常最终都继承自 java.lang.Throwable 这个类。
    (当然,Object类是Java中所有类的父类,也是Throwable的父类。不过这儿讨论的是异常,所以我们常说,异常的超类是Throwable 类。)
    Java标准库内建了一些通用的异常,这些类以Throwable为顶层父类。
    Throwable下面一层只派生出2个子类:Error类 和 Exception类。

  • 2.1 错误:Error类以及它的子类的实例,代表了JVM本身的错误。
    错误不能被程序员通过代码处理,Error很少出现。
    因此,程序员应该关注Exception为父类的分支下的各种子异常类。

  • 2.2 异常: Exception以及他的子类,代表程序运行时发送的各种不期望发生的事件。
    可以被Java异常处理机制使用,是异常处理的核心。(Exception分为:RuntimeException和非RuntimeException )

二、error 和 exception区别 ?

  • 相同点:
    一、都继承自Throwable类
    二、都没有自己实现的方法,都是继承Throwable和Object的
    三、都有四个构造方法,参数及实现的功能一样

  • 不同点:
    一、Error属于系统级错误称之为“错误”,不可被捕获,也就是无法用try catch/throws机制;
    Exception属于应用程序级错误称之为“异常”,可以通过捕获避免,也就是可以用try catch/throws机制;
    二、Error无需在程序中以throws子句中抛出; 而Exception需要抛出
    三、存在Error错误程序不能运行或是运行中断; 存在Exception错误程序可运行并抛出

三、unchecked异常和checked异常的区别

Java 定义了两种异常( C# 只有unchecked异常 ):

  1. 非受查异常 (Unchecked exception)
    Error和子类、 继承自 Exception 的 RuntimeException和子类都称为非受查异常
    就是代码不需要强制处理它们的异常也能通过编译,所以它们称作 unchecked exception。RuntimeException(运行时异常)不需要try…catch…或throws 机制去强制处理。
    编译器不强制记录异常,但是!我们一般都建议手动捕获异常,做自己的逻辑处理。
    生产中,非受查异常中的RuntimeException异常最常见~

  2. 受查异常 (checked exception):
    继承自 Exception 的 非RuntimeException:IOException 和其子类、SQLException等等,都是受查异常。代码需要强制处理抛出的异常,要么用 try catch 语句,要么直接用 throws 语句声明,否则编译不通过!!!
    比如:FileNotFoundException, 不处理则会爆红,不能编译!编译器强制我们处理
    生产中,这种异常不常见~

四、java中的异常处理机制(2种)

  • try/catch 捕获异常机制(捕获异常)
  • throws 声明异常机制(抛出异常)

try :定义可能发生异常的代码 (监控区域)
catch:用来捕捉try中发生的异常(捕获异常区域)
finally:无论是否有异常都会执行的代码(处理善后工作)【除了在一种情况下不能被执行:当执行到System.exit(1)用来强制关闭虚拟机时】
throw :抛出异常
throws :声明异常

【注意事项】

  1. 即使try和catch块中存在return语句,finally语句也会执行。是在执行完finally语句后再通过return退出。

  2. finally语句块只有一种情况是不会执行的,那就是在执行finally之前遇到了System.exit(0)结束程序运行。

五.java中异常处理结构

  1. try-catch 结构:
public static void main(String[] args) {
        FileReader reader = null;
        try{
            System.out.println("第0次打印...");
            reader = new FileReader("D:/a.txt");
            System.out.println("第1次打印...");
            char c = (char)reader.read();
            System.out.println("2"+c);
        }catch(FileNotFoundException e){    //子类异常放在父类异常前面
            System.out.println("第3次打印...");
            e.printStackTrace();
        }catch(IOException e){       //父类异常放在异常后面
            e.printStackTrace();
        }
}
  1. try-catch-finally
    略。

  2. 多重catch使用结构

//假设下面的D:/a.txt不存在!!!!
public static void main(String[] args) {
        FileReader reader = null;
        try{
            System.out.println("第0次打印...");
            reader = new FileReader("D:/a.txt");
            System.out.println("第1次打印...");
            char c = (char)reader.read();
            System.out.println("2"+c);
        }catch(FileNotFoundException e){//子类异常放在父类异常前面
            System.out.println("第3次打印...");
            e.printStackTrace();
        }catch(IOException e){ //父类异常放在异常后面
            e.printStackTrace();
        }finally{
            System.out.println("第4次打印...");
            try{
                if (reader != null){
                    reader.close();
                }
            }catch (Exception e){
                e.printStackTrace();
            }
        }
}

在这里插入图片描述

  1. throws声明异常结构

六、遇到异常怎么打印日志?(从下面5种中选一个自己要的)

public static void main( String[] args ) {
    public String str =null;
	
	try{
		if(str.equals("张三")){
			str = "李四";
		}
	}catch (Exception e){
	    //第1种
		System.out.println("e.getMessage()打印结果: "+ e.getMessage());
		//第2种
		System.out.println("e.getLocalizedMessage()打印结果: "+ e.getLocalizedMessage());
		//第3种
		System.out.println("ExceptionUtils.getStackTrace()打印结果: "+ ExceptionUtils.getStackTrace(e));
		//第4种
		System.out.println("e.toString()打印结果: "+ e.toString());
		System.out.println("============分割线=============");
		//第5种
		e.printStackTrace();
	}
}

七、常见错误异常(每个都要记住5个,面试会问)

  • 常见error:(未受查异常/非编译时异常)
    OutOfMemoryException - 内存溢出异常(面试官可能问你:遇到这个,你怎么解决)
    StackOverflowError - 深递归导致栈被耗尽而抛出的异常
    ThreadDeath - 内存溢出异常(面试官可能问你:遇到这个,你怎么解决)
    VirtualMachineError
    NoClassDefFoundError - 类定义错误异常
    IOError

  • 常见RuntimeException:(未受查异常/非编译时异常)
    NullPointerException - 空指针引用异常
    ClassCastException - 类型强制转换异常
    IndexOutOfBoundsException - 下标越界异常
    ArrayIndexOutOfBoundsException - 数组下标越界异常
    ArithmeticException - 算术运算异常
    IllegalArgumentException - 传递非法参数异常
    SecurityException - 违背安全原值异常

  • 非RuntimeException 之 IOException相关:(受查异常/编译时异常)
    FileNotFoundException - 文件未找到异常
    NumberFormatException - 数据类型转换异常

  • 非RuntimeException 之 ClassNotFoundException (受查异常/编译时异常)
  • 非RuntimeException 之 SQLException:(受查异常/编译时异常)

常见error解决方案:

八、转载

https://blog.csdn.net/qq_45055856/article/details/97817768
https://blog.csdn.net/m0_67929156/article/details/124112811
https://blog.csdn.net/m0_54189068/article/details/127106337
https://blog.csdn.net/song12345xiao/article/details/126489652
https://blog.csdn.net/qq_40041868/article/details/123471481
https://blog.51cto.com/u_15271242/2909987
http://events.jianshu.io/p/3714a154adf8
https://www.ngui.cc/el/423994.html?action=onClick
https://blog.csdn.net/Jin_Kwok/article/details/79866465

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

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

相关文章

C++经典题目

目录 P62 3.6 求圆周长面积 P80 3 华氏转摄氏 P80 10 分段函数 P81 21 数列求和 P82 24 打印图形 P229 6 长方体体积 P384 4 printArea 题目来源于C程序设计(第4版) P62 3.6 求圆周长面积 设圆半径r1.5,圆柱高h3,求圆周长…

React生命周期中有哪些坑?如何避免?

在讨论React 的生命周期的时候,一定是在讨论类组件,因为函数组件并没有生命周期的概念,它本身就是一个函数,只会从头执行到尾巴 其实生命周期只是一个抽象的概念,大部分人看到生命周期想到的往往都componentDidMount&…

CMMI2.0配置管理工作及访谈学习笔记

1. 配置管理概述 1.1. 关于配置管理 配置管理是通过技术或其他手段对软件产品及其开发过程和生命周期进行控制、规范的一系列措施,通过配置标识、版本控制、版本管理、基线管理和配置审计来管理工作产品的完整性。 配置管理的主要目的是进行工作产品管理&#xf…

JavaScript -- 12. jQuery

文章目录jQuery1 jQuery简介2 使用jQuery2.1 下载jQuery2.2 引用jQuery3 jQuery的核心函数3.1 作为工具类使用3.2 作为函数使用3.2.1 将一个函数作为$的参数3.2.2 将选择器字符串作为参数3.2.3 将DOM对象作为参数3.2.4 将html代码作为参数4 jQuery对象4.1 获取DOM对象4.2 隐式迭…

Python——基础知识

前面主要讲解了javaEE的基础知识,基本上可以用servlet写一些简单的网页程序,后续的博客将围绕spring进行讲解,并且其中穿插一些python的知识 变量 命名 和其他的编程语言一样,java的变量命名需要遵循下面几个原则 由数字&…

世界杯竞猜项目Dapp-第二章(hardhat部署合约)

创建 hardhat 项目 # 创建 npm 空项目 npm init # 安装 npm install --save-dev hardhat2.11.1 # 创建工程 npx hardhat -> 选择高级ts项目运行测试 # 编译合约 npx hardhat compile # 单元测试 npx hardhat test添加合约 将 Worldcup.sol(上节编写的合约&am…

【Flink】自定义keyBy的KeySelector

我们通常在写Flink程序的时候都会遇到keyBy,比如按照某条数据的某个字段进行分类计算,或者计算pv,还有需要用到Flink定时器的高级功能。 下面我们根据keyby的源码,看下keyBy的用法(本博客基于Flink1.13) 源码有5种方式定义keyBy, 但是其中的2种已经不用了,如果用户想…

PC的ARM的安全启动

其实还是很不习惯将PC和ARM联系起来,当然主要是因为我刚刚接触嵌入式没有多久,更别说服务器、PC端了。 脑子里固化了的X86。 于是这一篇学习一下,基于ARM的PC,是怎么利用这个ATF框架,进行安全启动的。 文章内容来自…

9个做好动效设计的好方法

动态效果意味着充满生命和兴奋,为静态事物增添生命。然而,在软件方面,动态效果不仅是为了获得乐趣,也是为了解决问题。 作为人类,我们习惯于看到世界在我们周围移动。如果任何软件有连贯的动画,它都会感到…

【Python游戏】Python基于第三方库pygame实现一个魂斗罗小游戏,毕业设计必备 | 附源码

前言 halo,包子们下午好 今天给打击整一个魂斗罗小游戏 很多小伙伴接触魂斗罗应该是在小时候的一个手柄游戏上面吧 我记得作为90后的我,玩这一款游戏是在小学的时候 废话不多说,直接上才艺 今天给大家直接安排 相关文件 关注小编&#xff…

30分钟了解linux操作系统内核总结

【推荐阅读】 概述Linux内核驱动之GPIO子系统API接口 一篇长文叙述Linux内核虚拟地址空间的基本概括 轻松学会linux下查看内存频率,内核函数,cpu频率 纯干货,linux内存管理——内存管理架构(建议收藏) Linux 内核性能优化的全景指南&#xff…

中学语文杂志中学语文杂志社中学语文编辑部2022年第30期目录

理论_视点《中学语文》投稿:cn7kantougao163.com 追求服务于学的“智慧语文”教育 陈维贤; 3-5 教学_阅读教学 高中古诗词群文阅读教学特点新探 张红娟; 6-8 导读需导思 领读方领悟 罗艳兰; 9-10 学习任务群背景下的群文阅读教学研究 丁雪云; 11-12…

守门员VS软件测试

虽然刚刚为世界杯贡献了点彩票钱,但我依然热爱着足球这项赛事。最近熬夜看球,突然发现我们软件开发团队里,守门员这个职位就像我们公司的那个测试倒霉蛋儿一样。 1、球队配比VS开发团队人员配比 △ 不管你的球队是443,还是552&am…

如何自定义SpringBoot中的starter,并且使用它

目录 1 简介 2 规范 2.1 命名 2.2 模块划分 3 示例 1 简介 SpringBoot中的starter是一种非常重要的机制,能够抛弃以前繁琐的配置,将其统一集成进starter,应用者只需要在maven中引入starter依赖,SpringBoot就自动扫描到要加载…

PyTorch笔记 - A ConvNet for the 2020s (ConvNeXt) 网络

欢迎关注我的CSDN:https://blog.csdn.net/caroline_wendy 本文地址:https://blog.csdn.net/caroline_wendy/article/details/128236899 Paper:A ConvNet for the 2020s,FAIR,Berkeley Code:https://github.com/facebookresearch/ConvNeXt 网络结构: stem layer:骨干层…

【k8s宝典】2022年12月份Kubernetes 认证管理员CKA轻松通过攻坚克难技巧

目标:攻克三大难点 提示:本人是12月近期通过的cka考试,所以总结的技巧是当前最新的,后面如果有稍许变化,这些技巧照样适用,题目请以实际为主 复制键不能用怎么办? 新版考试系统使用Ctrl c不…

【论文阅读笔记】Noise2Noise: Learning Image Restoration without Clean Data

官方代码地址:https://github.com/NVlabs/noise2noise 论文地址:https://arxiv.org/abs/1803.04189 第一次接触这方向,相当于翻译了。 摘要 作者通过机器学习将基础统计推理应用于信号重建上:学习将损坏的观察结果(co…

商务与经济统计 | 描述统计学

一.表格法和图形法 条形图 是一种描述已在一个频数,相对频数或百分数频数分布中汇总的品质数据的图形方法 饼形图 是一种常用的描绘品质数据的相对频数分布的图形方法 直方图 横轴上表示所关心的变量,纵轴上表示频数,相对频数或百分数频数…

23软考备考已开始,网络工程师知识点速记~(5)

新一轮软考备考来啦~ 为了帮助大家提高备考效率,将2023上半年软考网络工程师知识点速记分享给大家,快来跟着一起打卡学习吧! 进程的同步和互斥 计算机有了操作系统后性能大幅度提升,其根本原因就在于实现了进程的并发运行。多个…

接口多实现

一、什么是接口 接口是抽象类的延伸,可以将它看作是纯粹的对象类 二、接口模式的特性 (1)接口不可以被实例化。 (2)实现类必须实现接口的所有方法(类似于抽象类和抽象方法)。 (3&…