Java异常面试问题

转载自   Java异常面试问题

1.什么是Java中的异常?

异常是在程序执行期间可能发生的错误事件,并且会中断它的正常流程。异常可能来自不同类型的情况,例如用户输入的错误数据,硬件故障,网络连接故障等。

每当执行java语句时发生任何错误,都会创建一个异常对象,然后JRE会尝试查找异常处理程序来处理异常。如果找到合适的异常处理程序,则将异常对象传递给处理程序代码以处理异常,称为捕获异常。如果未找到处理程序,则应用程序将异常抛出到运行时环境,JRE将终止该程序。

Java异常处理框架仅用于处理运行时错误,编译时错误不由异常处理框架处理。

 

2.Java中的异常处理关键字是什么?

java异常处理中使用了四个关键字。

throw:有时我们明确要创建异常对象然后抛出它来停止程序的正常处理。throw关键字用于向运行时抛出异常来处理它。

throws:当我们在方法中抛出任何已检查的异常而不处理它时,我们需要在方法签名中使用throws关键字让调用者程序知道该方法可能抛出的异常。调用方法可以处理这些异常或使用throws关键字将其传播给它的调用方法。我们可以在throws子句中提供多个异常,也可以与main()方法一起使用。

try-catch:我们在代码中使用try-catch块进行异常处理。try是块的开始,catch是在try块的末尾处理异常。我们可以使用try有多个catch块,try-catch块也可以嵌套。catch块需要一个应该是Exception类型的参数。

finally:finally块是可选的,只能用于try-catch块。由于异常会暂停执行过程,因此我们可能会打开一些不会关闭的资源,因此我们可以使用finally块。finally块总是被执行,无论是否发生异常。

 

3.解释Java异常层次结构?

Java异常是分层的,继承用于对不同类型的异常进行分类。Throwable是Java Exceptions Hierarchy的父类,它有两个子对象 - Error和Exception。异常进一步分为检查异常和运行时异常。

错误是超出应用程序范围的特殊情况,并且无法预测并从中恢复,例如硬件故障,JVM崩溃或内存不足错误。

Checked Exceptions是我们可以在程序中预期并尝试从中恢复的特殊情况,例如FileNotFoundException。我们应该捕获此异常并向用户提供有用的消息并正确记录以进行调试。Exception是所有Checked Exceptions的父类。

运行时异常是由错误的编程引起的,例如尝试从Array中检索元素。我们应该在尝试检索元素之前先检查数组的长度,否则它可能会ArrayIndexOutOfBoundException在运行时抛出。RuntimeException是所有运行时异常的父类。

 

4.Java异常类的重要方法是什么?

异常及其所有子类不提供任何特定方法,并且所有方法都在基类Throwable中定义。

String getMessage() - 此方法返回消息String of Throwable,并且可以在通过构造函数创建异常时提供消息。

String getLocalizedMessage() - 提供此方法,以便子类可以覆盖它以向调用程序提供特定于语言环境的消息。此方法getMessage()的可抛出类实现只是使用方法来返回异常消息。

synchronized Throwable getCause() - 此方法返回异常的原因或null id,原因未知。

String toString() - 此方法以String格式返回有关Throwable的信息,返回的String包含Throwable类和本地化消息的名称。

void printStackTrace() - 此方法将堆栈跟踪信息打印到标准错误流,此方法已重载,我们可以将PrintStream或PrintWriter作为参数传递,以将堆栈跟踪信息写入文件或流。

 

5.解释Java 7 ARM功能和multi-catch块?

如果你在一个try块中捕获了很多异常,你会发现catch块代码看起来非常难看,并且主要由冗余代码组成,以记录错误,记住Java 7的一个特性是multi-catch块。我们可以在一个catch块中捕获多个异常。具有此功能的catch块如下所示:

catch(IOException | SQLException | Exception ex){logger.error(ex);throw new MyException(ex.getMessage());
}

