阿里巴巴面试题- - -Java体系最新面试题(6)

简介: ​目录基础篇24、 Excption与Error包结构Java可抛出(Throwable)的结构分为三种类型:被检查的异常(CheckedException),运行时异常(RuntimeException),错误(Error)。1、运行时异常定义:RuntimeException及其子类都被称为运行时异常。特点:Java编译器不会检查它。也就是说,当程序中可能出现这类异常时,倘若既"没有通过throws声明抛出它",也"没有用try-catch语句捕获它",还是会编译通过。例如,除数为零时产生的ArithmeticException异常,数组越

前言:七月末八月初的时候,秋招正式打响,公司会放出大量的全职和实习岗位。为了帮助秋招的小伙伴们,学长这里整理了一系列的秋招面试题给大家,所以小伙伴们不用太过焦虑,相信你们一定能超常发挥,收到心仪公司的Offer~~

内容涵盖:Java、MyBatis、ZooKeeper、Dubbo、Elasticsearch、Memcached、Redis、MySQL、Spring、Spring Boot、Spring Cloud、RabbitMQ、Kafka、Linux等技术栈

🌐 推荐一款找工作神器网站:《牛客网》 |笔试题库|面试经验|实习招聘内推|

image.gif编辑

目录

基础篇

24、 Excption与Error包结构

25、OOM你遇到过哪些情况,SOF你遇到过哪些情况


基础篇

24、 Excption与Error包结构

Java可抛出(Throwable)的结构分为三种类型:被检查的异常(CheckedException),运行时异常

(RuntimeException),错误(Error)。

1、运行时异常

定义:RuntimeException及其子类都被称为运行时异常。

特点:Java编译器不会检查它。也就是说,当程序中可能出现这类异常时,倘若既"没有通过throws

声明抛出它",也"没有用try-catch语句捕获它",还是会编译通过。例如,除数为零时产生的

ArithmeticException异常,数组越界时产生的IndexOutOfBoundsException异常,fail-fast机制产生的ConcurrentModificationException异常(java.util包下面的所有的集合类都是快速失败

的,“快速失败”也就是fail-fast,它是Java集合的一种错误检测机制。当多个线程对集合进行结构上的改变的操作时,有可能会产生fail-fast机制。记住是有可能,而不是一定。例如:假设存在两个线程(线程1、线程2),线程1通过Iterator在遍历集合A中的元素,在某个时候线程2修改了集合A的结构(是结构上面的修改,而不是简单的修改集合元素的内容),那么这个时候程序就会抛出

ConcurrentModificationException 异常,从而产生fail-fast机制,这个错叫并发修改异常。Fail-

safe,java.util.concurrent包下面的所有的类都是安全失败的,在遍历过程中,如果已经遍历的数组上的内容变化了,迭代器不会抛出ConcurrentModificationException异常。如果未遍历的数组上的内容发生了变化,则有可能反映到迭代过程中。这就是ConcurrentHashMap迭代器弱一致的表现。ConcurrentHashMap的弱一致性主要是为了提升效率,是一致性与效率之间的一种权衡。

要成为强一致性,就得到处使用锁,甚至是全局锁,这就与Hashtable和同步的HashMap一样

了。)等,都属于运行时异常。

常见的五种运行时异常:

ClassCastException(类转换异常)

IndexOutOfBoundsException(数组越界)

NullPointerException(空指针异常)

ArrayStoreException(数据存储异常,操作数组是类型不一致)

BufferOverflowException

2、被检查异常

定义:Exception类本身,以及Exception的子类中除了"运行时异常"之外的其它子类都属于被检查异常。

特点 : Java编译器会检查它。 此类异常,要么通过throws进行声明抛出,要么通过try-catch进行捕获处理,否则不能通过编译。例如,CloneNotSupportedException就属于被检查异常。当通过

clone()接口去克隆一个对象,而该对象对应的类没有实现Cloneable接口,就会抛出

