详解Java异常和异常面试题(上)

news2024/11/28 6:37:19

1.异常的体系结构

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

2.从程序执行过程,看编译时异常和运行时异常

在这里插入图片描述
编译时异常:执行javac.exe命名时,可能出现的异常
运行时异常:执行java.exe命名时,出现的异常

1.运行时异常
 是指编译器不要求强制处置的异常。一般是指编程时的逻辑错误,是程序
员应该积极避免其出现的异常。java.lang.RuntimeException类及它的子
类都是运行时异常。
 对于这类异常,可以不作处理,因为这类异常很普遍,若全处理可能会对
程序的可读性和运行效率产生影响。

2.编译时异常
 是指编译器要求必须处置的异常。即程序在运行时由于外界因素造成的一
般性异常。编译器要求Java程序必须捕获或声明所有编译时异常。
 对于这类异常,如果程序不处理,可能会带来意想不到的结果。

3.常见的异常类型,请举例说明:
//******************以下是运行时异常***************************
	//ArithmeticException
	@Test
	public void test6(){
		int a = 10;
		int b = 0;
		System.out.println(a / b);
	}
	
	//InputMismatchException
	@Test
	public void test5(){
		Scanner scanner = new Scanner(System.in);
		int score = scanner.nextInt();
		System.out.println(score);
		
		scanner.close();
	}
	
	//NumberFormatException
	@Test
	public void test4(){
		
		String str = "123";
		str = "abc";
		int num = Integer.parseInt(str);
		
		
		
	}
	
	//ClassCastException
	@Test
	public void test3(){
		Object obj = new Date();
		String str = (String)obj;
	}
	
	//IndexOutOfBoundsException
	@Test
	public void test2(){
		//ArrayIndexOutOfBoundsException
//		int[] arr = new int[10];
//		System.out.println(arr[10]);
		//StringIndexOutOfBoundsException
		String str = "abc";
		System.out.println(str.charAt(3));
	}
	
	//NullPointerException
	@Test
	public void test1(){
		
//		int[] arr = null;
//		System.out.println(arr[3]);
		
		String str = "abc";
		str = null;
		System.out.println(str.charAt(0));
		
	}

	//******************以下是编译时异常***************************
	@Test
	public void test7(){
		File file = new File("hello.txt");
		FileInputStream fis = new FileInputStream(file);
		
		int data = fis.read();
		while(data != -1){
			System.out.print((char)data);
			data = fis.read();
		}
		
		fis.close();
		
	}

2.异常的处理

方式一:

●如果一个方法内抛出异常,该异常对象会被抛给调用者方法中处理。如果异常没有在调用者方法中处理,它继续被抛给这个调用
方法的_上层方法。这个过程将一-直继续下去,直到异常被处理。这一过程称为捕获(catch)异常。

●如果一个异常回到main()方法,并且main()也不处理,则程序运行终止。

●程序员通常只能处理Exception,而对Error无能为力。

1.java异常处理的抓抛模型
过程一:“抛”:程序在正常执行的过程中,一旦出现异常,就会在异常代码处生成一个对应异常类的对象。

  •       并将此对象抛出。
    
  •       一旦抛出对象以后,其后的代码就不再执行。
    
  •       关于异常对象的产生:① 系统自动生成的异常对象
    
  •       ② 手动的生成一个异常对象,并抛出(throw)
    
  •       过程二:"抓":可以理解为异常的处理方式:① try-catch-finally  ② throws
    

2.异常处理方式一:try-catch-finally

2.1 使用说明:

try{

 * 		//可能出现异常的代码
 * 		
 * 		}catch(异常类型1 变量名1){
 * 		//处理异常的方式1
 * 		}catch(异常类型2 变量名2){
 * 		//处理异常的方式2
 * 		}catch(异常类型3 变量名3){
 * 		//处理异常的方式3
 *		}
 * 		....
  		finally{
  		//一定会执行的代码
  		}
  		
  •  说明:
    
  •  1. finally是可选的。
    
  •  2. 使用try将可能出现异常代码包装起来,在执行过程中,一旦出现异常,就会生成一个对应异常类的对象,根据此对象的类型,去catch中进行匹配
    
  •  3. 一旦try中的异常对象匹配到某一个catch时,就进入catch中进行异常的处理。一旦处理完成,
    
  • 就跳出当前的try-catch结构(在没写finally的情况。继续执行其后的代码)
  •  4. catch中的异常类型如果没子父类关系,则谁声明在上,谁声明在下无所谓。
    
  •  catch中的异常类型如果满足子父类关系,则要求子类一定声明在父类的上面。否则,报错
    
  •  5. 常用的异常对象处理的方式: ① String  getMessage()    ② printStackTrace()
    
  •  6. 在try结构中声明的变量,再出了try结构以后,就不能再被调用
    
  •  7. try-catch-finally结构可以嵌套
    