大多数情况下,我们使用finally块来关闭资源,有时我们忘记关闭它们并在资源耗尽时获得运行时异常。这些异常很难调试,我们可能需要查看我们使用该类资源的每个地方,以确保我们关闭它。所以java 7的改进之一是try-with-resources,我们可以在try语句中创建一个资源并在try-catch块中使用它。当执行来自try-catch块时,运行时环境会自动关闭这些资源。具有这种改进的try-catch块样本是:

try (MyResource mr = new MyResource()) {System.out.println("MyResource created in try-with-resources");} catch (Exception e) {e.printStackTrace();}
6.Java中Checked和Unchecked Exception有什么区别?

Checked Exceptions应该使用try-catch块在代码中处理,否则方法应该使用throws关键字让调用者知道可能从方法抛出的已检查异常。未经检查的异常不需要在程序中处理或在方法的throws子句中提及它们。

Exception是所有已检查异常RuntimeException的超类,而是所有未经检查的异常的超类。请注意,RuntimeException是Exception的子类。

已检查的异常是需要在代码中处理的错误方案,否则您将收到编译时错误。例如,如果您使用FileReader读取文件,它会抛出FileNotFoundException,我们必须在try-catch块中捕获它或将其再次抛给调用方法。

未经检查的异常主要是由编程不良引起的,例如在对象引用上调用方法时的NullPointerException,而不确保它不为null。例如,我可以编写一个方法来从字符串中删除所有元音。确保不传递空字符串是调用者的责任。我可能会改变方法来处理这些场景,但理想情况下,调用者应该处理这个问题。

 

7.Java中throw和throws关键字有什么区别?

throws关键字与方法签名一起用于声明方法可能抛出的异常,而throw关键字用于破坏程序流并将异常对象移交给运行时来处理它。

 

8.如何在Java中编写自定义异常?

我们可以扩展Exception类或其任何子类来创建我们的自定义异常类。自定义异常类可以拥有自己的变量和方法,我们可以使用它们将错误代码或其他与异常相关的信息传递给异常处理程序。

自定义异常的一个简单示例如下所示。

package com.journaldev.exceptions;import java.io.IOException;public class MyException extends IOException {private static final long serialVersionUID = 4664456874499611218L;private String errorCode="Unknown_Exception";public MyException(String message, String errorCode){super(message);this.errorCode=errorCode;}public String getErrorCode(){return this.errorCode;}}

 

9.Java中的OutOfMemoryError是什么?

Java中的OutOfMemoryError是java.lang.VirtualMachineError的子类,当JVM用完堆内存时,它会抛出它。我们可以通过提供更多内存来通过java选项运行java应用程序来修复此错误。

$>java MyProgram -Xms1024m -Xmx1024m -XX:PermSize=64M -XX:MaxPermSize=256m

 

10.“主线程中的异常”有哪些不同的情况?

一些常见的主线程异常情况是:

主线程java.lang.UnsupportedClassVersionError中的异常:

当您的java类是从另一个JDK版本编译并且您尝试从另一个Java版本运行它时,会出现此异常。

主线程java.lang.NoClassDefFoundError中的异常:

此异常有两种变体。第一个是您提供类全名和.class扩展名的地方。第二种情况是找不到Class。

主线程java.lang.NoSuchMethodError中的异常:

main:当您尝试运行没有main方法的类时会出现此异常。

线程“main”中的异常java.lang.ArithmeticException:

每当从main方法抛出任何异常时,它都会打印异常是控制台。第一部分解释了从main方法抛出异常,第二部分打印异常类名,然后在冒号后打印异常消息。

 

11.Java中的final,finally和finalize有什么区别?

final和finally是java中的关键字,而finalize是一种方法。

final关键字可以与类变量一起使用,以便它们不能被重新分配,类可以避免按类扩展,并且使用方法来避免子类覆盖。

finally关键字与try-catch块一起使用,以提供始终执行的语句即使出现一些异常,通常最终也会用来关闭资源。

