面试官: 你来来谈谈java为什么要引入异常机制?

简介: 面试官: 你来来谈谈java为什么要引入异常机制?

什么是异常(Exception)?

java的基本原理就是"形式错误的代码不会运行"《java编程思想》第四版

个人觉得上面的那句话翻译的还是有一点问题的,感觉原文应该是java的基本思想就是"形式错误的代码不会执行",但是又没找到英文原版,没法贴原文。后面有时间的话,会找一下原版,这本书还是很经典的。

在回答这个问题之前,我问我自己异常是什么,我的回答是异常是程序在运行期所犯下的错误.不得不说,这个回答相当的不那么令人满意。

于是,我去官方写到的指导书中去寻找这个问题的答案(官方有写教程叫The Java™ Tutorial,上百度直接搜java Tutorial就可以直接搜到)

image.png

The Java programming language uses exceptions to handle errors and other exceptional events.java 采用异常去处理错误和意外的事件

对于什么是异常? 官方给出的回答是:An exception is an event that occurs during the execution of a program that disrupts the normal flow of instructions.

异常是在程序执行过程中发生的扰乱正常指令流的事件 disrupt也有中断的意思。

也就是说异常是程序在执行过程中一些使得程序发生错乱,中断的事件。原因可能是多种多样的,程序员的错,或者环境的错等等。

为什么要引入异常机制呢?

站在语言设计者的角度上,如何处理这种错误呢?  java给出的答案是抛出或者捕获,抛出就是不处理,捕获就是有选择的处理。 这让我想到了C语言,C语言没有异常机制,它是怎样处理错误和意外的事件呢?  似乎上开发者自己处理, 如下图:

image.png

输出结果为:

image.png

在java中这段程序执行不了的,a[5]是打印不出来的,会报Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: 5

image.png

再比如: 除0操作.在C语言中,你照样也是可以跑的通的,虽然你的程序可能会崩掉。

image.png

不过我在IDE中也看到了对应的提示:image.png

为了测试这是IDE给出的提示还是C给出的提示,我决定在Linux下执行一下:

image.png

这点抛的异常还是很让我疑惑的,浮点数异常,我没有踩任何一种编程语言的意思,java在运行期间出现了错误是比较直观的。 在C语言中似乎并不数组越界看做是一种运行时的错误。

image.png

在程序很短的时候,你可能很容易一眼就可以看出你错在哪里,但是程序达到了上百行之后呢,你的程序崩掉了,然后你并不知道发生了什么?反正它崩了。但是在java中它会给你一个简介而明了的提示,image.png,甚至还告诉你错在哪里。 我已经好久不碰C++了,只写了一个非常简单的C++程序来测试C++是如何处理程序在运行过程遇到的错误,

网络异常,图片无法展示
|

似乎跟C语言的反应是一致的,不过我在IDE中发现了这个:

image.png

为了测试这是IDE给出的提示还是C++给出的提示,我决定用命令行执行一下:

image.png

看来C++是有的。

与C++类似,捕获错误最理想的是在编译期间,最好试图在运行程序以前。然而,并非所有错误都能在编译期间侦测到。有些问题必须在运行期间解决,让错误的缔结者向接收者通过一些手续向接收者传递一些适当的信息,并使其知道该如何正确的处理遇到的问题。----《java编程思想》

结合java编程思想,我们可以给出答案的第一点: 异常机制可以帮助我们定位错误,给出错误出现的原因,帮助我们解决问题。 为什么写到这里的时候,脑中突然浮现这么一句话: 异常机制也提高了java程序员的下限.为了避免一些开发者用不好数组越界带来的好处,java的设计者直接就屏蔽了数组越界操作,即裁定数组越界是违法操作。