总结:如何看待代码中的编译时异常和运行时异常?

  • 体会1:使用try-catch-finally处理编译时异常,是得程序在编译时就不再报错,但是运行时仍可能报错。相当于我们使用try-catch-finally将一个编译时可能出现的异常,延迟到运行时出现。

  • 体会2:开发中,由于运行时异常比较常见,所以我们通常就不针对运行时异常编写try-catch-finally了。针对于编译时异常,我们说一定要考虑异常的处理。
    2.2:finally的再说明:

  • 1.finally是可选的

  • 2.finally中声明的是一定会被执行的代码。即使catch中又出现异常了,try中有return语句,catch中有return语句等情况。try 和 catch中的return语句在finally执行完成之后执行。try catch finally 中只有一个return被执行。(return 结束方法)

  • *try {}里有一个return语句,那么紧跟在这个try后的finally {}里的code会不会被执行,什么时候被执行,在return前还是后?*

    答:会执行,在return前执行

  • 3.像数据库连接、输入输出流、网络编程Socket等资源,JVM是不能自动的回收的,我们需要自己手动的进行资源的释放。此时的资源释放,就需要声明在finally中。

2.3:[面试题]

final、finally、finalize三者的区别?

类似:
throw 和 throws
Collection 和 Collections
String 、StringBuffer、StringBuilder
ArrayList 、 LinkedList
HashMap 、LinkedHashMap
重写、重载

结构不相似的:
抽象类、接口
== 、 equals()
sleep()、wait()

方式二:

异常处理方式二:
"throws + 异常类型"写在方法的声明处。指明此方法执行时,可能会抛出的异常类型。
一旦当方法体执行时,出现异常,仍会在异常代码处生成一个异常类的对象,此对象满足throws后异常类型时,就会被抛出。异常代码后续的代码,就不再执行!

  1. 对比两种处理方式
    try-catch-finally:真正的将异常给处理掉了。
    throws的方式只是将异常抛给了方法的调用者。并没真正将异常处理掉。

  2. 体会开发中应该如何选择两种处理方式?

  • 5.1 如果父类中被重写的方法没throws方式处理异常,则子类重写的方法也不能使用throws,意味着如果子类重写的方法中异常,必须使用try-catch-finally方式处理。
  • 5.2 执行的方法a中,先后又调用了另外的几个方法,这几个方法是递进关系执行的。我们建议这几个方法使用throws的方式进行处理。而执行的方法a可以考虑使用try-catch-finally方式进行处理。

补充:

方法重写的规则之一:
子类重写的方法抛出的异常类型不大于父类被重写的方法抛出的异常类型(我们常常将父类的引用作为方法的参数,利用父类的引用完成方法体的实现。当使用方法时,子类向上转型,完成函数的调用。因为在方法实现时我们并不知道确切的子类,所以如果此时需要异常处理,我们只能利用父类方法的异常来作为catch的参数。)

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

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

相关文章

网络安全:信息收集专总结【社会工程学】

前言 俗话说“渗透的本质也就是信息收集”,信息收集的深度,直接关系到渗透测试的成败,打好信息收集这一基础可以让测试者选择合适和准确的渗透测试攻击方式,缩短渗透测试的时间。 一、思维导图 二、GoogleHacking 1、介绍 利用…

HVV常问的Web漏洞(护网蓝初面试干货)

目录 1、SQL注入 (1)原理 (2)分类 (3)防御 2、XSS (1)原理 (2)分类 3、中间件(解析漏洞) (1)IIS6.X …

【AI实战】开源大语言模型LLMs汇总

【AI实战】开源大语言模型LLM汇总 大语言模型开源大语言模型1、LLaMA2、ChatGLM - 6B3、Alpaca4、PandaLLM5、GTP4ALL6、DoctorGLM (MedicalGPT-zh v2)7、MedicalGPT-zh v18、Cornucopia-LLaMA-Fin-Chinese9、minGPT10、InstructGLM11、FastChat12、Luot…

在线原型设计工具推荐

原型设计是每个产品经理必备的基本技能。 本文从即时设计原型设计的步骤开始,帮助您快速使用即时设计制作高还原度、丰富互动的产品原型。 利用即时设计进行原型设计的优势 快速启动原型设计工作 借助即时设计内置设计系统和社区资源,包括大量原型设…

Hive执行计划之什么是hiveSQL向量化模式及优化详解

目录 文章目录 1.什么是hive向量化模式2.Hive向量化模式支持的使用场景2.1 hive向量化模式使用前置条件2.2 向量模式支持的数据类型2.3 向量化模式支持的函数 3.如何查看hiveSQL向量化运行信息3.1 explain vectorization only只查询向量化描述信息内容3.2 explain vectorizati…

javaScript蓝桥杯---JSON 生成器

目录 一、介绍二、准备三、目标四、代码五、完成 一、介绍 JSON 已经是大家必须掌握的知识点,JSON 数据格式为前后端通信带来了很大的便利。在开发中,前端开发工程师可以借助于 JSON 生成器快速构建一个 JSON 用来模拟数据。 本题请你开发一个简易的 J…