finalize()方法由垃圾收集器在销毁对象之前执行,这是确保关闭所有全局资源的好方法。

在三者之中,最后只涉及到java异常处理。

 

12.当main方法抛出异常时会发生什么?

当main()方法抛出异常时,Java Runtime终止程序并在系统控制台中打印异常消息和堆栈跟踪。

 

13.我们可以有一个空的catch块吗?

我们可以有一个空的catch块,但它是最差编程的例子。我们永远不应该有空的catch块,因为如果异常被该块捕获,我们将没有关于异常的信息,并且它将成为调试它的噩梦。应该至少有一个日志记录语句来记录控制台或日志文件中的异常详细信息。

 

14.提供一些Java异常处理最佳实践?

与Java异常处理相关的一些最佳实践是:

  1. 使用特定异常以便于调试。

  2. 在程序中尽早抛出异常(Fail-Fast)。

  3. 在程序后期捕获异常,让调用者处理异常。

  4. 使用Java 7 ARM功能确保资源已关闭或使用finally块正确关闭它们。

  5. 始终记录异常消息以进行调试。

  6. 使用multi-catch块清洁关闭。

  7. 使用自定义异常从应用程序API中抛出单一类型的异常。

  8. 遵循命名约定,始终以Exception结束。

  9. 记录在javadoc中使用@throws的方法抛出的异常。

  10. 异常是昂贵的,所以只有在有意义的时候抛出它。否则,您可以捕获它们并提供空或空响应。

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

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

相关文章

复习总结01110

.1.//从控制台输入3个数,然后按从小到输出public static void test_num(){Scanner sc new Scanner(System.in);System.out.println("请输入第一个数:");int num1 sc.nextInt();System.out.println("请输入第二个数:");…

ASP.NET Core 网站在Docker中运行

Docker作为新一代的虚拟化方式,未来肯定会得到广泛的应用,传统虚拟机的部署方式要保证开发环境、测试环境、UAT环境、生产环境的依赖一致性,需要大量的运维人力,使用Docker我们可以实现一次部署,到处运行。 本文介绍如…

键值存储之外,Redis还有这些用法

转载自 键值存储之外,Redis还有这些用法 Redis是一个强大的内存数据结构存储,包含数据库,缓存和消息代理等多种用途。大多数人经常认为它不过是一个简单的键值存储,但其实它有更多的能力。下面给出一些实例 1.全页面缓存 首先…

2018蓝桥杯省赛---java---C---3(字母阵列)

题目描述 测试数据 FOAIQNALWIKEGNICJWAOSXDHTHZPOLGYELORAUHOHCZIERPTOOJUITQJCFNIYYQHSBEABBQZPNGYQTCLSKZFCYWDGOAIADKLSNGJ GSOZTQKCCSDWGUWAUOZKNILGVNLMCLXQVBJENIHIVLRPVVXXFTHQUXUAVZZOFFJHYLMGTLANQIAOQQILCDCJERJASNCTLYGRMHGF TSDFYTLVIBHKLJVVJUDMKGJZGNNSTPVLCKT…

复习总结0111

