Java异常处理--异常处理知识点总结及企业真题

文章目录

  • 一、知识点总结
    • (1)异常处理概述
    • (2)异常处理的方式1:try-catch-finally
    • (3)异常处理的方式2:throws
    • (4)throw手动抛出异常对象
    • (5)自定义异常
  • 二、企业真题
    • (1)异常概述
      • 1、题目1
      • 2、题目2
      • 3、题目3
      • 4、题目4
      • 5、题目5
    • (2) try-catch-finally
      • 1、题目1
      • 2、题目2
      • 3、题目3
      • 4、题目4
      • 5、题目5
      • 6、题目6
    • (3)throw与throws
      • 1、题目1
      • 2、题目2
    • (4)自定义异常
      • 1、题目1

一、知识点总结

(1)异常处理概述

文章链接:https://blog.csdn.net/m0_55746113/article/details/135473445?spm=1001.2014.3001.5502

  1. 什么是异常?
    指的是程序在执行过程中,出现的非正常情况,如果不处理最终会导致JVM的非正常停止。(逻辑上的错误不算)

  2. 异常的抛出机制
    Java中把不同的异常用不同的类表示,一旦发生某种异常,就创建该异常类型的对象,并且抛出(throw)。
    然后程序员可以捕获(catch)到这个异常对象,并处理;如果没有捕获(catch)这个异常对象,那么这个异常对象将会导致程序终止。

  3. 如何对待异常
    对于程序出现的异常,一般有两种解决方法:
    一是遇到错误就终止程序的运行。另一种方法是程序员在编写程序时,就充分考虑到各种可能发生的异常和错误,极力预防和避免。实在无法避免的,要编写相应的代码进行异常的检测、以及异常的处理,保证代码的健壮性

  4. 异常的体系结构
    java.lang.Throwable:异常体系的根父类 (它的父类是Object)

  • java.lang.Error:错误。(基本不做处理)

    • Java虚拟机无法解决的严重问题。如:JVM系统内部错误、资源耗尽等严重情况。一般不编写针对性的代码进行处理。- StackOverflowError (栈内存溢出)
      OutOfMemoryError (堆内存溢出,简称OOM)
  • java.lang.Exception:异常

    • 我们可以编写针对性的代码进行处理

    • 编译时异常:(受检异常) 在执行javac.exe命令时,出现的异常。(这一章的异常处理针对的就是它

      • ClassNotFoundException
      • FileNotFoundException
      • IOException
    • 运行时异常:(非受检异常) 在执行java.exe命令时,出现的异常。(基本不做处理)

      • ArrayIndexOutOfBoundsException (数组越界–用非法索引访问数组时抛出的异常)

      • NullPointerException (空指针异常)

      • ClassCastException (类转换异常)

      • NumberFormatException (数据格式化异常)

      • InputMismatchException (输入类型不一致)

      • ArithmeticException (算术异常)

(2)异常处理的方式1:try-catch-finally

文章链接:https://blog.csdn.net/m0_55746113/article/details/135547506?spm=1001.2014.3001.5502

  1. 方式一(抓抛模型):try-catch-finally
  • 过程1:“抛”-- 产生异常的对象
    • 程序在执行的过程当中,一旦出现异常,就会在出现异常的代码处,生成对应异常类的对象,并将此对象抛出。(目前先看自动创建异常的对象并抛出)
    • 一旦抛出,此程序就不执行其后的代码了。
  • 过程2:“抓”-- 捕获处理
    • 针对于过程1中抛出的异常对象,进行捕获处理。此捕获处理的过程,就称为抓。
    • 一旦将异常进行了处理,代码就可以继续执行。
  1. 基本结构:
try{...... //可能产生异常的代码
}
catch( 异常类型1 e ){...... //当产生异常类型1型异常时的处置措施
}
catch( 异常类型2 e ){......     //当产生异常类型2型异常时的处置措施
}
finally{...... //无论是否发生异常,都无条件执行的语句
}
  1. 使用细节:
  • 将可能出现异常的代码声明在try语句中。一旦代码出现异常,就会自动生成一个对应异常类的对象。并将此对象抛出。
  • 针对于try中抛出的异常类的对象,使用之后的catch语句进行匹配。一旦匹配上,就进入catch语句块进行处理。一旦处理结束,代码就可继续向下执行。
  • 如果声明了多个catch结构,不同的异常类型在不存在子父类关系的情况下,谁声明在上面,谁声明在下面都可以。如果多个异常类型满足子父类的关系,则必须将子类声明在父类结构的上面。否则,报错。

catch中异常处理的方式:

① 自己编写输出的语句。

② printStackTrace():打印异常的详细信息。 (推荐)

③ getMessage():获取发生异常的原因。

try中声明的变量,出了try结构之后,就不可以进行调用了。

try-catch结构是可以嵌套使用的。

  1. 开发体会:
  • 对于运行时异常:

      开发中,通常就不进行显示的处理了。一旦在程序执行中,出现了运行时异常,那么就根据异常的提示信息修改代码即可。
    
  • 对于编译时异常:

      一定要进行处理。否则编译不通过。
    
  1. finally的使用说明:
    5.1 finally的理解
  • 我们将一定要被执行的代码声明在finally结构中。
  • 更深刻的理解:无论try中或catch中是否存在仍未被处理的异常,无论try中或catch中是否存在return语句等,finally中声明的语句都一定要被执行。
  • finally语句和catch语句是可选的,但finally不能单独使用。

5.2 什么样的代码我们一定要声明在finally中呢?

我们在开发中,有一些资源(比如:输入流、输出流,数据库连接、Socket连接等资源),在使用完以后,必须显式的进行关闭操作,否则,GC不会自动的回收这些资源。进而导致内存的泄漏。

为了保证这些资源在使用完以后,不管是否出现了未被处理的异常的情况下,这些资源能被关闭。我们必须将这些操作声明在finally中!

6.面试题

final 、 finally 、finalize 的区别

(3)异常处理的方式2:throws

文章链接:https://blog.csdn.net/m0_55746113/article/details/135618390?spm=1001.2014.3001.5502

  1. 格式:在方法的声明处,使用"throws 异常类型1,异常类型2,..."
  2. 举例:
public void test() throws 异常类型1,异常类型2,.. {//可能存在编译时异常 (运行时异常不用管它)
}
  1. 是否真正处理了异常?
  • 编译是否能通过的角度看,看成是给出了异常万一要是出现时候的解决方案。此方案就是,继续向上抛出(throws)。
  • 但是,此throws的方式,仅是将可能出现的异常抛给了此方法的调用者。此调用者仍然需要考虑如何处理相关异常。从这个角度来看,throws的方式不算是真正意义上处理了异常。
  1. 方法的重写的要求:(针对于编译时异常来说的)
    子类重写的方法抛出的异常类型可以与父类被重写的方法抛出的异常类型相同,或是父类被重写的方法抛出的异常类型的子类。

  2. 开发中,如何选择异常处理的两种方式?(重要、经验之谈)

  • 如果程序代码中,涉及到资源的调用(流、数据库连接、网络连接等),则必须考虑使用try-catch-finally来处理,保证不出现内存泄漏。
  • 如果父类被重写的方法没有throws异常类型,则子类重写的方法中如果出现异常,只能考虑使用try-catch-finally进行处理,不能throws。(父类没有throws,子类也不能throws)
  • 开发中,方法a中依次调用了方法b,c,d等方法,方法b,c,d之间是递进关系。此时,如果方法b,c,d中有异常,我们通常选择使用throws,而方法a中通常选择使用try-catch-finally

(4)throw手动抛出异常对象

文章链接:https://blog.csdn.net/m0_55746113/article/details/135656358?spm=1001.2014.3001.5502

  1. 为什么需要手动抛出异常对象
    在实际开发中,如果出现不满足具体场景的代码问题,我们就有必要手动抛出一个指定类型的异常对象。

  2. 如何理解"自动 vs 手动"抛出异常对象?
    过程1:“抛”
    “自动抛” : 程序在执行的过程当中,一旦出现异常,就会在出现异常的代码处,自动生成对应异常类的对象,并将此对象抛出。
    “手动抛” :程序在执行的过程当中,不满足指定条件的情况下,我们主动的使用"throw + 异常类的对象"方式抛出异常对象。
    过程2:“抓”
    狭义上讲:try-catch的方式捕获异常,并处理。
    广义上讲:把“抓”理解为“处理”。则此时对应着异常处理的两种方式:① try-catch-finally ② throws

  3. 如何实现手动抛出异常?
    方法内部,满足指定条件的情况下,使用"throw 异常类的对象"的方式抛出。

  4. 注意点:throw后的代码不能被执行,编译不通过

  5. 面试题:throw 和 throws 的区别? “上游排污,下游治污

(5)自定义异常

文章链接:https://blog.csdn.net/m0_55746113/article/details/135678410?spm=1001.2014.3001.5502

  1. 如何自定义异常类?
    ① 继承于现有的异常体系。通常继承于RuntimeException \ Exception
    ② 通常提供几个重载的构造器
    ③ 提供一个全局常量,声明为:static final long serialVersionUID

  2. 如何使用自定义异常类?

  • 在具体的代码中,满足指定条件的情况下,需要手动的使用"throw + 自定义异常类的对象"方式,将异常对象抛出。
  • 如果自定义异常类是非运行时异常,则必须考虑如何处理此异常类的对象。(具体的:① try-catch-finally ② throws)
  1. 为什么需要自定义异常类?
    我们其实更关心的是,通过异常的名称就能直接判断此异常出现的原因
    既然如此,我们就有必要在实际开发场景中,不满足我们指定的条件时,指明我们自己特有的异常类。通过此异常类的名称,就能判断出具体出现的问题。

二、企业真题

(1)异常概述

1、题目1

🌋题目描述:Java的异常体系简单介绍下(网*)

包含问题:
> 异常的顶级接口是什么(软**力) 答:Throwable> 异常类的继承关系,exception下都有哪些类?(上海*冉信息)

🍰答

java.lang.Throwable:异常体系的根父类 (它的父类是Object)

  • java.lang.Error:错误。(基本不做处理)

    • Java虚拟机无法解决的严重问题。如:JVM系统内部错误、资源耗尽等严重情况。一般不编写针对性的代码进行处理。- StackOverflowError (栈内存溢出)
      OutOfMemoryError (堆内存溢出,简称OOM)
  • java.lang.Exception:异常

    • 我们可以编写针对性的代码进行处理

    • 编译时异常:(受检异常) 在执行javac.exe命令时,出现的异常。(这一章的异常处理针对的就是它

      • ClassNotFoundException
      • FileNotFoundException
      • IOException
    • 运行时异常:(非受检异常) 在执行java.exe命令时,出现的异常。(基本不做处理)

      • ArrayIndexOutOfBoundsException (数组越界–用非法索引访问数组时抛出的异常)
      • NullPointerException (空指针异常)
      • ClassCastException (类转换异常)
      • NumberFormatException (数据格式化异常)
      • InputMismatchException (输入类型不一致)
      • ArithmeticException (算术异常)

2、题目2

🌋题目描述:Java异常处理机制(*科软)

🍰答

两种处理方案:try-catch-finallythrows

3、题目3

🌋题目描述:异常的两种类型,Error和Exception的区别(上海冠*新创、北京中**译、*度)

🍰答

①Error:错误。Java虚拟机无法解决的严重问题。如:JVM系统内部错误、资源耗尽等严重情况。一般不编写针对性的代码进行处理

②Exception:异常。我们可以编写针对性的代码进行处理

4、题目4

🌋题目描述:运行时异常与一般异常有何异同?(华*思为)

🍰答

运行时异常:RuntimeException

  • 编译可以通过。在运行时可能抛出。出现的概率高一些;一般针对于运行时异常,都不处理。

一般异常:Exception

  • 编译不能通过。要求必须在编译之前,考虑异常的处理。不处理编译不通过。

5、题目5

🌋题目描述:说几个你常见到的异常(华油**普)

类似问题:
> 请列出Java中常见的几种异常?(百*园)
> 给我一个你最常见到的runtime exception。(*蝶)

🍰答

①开发1-2年:

  • 编译时异常:(受检异常)在执行javac.exe命令时,出现的异常。
    • ClassNotFoundException
    • FileNotFoundException
    • IOException
  • 运行时异常:(非受检异常)在执行java.exe命令时,出现的异常。
    • ArrayIndexOutOfBoundsException
    • NullPointerException
    • ClassCastException
    • NumberFormatException
    • InputMismatchException
    • ArithmeticException

②开发3年以上:

OOM

(2) try-catch-finally

1、题目1

🌋题目描述:说说final、finally、finalize的区别(北京中**译、艾软件、拓思、*科软)

类似问题:
> finallyfinal的区别(*科软)

🍰答

  • final:最终的

  • finally:try-catch-finally中必须要被执行的代码

  • finalize:方法名,任何一个类直接或间接继承于Object,不重写的话不会用这个方法。当这个类的对象要被GC回收的时候,在回收之前的遗言写在这里面,就是当前类的对象要调用的方法。在jdk9之后被标记为过时的方法了。

🎲注

关于finalize,在这一篇博客里面:https://blog.csdn.net/m0_55746113/article/details/134389583?spm=1001.2014.3001.5502

如下:

image.png

2、题目2

🌋题目描述:如果不使用try-catch,程序出现异常会如何?(上海冠*新创科技)

🍰答

对于当前方法来讲,如果不使用try-catch,则在出现异常对象以后会抛出此对象。

如果没有处理方案,就会终止程序的执行。(throws不会在根本处解决问题)

3、题目3

🌋题目描述:try … catch捕捉的是什么异常?(北京亿*东方)

🍰答

Exception。非Error

4、题目4

🌋题目描述:如果执行finally代码块之前,方法返回了结果或者jvm退出了,这时finally块中的代码还会执行吗?(恒*电子)

🍰答

方法返回了结果:finally会执行。

JVM退出了:finally一般会执行;特别的,System.exit(0);(强制结束)此时finally不会执行。

5、题目5

🌋题目描述:在try语句中有return语句,最后写finally语句,finally语句中的code会不会执行?何时执行?如果执行是在return前还是后(拓*思、华**为)

🍰答

方法是一个栈帧,放在栈里面。栈帧又分为好几个部分,有局部变量表(存放局部变量)、操作数栈(用来临时存放数据)。

比如:

public static void main(String[] args) {int result = test("a");System.out.println(result);}public static int test(String str) {try {Integer.parseInt(str);return 1;} catch (NumberFormatException e) {return -1;} finally {System.out.println("test结束");}}

当我们执行return -1的时候,它会将-1放入操作数栈里面,按道理说下一步应该将-1拿出去,方法就结束了。但是此时先不能拿出去,需要先执行finally里面的语句,执行完之后再把-1拿出去。

所以return -1这里有两个过程,第一个过程是将-1放入操作数栈里面,第二个过程是将-1拿出去。在这两个过程中间,插入了finally的语句。

finally中的语句会执行。整体来看,是finally先;但是细节来看,是return先,再finally,最后再return。

6、题目6

🌋题目描述:捕获异常在catch块里一定会进入finally吗?catch里能return吗?catch里return还会进finally吗?在try里return是什么情况?(*蓝)

🍰答

会;可以;会;return之前要先执行一下finally。(finally一定会被执行的)

(3)throw与throws

1、题目1

🌋题目描述:throw和throws的区别?(北京亿**方、北京新*阳光)

🍰答

角度1:“形”,即使用的格式

  • throw:使用在方法内部,“throw 异常类的对象
  • throws:使用在方法的声明处,“throws 异常类1,异常类2,...

角度2:"角色"或作用不同

上游排污,下游治污。

  • 过程1:“抛” -->排污
    • throw手动将异常抛出,相当于生成一个异常对象(所谓的自动抛,只不过不是我们自己写的代码而已,源码里面也是用throw关键字来写的)
  • 过程2:“抓” -->治污
    • try-catch (根本解决)
    • throws对异常对象的一种处理,抛向该方法的调用方法

2、题目2

🌋题目描述:子类重写父类抛出异常的方法,能否抛出比父类更高级别的异常类(顺*)

🍰答

不能!

子类重写父类抛出异常的方法,只能和父类抛出异常一样或者这个异常的子类

(4)自定义异常

1、题目1

🌋题目描述:如何自定义一个异常?(*软国际)

🍰答

① 继承于现有的异常体系。通常继承于RuntimeException \ Exception

② 通常提供几个重载的构造器

③ 提供一个全局常量,声明为:static final long serialVersionUID

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

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

相关文章

2024美赛数学建模思路 - 案例:ID3-决策树分类算法

文章目录 0 赛题思路1 算法介绍2 FP树表示法3 构建FP树4 实现代码 建模资料 0 赛题思路 (赛题出来以后第一时间在CSDN分享) https://blog.csdn.net/dc_sinor?typeblog 1 算法介绍 FP-Tree算法全称是FrequentPattern Tree算法,就是频繁模…

IOS-UIAlertController简单使用-Swift

UIAlertControlle时IOS的对话框控制器(警报控制器),简单使用方法如下: 步骤都一样,先是创建UIAlertController,然后创建UIAlertAction,再将UIAlertAction添加到UIAlertController中,…

如何安装配置VisualSVN服务并实现公网访问本地服务【内网穿透】

文章目录 前言1. VisualSVN安装与配置2. VisualSVN Server管理界面配置3. 安装cpolar内网穿透3.1 注册账号3.2 下载cpolar客户端3.3 登录cpolar web ui管理界面3.4 创建公网地址 4. 固定公网地址访问 前言 SVN 是 subversion 的缩写,是一个开放源代码的版本控制系统…

【嘉立创EDA-PCB设计指南】3.网络表概念解读+板框绘制

前言:本文对网络表概念解读板框绘制(确定PCB板子轮廓) 网络表概念解读 在本专栏的上一篇文章【嘉立创EDA-PCB设计指南】2,将设计的原理图转为了PCB,在PCB界面下出现了所有的封装,以及所有的飞线属性&…

每日一题 2171. 拿出最少数目的魔法豆(中等)

只有两种拿法,要么全拿光,剩下的要取到和最少魔法豆的袋子的数目相等,显然关键在于每个袋子的最少豆子数量是多少(少于这个数量的袋子是全拿出的)想到了从小到大排序先把最少豆子的袋子认为是基线(最少数量…

计算机毕业设计 基于Java的国产动漫网站的设计与实现 Java实战项目 附源码+文档+视频讲解

博主介绍:✌从事软件开发10年之余,专注于Java技术领域、Python人工智能及数据挖掘、小程序项目开发和Android项目开发等。CSDN、掘金、华为云、InfoQ、阿里云等平台优质作者✌ 🍅文末获取源码联系🍅 👇🏻 精…

React与Vue性能对比:两大前端框架的性能

React和Vue是当前最流行的前端框架之一,它们在性能方面具有一些差异。 React的虚拟DOM机制使得它在渲染大型应用时表现出色。它通过将页面抽象为虚拟DOM树,并且只更新改变了的部分,从而减少了实际DOM的操作次数。这种优化可以提高应用的性能&…

C语言——atoi函数解析

目录 前言 atoi函数的介绍 atoi函数的使用 atoi函数的模拟实现 前言 对于atoi函数大家可能会有些陌生&#xff0c;不过当你选择并阅读到这里时&#xff0c;请往下阅读&#xff0c;我相信你能对atoi函数熟悉该函数的头文件为<stdlib.h> 或 <cstdlib> atoi函数的…

区间预测 | Matlab实现GRU-Adaboost-ABKDE的集成门控循环单元自适应带宽核密度估计多变量回归区间预测

区间预测 | Matlab实现GRU-Adaboost-ABKDE的集成门控循环单元自适应带宽核密度估计多变量回归区间预测 目录 区间预测 | Matlab实现GRU-Adaboost-ABKDE的集成门控循环单元自适应带宽核密度估计多变量回归区间预测效果一览基本介绍程序设计参考资料 效果一览 基本介绍 1.Matlab实…

从零开始学习Zeppelin:大数据可视化分析的交互式开发系统!

介绍&#xff1a;Apache Zeppelin是一个基于Web的交互式开发系统&#xff0c;主要用于进行大数据可视化分析。其核心概念是notebook&#xff0c;所有的操作都可以在notebook中完成。Zeppelin提供了一套非常全面的数据分析解决方案&#xff0c;支持数据采集、数据发现、数据分析…

ES自动补全

安装IK分词器 要实现根据字母做补全&#xff0c;就必须对文档按照拼音分词。在GitHub上恰好有elasticsearch的拼音分词插件。地址&#xff1a;GitHub - medcl/elasticsearch-analysis-pinyin: This Pinyin Analysis plugin is used to do conversion between Chinese characte…

Verilog刷题笔记15

题目&#xff1a; An adder-subtractor can be built from an adder by optionally negating one of the inputs, which is equivalent to inverting the input then adding 1. The net result is a circuit that can do two operations: (a b 0) and (a ~b 1). See Wikipe…

openssl3.2 - 官方demo学习 - test - certs

文章目录 openssl3.2 - 官方demo学习 - test - certs概述笔记.sh的执行语句打印的方法要修改的实际函数END openssl3.2 - 官方demo学习 - test - certs 概述 官方demos目录有证书操作的例子 已经做了笔记 openssl3.2 - 官方demo学习 - certs 但是这个demos/certs目录的脚本,…

PXE——高效批量网络装机

目录 部署PXE远程安装服务 1.PXE概述 2.实现过程 3.实验操作 3.1安装dhcp、vsftpd、tftp-server.x86_64、syslinux服务 3.2修改配置文件——DHCP 3.3修改配置文件——TFTP 3.4kickstart——无人值守安装 3.4.1选择程序 3.4.2修改基础配置 3.4.3修改安装方法 3.4.4…

《TrollStore巨魔商店》TrollStore2安装使用教程支持IOS14.0-16.6.1

TrollStore(巨魔商店) 简单的说就相当于一个永久的免费证书&#xff0c;它可以给你的iPhone和iPad安装任何你想要安装的App软件&#xff0c;而且不需要越狱,不用担心证书签名过期的问题&#xff0c;不需要个人签名和企业签名。 支持的版本&#xff1a; TrollStore安装和使用教…

(二十)Flask之上下文管理第一篇(粗糙缕一遍源码)

每篇前言&#xff1a; &#x1f3c6;&#x1f3c6;作者介绍&#xff1a;【孤寒者】—CSDN全栈领域优质创作者、HDZ核心组成员、华为云享专家Python全栈领域博主、CSDN原力计划作者 &#x1f525;&#x1f525;本文已收录于Flask框架从入门到实战专栏&#xff1a;《Flask框架从入…

基于Xilinx K7-410T的高速DAC之AD9129开发笔记(二)

引言&#xff1a;上一篇文章我们简单介绍了AD9129的基础知识&#xff0c;包括芯片的重要特性&#xff0c;外部接口相关的信号特性等。本篇我们重点介绍下项目中FPGA与AD9129互联的原理图设计&#xff0c;包括LVDS IO接口设计、时钟电路以、供电设计以及PCB设计。 LVDS数据接口设…

MySQL中根据出生日期计算年龄

创建student表 mysql> create table student( -> sid int primary key comment 学生号, -> sname varchar(20) comm…

TCP 拥塞控制对数据延迟的影响

哈喽大家好&#xff0c;我是咸鱼 今天分享一篇文章&#xff0c;是关于 TCP 拥塞控制对数据延迟产生的影响的。作者在服务延迟变高之后进行抓包分析&#xff0c;结果发现时间花在了 TCP 本身的机制上面&#xff1a;客户端并不是将请求一股脑发送给服务端&#xff0c;而是只发送…

【数据结构】堆:堆的构建,堆的向上调整算法,堆的向下调整算法、堆排序

目录 一、堆的定义 1、堆的定义&#xff1a; 2、根节点与其左、右孩子间的联系 二、堆的创建 1、堆的向下调整算法 2、堆的向上调整算法 三、堆排序 一、堆的定义 1、堆的定义&#xff1a; 堆可以被看作是一棵完全二叉树的数组对象。即在存储结构上是数组&#xff0c…