chatgpt赋能python:Python快速安装库

Python快速安装库 Python作为一种功能强大且易于学习的编程语言,已经成为许多开发人员的首选。在Python中,库是重要的一部分,它们提供了各种功能和工具来简化开发过程。安装这些库的过程可能会比较繁琐,但我们可以通过一些简单的…

PHP的学习--Traits新特性

自 PHP 5.4.0 起,PHP 实现了代码复用的一个方法,称为 traits。 Traits 是一种为类似 PHP 的单继承语言而准备的代码复用机制。Trait 为了减少单继承语言的限制,使开发人员能够自由地在不同层次结构内独立的类中复用方法集。Traits 和类组合的…

博客系统测试用例设计之自动化测试

测试用例设计之自动化测试 🌷 一 测试用例设计🌺 1 功能测试🌸 (1)登录功能🌸 (2)列表页功能🌸 (3)编辑博客功能🌸 (4&…

大厂设计师都在用的9个灵感工具

每一件伟大的设计作品都离不开设计师灵感的爆发。设计师有很多灵感来源,比如精美的摄影图片、酷炫的网站设计、APP的特色功能、友好的用户体验动画,或者一篇文章。 设计师每天都需要收集灵感,把灵感收集当成日常生活。在这篇文章中&#xff…

自动化测试工具比较:Selenium vs. Cypress

简介 Selenium是一个广泛应用的测试自动化工具,支持多种编程语言和浏览器。它使用WebDriver协议与浏览器进行通信,可以模拟用户在浏览器中的交互行为。Cypress是一个相对较新的测试自动化工具,它专注于现代Web应用程序的测试,并提…

LarkXR知识库 | 开发者社区FAQ合集(二)

LarkXR是一套基于GPU云化、图形容器、音视频实时编解码、网络传输优化等核心技术的通用型实时云渲染解决方案,帮助XR领域企业级用户及开发者快速搭建XR应用上云通道,使其在各类智能终端上流畅的运行、使用及传播。 平行云开发者社区上线以来&#xff0c…

Git基本知识

Git基本知识 1、Git 资料参考 Git 官网:https://book.git-scm.com/ Git 完整命令手册地址:http://git-scm.com/docs Git 中文文档:https://git-scm.com/book/zh/v2 2、Git安装 Git 各平台安装包下载地址为: http://git-scm…

F407标准库之定时器触发AD转换

关于ADC转换,正点原子的标准库开发中讲的是:软件触发一次转换,然后获取一个数据,没提及外部触发,也没提及ADC中断。 如果要多次读取数据,可以通过循环延时来实现。 这种情况就是通过多次调用,轮…

中国电子学会2023年05月份青少年软件编程Scratch图形化等级考试试卷三级真题(含答案)

2023-05 Scratch三级真题 分数:100 题数:38 测试时长:60min 一、单选题(共25题,共50分) 1. 关于变量,下列描述错误的是?(A )(2分) A.只能建一个变量 …

【CANoe】CAPL如何检测周期性报文

文章目录 一、实例1、新建工程2、增加两个 Module3、选择在线模式(Online Mode)仿真总线(Simulated Bus)4、配置CAPL Test Moduletest.can代码如下: 5、配置CAN IG(发送周期报文0x101)6、测试结果 二、核心代码三、CAPL函数详解截图参考: 一、实例 以下…

浅谈这些年如何被MDK, IAR, GCC和厂家SDK版本兼容性“蹂躏”, 一代版本一代坑

原创文章,转载请注明出处:https://www.armbbs.cn/forum.php?modviewthread&tid119562 版本迭代是嵌入式开发永久的痛,这么多年不知道浪费了多少时间在版本迭代上。 部分系统组件还好点,有个LTS长期支持版,而厂家…

侧信道攻击:SPA / DPA

参考资料:Cryptographic Engineering, by Cetin Kaya Ko, Editor Springer. 文章目录 Side-Channel AnalysisTiming AnalysisSample Power AnalysisDifferential Power Analysis其他攻击 对抗方法 Side-Channel Analysis 对于密码算法的攻击手段,往往是…

【LoRaWAN】单播与组播multicast调试记录

本文主要记录 【LoRaWAN】单播与组播multicast调试过程的问题 2023.06.09 📋 个人简介 💖 作者简介:大家好,我是喜欢记录零碎知识点的小菜鸟。😎📝 个人主页:[欢迎访问我的 Ethernet_Comm 博客…

甘孜州文化旅游产品市场营销策略研究_kaic

甘孜州文化旅游产品市场营销策略研究 摘要: 近年来,随着文化旅游的兴起,越来越多的旅游者渴望精神层面的满足,获得新奇的文化体验,而我国文化旅游仍处于单层次的观赏旅游。本文研究背景包括对旅游行业的背景介绍&#…