在C++和其他早期语言中,可通过几种手续来达到这个目的。而且它们通常是作为一种规定建立起来的,而非作为程序设计语言的一部分。典型地,我们需要返回一个值或设置一个标志(位),接收者会检查这些值或标志,判断具体发生了什么事情。然而,随着时间的流逝,终于发现这种做法会助长那些使用一个库的程序员的麻痹程序。他们往往会这么想:"是的,错误可能会在其他人的代码中出现,但不会在我的代码中"。这样的后果是他们一般不会检查是否出现了错误(有时出错条件确实显得太愚蠢,不值得检验;) 另一方面,若每次调用一个方法时都进行全面、细致的错误检查,那么代码的可读性也可能大幅度的降低。由于程序员可能仍然在用这些语言维护自己的系统,所以他们应该对此有着深刻的体会: 若按这种方式控制,那么在创建大型、健壮、易于维护的程序时,肯定会遇到不小的阻挠。引自《java编程思想》第四版

java的异常机制增强了程序的健壮性、可维护性。java在设计之初就着眼于程序的可维护性与健壮性。 这句话怎么理解呢? 就是我们在写程序的时候为了检测或处理程序在运行中可能出错的情形,就可以从异常机制中获益 你可以选择抛出或者是捕获。

"异常"(Exception)这个词表达的是一种“例外”情况,亦即正常情况之外的一种“异常”。在问题发生的时候,我们可能不知具体该如何解决,但肯定知道已不能不顾一切地继续下去。此时,必须坚决地停下来,并由某人、某地指出发生了什么事情,以及该采取何种对策。但为了真正解决问题,当地(问题的发生地)可能并没有足够多的信息。因此,我们需要将其移交给更级的负责人,令其作出正确的决定(类似一个命令链。 异常机制的另一项好处就是能够简化错误控制代码。我们再也不用检查一个特定的错误,然后在程序的多处地方对其进行控制。此外,也不需要在方法调用的时候检查错误(因为保证有人能捕获这里的错误)。我们只需要在一个地方处理问题:“异常控制模块”或者“异常控制器”。这样可有效减少代码量,并将那些用于描述具体操作的代码与专门纠正错误的代码分隔开。一般情况下,用于读取、写入以及调试的代码会变得更富有条理。引自《java编程思想》第四版

相关文章
|
4月前
|
缓存 Java 关系型数据库
2025 年最新华为 Java 面试题及答案,全方位打造面试宝典
Java面试高频考点与实践指南(150字摘要) 本文系统梳理了Java面试核心考点,包括Java基础(数据类型、面向对象特性、常用类使用)、并发编程(线程机制、锁原理、并发容器)、JVM(内存模型、GC算法、类加载机制)、Spring框架(IoC/AOP、Bean生命周期、事务管理)、数据库(MySQL引擎、事务隔离、索引优化)及分布式(CAP理论、ID生成、Redis缓存)。同时提供华为级实战代码,涵盖Spring Cloud Alibaba微服务、Sentinel限流、Seata分布式事务,以及完整的D
235 0
|
3月前
|
缓存 Java API
Java 面试实操指南与最新技术结合的实战攻略
本指南涵盖Java 17+新特性、Spring Boot 3微服务、响应式编程、容器化部署与数据缓存实操,结合代码案例解析高频面试技术点,助你掌握最新Java技术栈,提升实战能力,轻松应对Java中高级岗位面试。
348 0
|
3月前
|
人工智能 前端开发 安全
Java开发不可不知的秘密:类加载器实现机制
类加载器是Java中负责动态加载类到JVM的组件,理解其工作原理对开发复杂应用至关重要。本文详解类加载过程、双亲委派模型及常见类加载器,并介绍自定义类加载器的实现与应用场景。
205 4
|
4月前
|
算法 架构师 Java
Java 开发岗及 java 架构师百度校招历年经典面试题汇总
以下是百度校招Java岗位面试题精选摘要(150字): Java开发岗重点关注集合类、并发和系统设计。HashMap线程安全可通过Collections.synchronizedMap()或ConcurrentHashMap实现,后者采用分段锁提升并发性能。负载均衡算法包括轮询、加权轮询和最少连接数,一致性哈希可均匀分布请求。Redis持久化有RDB(快照恢复快)和AOF(日志更安全)两种方式。架构师岗涉及JMM内存模型、happens-before原则和无锁数据结构(基于CAS)。
127 5
|
4月前
|
Java API 微服务
2025 年 Java 校招面试全攻略:从面试心得看 Java 岗位求职技巧
《2025年Java校招最新技术要点与实操指南》 本文梳理了2025年Java校招的核心技术栈,并提供了可直接运行的代码实例。重点技术包括: Java 17+新特性(Record类、Sealed类等) Spring Boot 3+WebFlux响应式编程 微服务架构与Spring Cloud组件 Docker容器化部署 Redis缓存集成 OpenAI API调用 通过实际代码演示了如何应用这些技术,如Java 17的Record类简化POJO、WebFlux构建响应式API、Docker容器化部署。
180 5
|
4月前
|
缓存 NoSQL Java
Java Redis 面试题集锦 常见高频面试题目及解析
本文总结了Redis在Java中的核心面试题,包括数据类型操作、单线程高性能原理、键过期策略及分布式锁实现等关键内容。通过Jedis代码示例展示了String、List等数据类型的操作方法,讲解了惰性删除和定期删除相结合的过期策略,并提供了Spring Boot配置Redis过期时间的方案。文章还探讨了缓存穿透、雪崩等问题解决方案,以及基于Redis的分布式锁实现,帮助开发者全面掌握Redis在Java应用中的实践要点。
227 6
|
4月前
|
NoSQL Java 微服务
2025 年最新 Java 面试从基础到微服务实战指南全解析
《Java面试实战指南:高并发与微服务架构解析》 本文针对Java开发者提供2025版面试技术要点,涵盖高并发电商系统设计、微服务架构实现及性能优化方案。核心内容包括:1)基于Spring Cloud和云原生技术的系统架构设计;2)JWT认证、Seata分布式事务等核心模块代码实现;3)数据库查询优化与高并发处理方案,响应时间从500ms优化至80ms;4)微服务调用可靠性保障方案。文章通过实战案例展现Java最新技术栈(Java 17/Spring Boot 3.2)的应用.
270 10
|
4月前
|
安全 Java API
2025 年 Java 校招面试常见问题及详细答案汇总
本资料涵盖Java校招常见面试题,包括Java基础、并发编程、JVM、Spring框架、分布式与微服务等核心知识点,并提供详细解析与实操代码,助力2025校招备战。
215 1
|
4月前
|
算法 Java 微服务
2025 年 Java 面试宝典社招春招秋招实操全方位攻略
2025年Java面试宝典涵盖核心技术及最新趋势,分为四大板块:1. Java基础:深入数据类型、多态等特性,结合学生信息管理等实例;2. JVM核心:解析内存模型与GC算法,附多线程转账等场景应用;3. 高并发方案:详解synchronized与线程池配置,提供Web服务器优化案例;4. Spring生态:剖析IoC/AOP原理,演示微服务架构实现。特别新增Java 17+特性实操,包括Record类、密封接口等语法糖,整合Spring Boot 3、响应式编程及云原生技术,通过订单状态机、API网关配置。
283 1
|
4月前
|
缓存 算法 NoSQL
校招 Java 面试高频常见知识点深度解析与实战案例详细分享
《2025校招Java面试核心指南》总结了Java技术栈的最新考点,涵盖基础语法、并发编程和云原生技术三大维度: 现代Java特性:重点解析Java 17密封类、Record类型及响应式Stream API,通过电商案例演示函数式数据处理 并发革命:对比传统线程池与Java 21虚拟线程,详解Reactor模式在秒杀系统中的应用及背压机制 云原生实践:提供Spring Boot容器化部署方案,分析Spring WebFlux响应式编程和Redis Cluster缓存策略。
117 1