CloneNotSupportedException异常。被检查异常通常都是可以恢复的。 如:

IOException

FileNotFoundException

SQLException

被检查的异常适用于那些不是因程序引起的错误情况,比如:读取文件时文件不存在引发的

FileNotFoundException。然而,不被检查的异常通常都是由于糟糕的编程引起的,比如:在对象引用时没有确保对象非空而引起的NullPointerException。

3、错误

定义 : Error类及其子类。

特点 : 和运行时异常一样,编译器也不会对错误进行检查。

当资源不足、约束失败、或是其它程序无法继续运行的条件发生时,就产生错误。程序本身无法修复这些错误的。例如,VirtualMachineError就属于错误。出现这种错误会导致程序终止运行。

OutOfMemoryError、ThreadDeath。

Java虚拟机规范规定JVM的内存分为了好几块,比如堆,栈,程序计数器,方法区等

25、OOM你遇到过哪些情况,SOF你遇到过哪些情况

OOM:

1,OutOfMemoryError异常

除了程序计数器外,虚拟机内存的其他几个运行时区域都有发生OutOfMemoryError(OOM)异常的可能。

Java Heap 溢出:

一般的异常信息:java.lang.OutOfMemoryError:Java heap spacess。

java堆用于存储对象实例,我们只要不断的创建对象,并且保证GC Roots到对象之间有可达路径来避免垃圾回收机制清除这些对象,就会在对象数量达到最大堆容量限制后产生内存溢出异常。

出现这种异常,一般手段是先通过内存映像分析工具(如Eclipse Memory Analyzer)对dump出来的堆转存快照进行分析,重点是确认内存中的对象是否是必要的,先分清是因为内存泄漏(Memory

Leak)还是内存溢出(Memory Overflow)。

如果是内存泄漏,可进一步通过工具查看泄漏对象到GCRoots的引用链。于是就能找到泄漏对象是通过怎样的路径与GC Roots相关联并导致垃圾收集器无法自动回收。

如果不存在泄漏,那就应该检查虚拟机的参数(-Xmx与-Xms)的设置是否适当。

2,虚拟机栈和本地方法栈溢出

如果线程请求的栈深度大于虚拟机所允许的最大深度,将抛出StackOverflowError异常。

如果虚拟机在扩展栈时无法申请到足够的内存空间,则抛出OutOfMemoryError异常

这里需要注意当栈的大小越大可分配的线程数就越少。

3,运行时常量池溢出

异常信息:java.lang.OutOfMemoryError:PermGenspace

如果要向运行时常量池中添加内容,最简单的做法就是使用String.intern()这个Native方法。该方法的作用是:如果池中已经包含一个等于此String的字符串,则返回代表池中这个字符串的String对

象;否则,将此String对象包含的字符串添加到常量池中,并且返回此String对象的引用。由于常量池分配在方法区内,我们可以通过-XX:PermSize和-XX:MaxPermSize限制方法区的大小,从而间接限制其中常量池的容量。

4,方法区溢出

方法区用于存放Class的相关信息,如类名、访问修饰符、常量池、字段描述、方法描述等。也有可能是方法区中保存的class对象没有被及时回收掉或者class信息占用的内存超过了我们配置。

异常信息:java.lang.OutOfMemoryError:PermGenspace

方法区溢出也是一种常见的内存溢出异常,一个类如果要被垃圾收集器回收,判定条件是很苛刻的。在经常动态生成大量Class的应用中,要特别注意这点。

SOF(堆栈溢出StackOverflow):

StackOverflowError 的定义:当应用程序递归太深而发生堆栈溢出时,抛出该错误。

因为栈一般默认为1-2m,一旦出现死循环或者是大量的递归调用,在不断的压栈过程中,造成栈容量超过1m而导致溢出。

栈溢出的原因:递归调用,大量循环或死循环,全局变量是否过多,数组、List、map数据过大。