1.从控制台中输入三个数,然后从小到大输出 public static void mian(String []args){Scanner sc new Scanner(System.in);System.out.println("请输入第一个数:");int a sc.nextInt();System.out.println("请输入第二个数:&…

sql基本命令整理

1、 查看数据库中的表或查询数据库; show tables/databases; 2、 查看数据库中所有的表 show tables;(前提是使用use database 数据库;) 3、 查看数据表结构 describe 表名; 4、 创建数据…

微软确认5月2日召开新品发布会 8天后就是Build 2017大会

援引外媒 ZDNet 报道,微软计划在 5 月上旬召开新品发布会,重点围绕着 Windows 10 Cloud,并且有望公布关于 Surface Pro 5 的相关信息。今天这条消息已经得到了证实,微软官方宣布将于 5 月 2 日将会在纽约召开发布会,也…

面试进阶之字符串常量池

转载自 面试进阶之字符串常量池 作为最基础的引用数据类型,Java 设计者为 String 提供了字符串常量池以提高其性能,那么字符串常量池的具体原理是什么,我们带着以下三个问题,去理解字符串常量池: 字符串常量池的设计…

java实现人脸识别V3版本开发

有段时间没有写更新公众号了,也许好多人都忘记了自己还关注了这么个公众号。因为这段时间确实是有其他的事比较忙,还有一个原因就是自己在技术方面没有学习新的东西,所以没有可更新的(包括博客)今天,我决定…

2018蓝桥杯省赛---java---A---7(三体攻击)

题目描述 题目:三体人将对地球发起攻击。为了抵御攻击,地球人派出了 A  B  C 艘战舰,在太空中排成一个 A 层 B 行 C 列的立方体。其中,第 i 层第 j 行第 k 列的战舰(记为战舰 (i, j, k))的生命值为 …

23种设计模式彩图

原文地址:http://www.jianshu.com/p/4a02646f7c9d.NET社区新闻,深度好文,微信中搜索dotNET跨平台或扫描二维码关注

JDBC面试问题

转载自 JDBC面试问题 1.什么是JDBC API,何时使用它? Java DataBase Connectivity API允许我们使用关系数据库。JDBC API接口和类是 java.sql和javax.sql包的一部分。我们可以使用JDBC API来获取数据库连接,在数据库服务器中运行SQL查询和…

java实现人脸识别(使用百度云V3版本)

2017年,开发了第一个版本的人脸识别,当时费时有5天之久终于写出来了,但是只适用于火狐浏览器,别的浏览器都打不开摄像头。 2018年,将人脸识别重新完善,可以支持360、火狐、谷歌等主流浏览器,版…

2018蓝桥杯省赛---java---A---9(倍数问题)

题目描述 代码实现 package lanqiao;import java.util.ArrayList; import java.util.Collections; import java.util.List; import java.util.Scanner;public class Main {public static void main(String[] args){Scanner scanner new Scanner(System.in);int n scanner.ne…

基于持久化的wordcount程序 foreachRDD

基于持久化的wordCount程序!中途遇到了一个坑! 自己手动封装一个静态线程池,使用RDD的foreachPartition操作,并且在该操作内部,从静态连接池中,通过静态方法,获取一个连接,使用之后…

HTML5知识点总结

 HTML5基础: 一、HTML: Hyper Text MarkUp Language(超文本标记语言)。 二、W3C: 1.world wide web consortium(万维网联盟),成立于1994年,WEB技术领域最权威和最具影响力的国际中立性技术标准机构。 2.w3c标准包括&…

漫画:什么是鸡尾酒排序

转载自 漫画:什么是鸡尾酒排序 那么,鸡尾酒排序又是何方神圣呢?我们这一期将会详细讲述。 让我们首先来回顾一下冒泡排序的思想: 冒泡排序的每一个元素都可以像小气泡一样,根据自身大小,一点一点向着数…

2018蓝桥杯省赛---java---A---10(付账问题)

题目描述 思路分析 用贪心算法,要使标准差最小,则需要将每个人需付的钱接近于平均值。如果有人的钱低于当前平均值a1,则需要将这人的钱全部支付,此人不够的钱需让其他人付,然后可以计算剩余人所需付钱的平均值a2&…

java基础的知识点(一)

 初始Java: 一、程序: 1.通常指完成某些事物的一种既定方式和过程。 2.计算机程序:为了让计算机执行某些操作或解决某个问题而编写的一系列有序指定的集合。 二、java可以做什么: 1.开发桌面应用程序 2.开发网页应用程序 三、技…

想要学习设计模式,你得先会看类图,一张图读懂UML

虚线箭头指向依赖; 实线箭头指向关联; 虚线三角指向接口; 实线三角指向父类; 空心菱形能分离而独立存在,是聚合; 实心菱形精密关联不可分,是组合;