面试官: 你来来谈谈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编程思想》第四版

相关文章
|
2月前
|
Java 程序员
Java社招面试中的高频考点:Callable、Future与FutureTask详解
大家好,我是小米。本文主要讲解Java多线程编程中的三个重要概念:Callable、Future和FutureTask。它们在实际开发中帮助我们更灵活、高效地处理多线程任务,尤其适合社招面试场景。通过 Callable 可以定义有返回值且可能抛出异常的任务;Future 用于获取任务结果并提供取消和检查状态的功能;FutureTask 则结合了两者的优势,既可执行任务又可获取结果。掌握这些知识不仅能提升你的编程能力,还能让你在面试中脱颖而出。文中结合实例详细介绍了这三个概念的使用方法及其区别与联系。希望对大家有所帮助!
183 60
|
17天前
|
Java 程序员 开发者
Java社招面试题:一个线程运行时发生异常会怎样?
大家好,我是小米。今天分享一个经典的 Java 面试题:线程运行时发生异常,程序会怎样处理?此问题考察 Java 线程和异常处理机制的理解。线程发生异常,默认会导致线程终止,但可以通过 try-catch 捕获并处理,避免影响其他线程。未捕获的异常可通过 Thread.UncaughtExceptionHandler 处理。线程池中的异常会被自动处理,不影响任务执行。希望这篇文章能帮助你深入理解 Java 线程异常处理机制,为面试做好准备。如果你觉得有帮助,欢迎收藏、转发!
78 14
|
20天前
|
安全 Java 程序员
Java 面试必问!线程构造方法和静态块的执行线程到底是谁?
大家好,我是小米。今天聊聊Java多线程面试题:线程类的构造方法和静态块是由哪个线程调用的?构造方法由创建线程实例的主线程调用,静态块在类加载时由主线程调用。理解这些细节有助于掌握Java多线程机制。下期再见! 简介: 本文通过一个常见的Java多线程面试题,详细讲解了线程类的构造方法和静态块是由哪个线程调用的。构造方法由创建线程实例的主线程调用,静态块在类加载时由主线程调用。理解这些细节对掌握Java多线程编程至关重要。
49 13
|
20天前
|
缓存 Java 应用服务中间件
java语言后台管理若依框架-登录提示404-接口异常-系统接口404异常如何处理-登录验证码不显示prod-api/captchaImage 404 (Not Found) 如何处理-解决方案优雅草卓伊凡
java语言后台管理若依框架-登录提示404-接口异常-系统接口404异常如何处理-登录验证码不显示prod-api/captchaImage 404 (Not Found) 如何处理-解决方案优雅草卓伊凡
69 5
|
2月前
|
算法 安全 Java
Java线程调度揭秘:从算法到策略,让你面试稳赢!
在社招面试中,关于线程调度和同步的相关问题常常让人感到棘手。今天,我们将深入解析Java中的线程调度算法、调度策略,探讨线程调度器、时间分片的工作原理,并带你了解常见的线程同步方法。让我们一起破解这些面试难题,提升你的Java并发编程技能!
88 16
|
2月前
|
Java 程序员 调度
Java 高级面试技巧:yield() 与 sleep() 方法的使用场景和区别
本文详细解析了 Java 中 `Thread` 类的 `yield()` 和 `sleep()` 方法,解释了它们的作用、区别及为什么是静态方法。`yield()` 让当前线程释放 CPU 时间片,给其他同等优先级线程运行机会,但不保证暂停;`sleep()` 则让线程进入休眠状态,指定时间后继续执行。两者都是静态方法,因为它们影响线程调度机制而非单一线程行为。这些知识点在面试中常被提及,掌握它们有助于更好地应对多线程编程问题。
68 9
|
2月前
|
安全 Java 程序员
Java面试必问!run() 和 start() 方法到底有啥区别?
在多线程编程中,run和 start方法常常让开发者感到困惑。为什么调用 start 才能启动线程,而直接调用 run只是普通方法调用?这篇文章将通过一个简单的例子,详细解析这两者的区别,帮助你在面试中脱颖而出,理解多线程背后的机制和原理。
72 12
|
2月前
|
监控 Dubbo Java
Java Dubbo 面试题
Java Dubbo相关基础面试题
|
2月前
|
SQL Java 数据库连接
Java MyBatis 面试题
Java MyBatis相关基础面试题
|
2月前
|
存储 监控 算法
Java JVM 面试题
Java JVM(虚拟机)相关基础面试题

热门文章

最新文章