本期分享到此为止,关注博主不迷路,叶秋学长带你上高速~~

相关文章
|
Java 程序员
Java 异常处理与正则表达式详解,实例演练及最佳实践
在 Java 代码执行期间,可能会发生各种错误,包括程序员编码错误、用户输入错误以及其他不可预料的状况。 当错误发生时,Java 通常会停止并生成错误消息,这个过程称为抛出异常。 try...catch 语句 try 语句允许您定义一段代码块,并在其中测试是否发生错误。 catch 语句允许您定义一段代码块,当 try 块中发生错误时执行该代码块。 try 和 catch 关键字成对使用,语法如下:
235 0
|
Python
Python中的异步编程:理解并使用asyncio和aiohttp
【8月更文挑战第24天】在Python中,异步编程是一个强大的工具,它可以帮助我们编写出高性能的网络应用。本文将介绍Python的异步编程库asyncio和aiohttp,并通过示例代码展示如何使用它们来创建一个简单的HTTP服务器。我们将看到,通过使用这些库,我们可以在不阻塞主线程的情况下处理大量的并发请求。
230 1
|
人工智能
初涉歌词创作:写歌词的技巧和方法你知道多少,妙笔生词智能写歌词软件
对于初涉歌词创作的人来说,掌握关键技巧和使用“妙笔生词智能写歌词软件”能大大提升创作效率。该软件提供AI智能写词、押韵优化、歌词续写等功能,帮助捕捉灵感,明确主题,优化结构,使语言表达更加简洁生动,助你创作出感人至深的作品。
|
人工智能 API C#
SimpleRAG:基于WPF与Semantic Kernel实现的一个简单的RAG应用
SimpleRAG是一款基于WPF与Semantic Kernel的RAG应用,支持OpenAI兼容的AI聊天与文本嵌入模型,演示了RAG技术在提升回答质量上的作用。可通过GitHub获取源码,配置所需模型API密钥后,在VS2022中以.NET 8环境编译运行。应用内置Sqlite数据库存储向量数据,便于离线使用与自定义扩展。如感兴趣,请支持并反馈使用体验。
225 1
SimpleRAG:基于WPF与Semantic Kernel实现的一个简单的RAG应用
|
数据可视化 数据挖掘 定位技术
Python中利用Bokeh创建动态数据可视化
【10月更文挑战第14天】本文介绍了如何使用 Bokeh 库在 Python 中创建动态数据可视化。Bokeh 是一个强大的开源可视化工具,支持交互式图表和大规模数据集的可视化。文章从安装 Bokeh 开始,逐步讲解了如何创建动态折线图,并添加了交互式控件如按钮、滑块和下拉菜单,以实现数据更新频率的调节和颜色选择。通过这些示例,读者可以掌握 Bokeh 的基本用法,进一步探索其丰富功能,创建更具吸引力和实用性的动态数据可视化。
|
安全 Ubuntu 网络协议
在Linux中,如何配置DHCP服务器?
在Linux中,如何配置DHCP服务器?
|
Linux 知识图谱 Docker
知识图谱(Knowledge Graph)- Neo4j 5.10.0 Docker 安装
知识图谱(Knowledge Graph)- Neo4j 5.10.0 Docker 安装
396 0
|
Java 应用服务中间件 Maven
从零玩转之SpringBoot3-核心原理1
从零玩转之SpringBoot3-核心原理
504 0
|
JSON 前端开发 安全
CORS跨域请求出现问题
1、问题描述 Access to XMLHttpRequest at ‘http://localhost:8080/user/register’ from origin ‘http://localhost:8002’ has been blocked by CORS policy: Response to preflight request doesn’t pass access control check: The value of the ‘Access-Control-Allow-Origin’ header in the response must not be the wildcar
|
移动开发 算法 安全
区块链及其加密技术
区块链及其加密技术
1099 0
区块链及其加密技术