Java 基础面试题——异常

news2024/11/14 15:03:45

目录

  • 1.Exception 和 Error 有什么区别?
  • 2.Throwable 类中常用方法有哪些?
  • 3.Checked Exception 和 Unchecked Exception 有什么区别?
  • 4.throw 和 throws 的区别是什么?
  • 5.try-catch-finally 如何使用?
  • 6.finally 块中的代码一定会执行吗?
  • 7.异常使用有哪些需要注意的地方?
  • 8.什么时候用 assert?如何使用 assert?
  • 9.什么是内存泄漏和内存溢出?

1.Exception 和 Error 有什么区别?

(1)首先来看看 Java 中的异常层次结构图

在这里插入图片描述

(2)在 Java 中,所有的异常都有一个共同的祖先 java.lang 包中的 Throwable 类,Throwable 类有两个重要的子类:

  • Exception:程序本身可以处理的异常,可以通过 catch 来进行捕获。Exception 又可以分为以下两种异常:
    • Checked Exception:受检查异常,必须处理;
    • Unchecked Exception:不受检查异常,可以不处理;
  • Error:Error 属于程序无法处理的错误 ,例如虚拟机内存溢出错误 (OutOfMemoryError)、类定义错误 (NoClassDefFoundError) 等 。这些异常发生时,Java 虚拟机一般会选择线程终止。

2.Throwable 类中常用方法有哪些?

(1)String getMessage():返回异常发生时的简要描述。
(2)String toString():返回异常发生时的详细信息。
(3)String getLocalizedMessage():返回异常对象的本地化信息。使用 Throwable 的子类覆盖这个方法,可以生成本地化信息。如果子类没有覆盖该方法,则该方法返回的信息与 getMessage() 返回的结果相同。
(4)void printStackTrace():在控制台上打印 Throwable 对象封装的异常信息。

3.Checked Exception 和 Unchecked Exception 有什么区别?

(1)Checked Exception 即受检查异常,Java 代码在编译过程中,如果受检查异常没有被 catch 或者 throws 关键字处理的话,就无法通过编译。例如下面这段 I/O 操作的代码:

在这里插入图片描述

(2)Unchecked Exception 即不受检查异常,Java 代码在编译过程中 ,我们即使不处理不受检查异常也可以正常通过编译。RuntimeException 及其子类都统称为不受检查异常,常见的有:

  • ArithmeticException(算术异常)
  • ClassCastException (类转换异常)
  • IllegalArgumentException (非法参数异常)
  • NumberFormatException(字符串转换为数字格式异常,IllegalArgumentException 的子类)
  • IndexOutOfBoundsException (下表越界异常)
  • NullPointerException (空指针异常)
  • SecurityException (安全异常)
  • UnsupportedOperationException(不支持的操作错误,例如重复创建同一用户)

更多 RuntimeException 的子类可在 IDEA 中进行查看:

在这里插入图片描述

4.throw 和 throws 的区别是什么?

(1)throw
① 表示方法内抛出某种异常对象(只能是一个);
② 用于程序员自行产生并抛出异常;
③ 位于方法体内部,可以作为单独语句使用;
④ 如果异常对象是非 RuntimeException,则需要在方法申明时加上该异常的抛出,即需要加上 throws 语句或者在方法体内使用 try catch 处理该异常,否则编译报错;
⑤ 执行到 throw 语句则后面的语句块不再执行;

(2)throws
① 方法的定义上使用 throws 表示这个方法可能抛出某些异常(可以有多个);
② 用于声明在该方法内抛出了异常;
③ 必须跟在方法参数列表的后面,不能单独使用;
④ 需要由方法的调用者进行异常处理;

package test;

import java.io.IOException;

class Solution {
    
    /**
     * 测试 throws 关键字
     * @throws NullPointerException
     */
    public static void testThrows() throws NullPointerException {
        Integer i = null;
        System.out.println(i + 1);
    }
    
    /**
     * 测试 throw 关键字抛出运行时异常
     * @param i
     */
    public static void testThrow(Integer i) {
        if (i == null) {
            //运行时异常不需要在方法上申明
            throw new NullPointerException();
        }
    }
    
    /**
     * 测试 throw 关键字抛出非运行时异常,需要方法体需要加 throws 异常抛出申明
     * @param filePath
     */
    public static void testThrow(String filePath) throws IOException {
        if (filePath == null) {
            //非运行时异常,需要方法体需要加 throws 异常抛出申明
            throw new IOException();
        }
    }
    
    public static void main(String[] args) {
        testThrows();
        
        Integer i = null;
        testThrow(i);
        
        String filePath = null;
        try {
            testThrow(filePath);
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

上述代码中三个方法对应的异常如下:

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

5.try-catch-finally 如何使用?

(1)try 块:用于捕获异常。其后可接零个或多个 catch 块,如果没有 catch 块,则必须跟一个 finally 块。
(2)catch 块: 用于处理 try 捕获到的异常。
(3)finally 块 : 无论是否捕获或处理异常,finally 块里的语句都会被执行。但需要注意的是,当在 try 块或 catch 块中遇到 return 语句时,finally 语句块将在方法返回之前被执行。

示例代码如下:

public static void main(String[] args) {
    try {
        System.out.println("Try to do something");
        throw new RuntimeException("RuntimeException");
    } catch (Exception e) {
        System.out.println("Catch Exception -> " + e.getMessage());
    } finally {
        System.out.println("Finally");
    }
}

输出结果如下:

Try to do something
Catch Exception -> RuntimeException
Finally

注意:不要在 finally 语句块中使用 return!当 try 语句和 finally 语句中都有 return 语句时,try 语句块中的 return 语句会被忽略。这是因为 try 语句中的 return 返回值会先被暂存在一个本地变量中,当执行到 finally 语句中的 return 之后,这个本地变量的值就变为了 finally 语句中的 return 返回值。

6.finally 块中的代码一定会执行吗?

(1)finally 块中的代码不一定会执行!例如在执行到 finally 块之前 JVM 就被终止运行的话,finally 中的代码就不会被执行。

public static void main(String[] args) {
    try {
        System.out.println("Try to do something");
        throw new RuntimeException("RuntimeException");
    } catch (Exception e) {
        System.out.println("Catch Exception -> " + e.getMessage());
        // 终止当前正在运行的 JVM
        System.exit(1);
    } finally {
        System.out.println("Finally");
    }
}

输出结果如下:

Try to do something
Catch Exception -> RuntimeException

(2)另外,在以下 2 种特殊情况下,finally 块的代码也不会被执行:程序所在的线程死亡、关闭 CPU。

7.异常使用有哪些需要注意的地方?

(1)不要把异常定义为静态变量,因为这样会导致异常栈信息错乱。
(2)每次手动抛出异常,我们都需要手动 new 一个异常对象抛出。抛出的异常信息一定要有意义。
(3)建议抛出更加具体的异常,例如出现字符串转换为数字格式错误的时候,就应该抛出 NumberFormatException 而不是其父类IllegalArgumentException。
(4)使用日志打印异常之后就不要再抛出异常了(两者不要同时存在一段代码逻辑中)。

8.什么时候用 assert?如何使用 assert?

(1)assertion(断言)在软件开发中是一种常用的调试方式,很多开发语言中都支持这种机制。一般来说,assertion 用于保证程序最基本、关键的正确性。assertion 检查通常在开发和测试时开启
(2)为了提高性能,在软件发布后, assertion 检查通常是关闭的。在实现中,断言是一个包含布尔表达式的语句,在执行这个语句时假定该表达式为 true;如果表达式计算为 false,那么系统会报告一个 AssertionError。
(3)断言用于调试目的:

assert(a > 0); // throws an AssertionError if a <= 0

(4)断言有以下两种形式:

assert Expr1; 
assert Expr1 : Expr2;

Expr1 应该总是产生一个布尔值。 Expr2 可以是得出一个值的任意表达式;这个值用于生成显示更多调试信息的字符串消息。这两种表达形式本质是一样的,不同在于第二种方式中,可以指定输出错误的信息。

(5)断言在默认情况下是禁用的。
① 要在编译时启用断言,需使用 source 1.4 标记:

javac -source 1.4 Test.java

② 要在运行时启用断言,可使用 -ea 或者 -enableassertions 标记。
③ 要在运行时选择禁用断言,可使用 -da 或者 -disableassertions 标记。
④ 要在系统类中启用断言,可使用 -esa 或者 -dsa 标记。还可以在包的基础上启用或者禁用断言。

(6)可以在预计正常情况下不会到达的任何位置上放置断言。断言可以用于验证传递给私有方法的参数。不过,断言不应该用于验证传递给公有方法 的参数,因为不管是否启用了断言,公有方法都必须检查其参数。不过,既可以 在公有方法中,也可以在非公有方法中利用断言测试后置条件。另外,断言不应该以任何方式改变程序的状态。

9.什么是内存泄漏和内存溢出?

(1)内存泄漏 (Memory Leak):指程序中已动态分配的堆内存由于某种原因程序未释放或无法释放,造成系统内存的浪费,导致程序运行速度减慢甚至系统崩溃等严重后果。

(2)内存溢出 (Out Of Memory,简称 OOM):指应用系统中存在无法回收的内存或使用的内存过多,最终使得程序运行要用到的内存大于能提供的最大内存。常见的解决方案有:
① 修改JVM启动参数,直接增加内存。
② 检查错误日志,查看 “Out Of Memory” 错误前是否有其它异常或错误。
③ 对代码进行走查和分析,找出可能发生内存溢出的位置。
④ 使用内存查看工具动态查看内存使用情况。

(3)内存泄漏最终会导致内存溢出。

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

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

相关文章

4.3 PBR

1. 实验目的 熟悉PBR的应用场景掌握PBR的配置方法2. 实验拓扑 PBR实验拓扑如图4-8所示: 图4-8:PBR 3. 实验步骤 (1) IP地址的配置 R1的配置 <Huawei>system-view

缓存Redis常见面试题

一、Redis概念Redis是⼀个⾼性能的key-value数据库&#xff0c;它是完全开源免费的&#xff0c;⽽且redis是⼀个NOSQL类型数据库&#xff0c;是为了解决⾼并发、⾼扩展&#xff0c;⼤数据存储等⼀系列的问题⽽产⽣的数据库解决⽅案&#xff0c;是⼀个⾮关系型的数据库。二、Red…

【Git】git常用命令总结

简言 git是一个开源的分布式版本控制系统&#xff0c;可以有效、高速地处理从很小到非常大的项目版本管理。 里面有很多常用的命令语法&#xff0c;在此做一个常用命令总结记录&#xff0c;以备不时之需。 命令总结 由于git是基于linux开发的工具&#xff0c;所以有个特点&a…

网安新基建!国内首个“网络安全卓越中心”落地南京江宁

​​近日&#xff0c;国内首个网络安全卓越中心&#xff08;“CyberPeace Center of Excellence”简称“CPCOE”&#xff09;落地南京市江宁区&#xff0c;项目金额数千万元&#xff0c;由赛宁网安建设运营。CPCOE旨在提高全民数字素养、培育网安人才、提升关基防御能力、促进安…

阿里P6细谈Python简易接口自动化测试框架设计与实现,我直呼内行

1、开发环境 操作系统&#xff1a;Ubuntu18 开发工具&#xff1a;IDEAPyCharm插件 Python版本&#xff1a;3.6 2、用到的模块 requests&#xff1a;用于发送请求 xlrd&#xff1a;操作Excel&#xff0c;组织测试用例 smtplib&#xff0c;email&#xff1a;发送测试报告 l…

2023年美国大学生数学建模A题:受干旱影响的植物群落建模详解+模型代码(一)

目录 前言 一、题目理解 背景 解析&#xff1a; 要求 二、建模 1.相关性分析 2.相关特征权重 只希望各位以后遇到建模比赛可以艾特认识一下我&#xff0c;我可以提供免费的思路和部分源码&#xff0c;以后的数模比赛只要我还有时间肯定会第一时间写出免费开源思路&…

计量地理学(Quantitative Geography)的学习笔记

目录 1.什么是主成分分析 2.什么是Thile指数&#xff08;锡尔系数&#xff09;&#xff0c;是用来干什么的 3.罗伦次&#xff08;洛伦兹&#xff09;曲线的含义&#xff0c;表征什么样的现象 4.什么是偏相关分析&#xff0c;偏相关分析系数的含义&#xff0c;主要作用 5.多…

Homekit智能家居-智能插座

WiFi智能插座对于新手接触智能家居产品更加友好&#xff0c;不需要额外购买网关设备 很多智能小配件也给我们得生活带来极大的便捷&#xff0c;智能插座就是其中之一&#xff0c;比如外出忘记关空调&#xff0c;可以拿起手机远程关闭。 简单说就是&#xff1a;插座可以连接wi…

2023版最新最强大数据面试宝典

此套面试题来自于各大厂的真实面试题及常问的知识点&#xff0c;如果能理解吃透这些问题&#xff0c;你的大数据能力将会大大提升&#xff0c;进入大厂指日可待&#xff01;目前已经更新到第4版&#xff0c;广受好评&#xff01;复习大数据面试题&#xff0c;看这一套就够了&am…

m0n0防火墙的安装(11)

实验目的 1、了解m0n0的安装过程 2、培养学生动手能力预备知识 1、VirtualBox的使用&#xff0c;及基础英文阅读能力实验环境 本实验的实验环境为&#xff0c;在实验机上安装VirtualBox虚拟机软件&#xff0c;并用VirtualBox创建了一台虚拟机来安装m0n0&#xff0c;并设置了相关…

47.在ROS中实现global planner(3)

接着之前45.在ROS中实现global planner&#xff08;1&#xff09;和46.在ROS中实现global planner&#xff08;2&#xff09;的铺垫&#xff0c;在ROS中实现AStar Global Planner 1. planner package 照着之前的模板&#xff0c;修改下名称 git clone -b https://gitee.com/…

OpenCV 图像金字塔算子

本文是OpenCV图像视觉入门之路的第14篇文章&#xff0c;本文详细的介绍了图像金字塔算子的各种操作&#xff0c;例如&#xff1a;高斯金字塔算子 、拉普拉斯金字塔算子等操作。 高斯金字塔中的较高级别&#xff08;低分辨率&#xff09;是通过先用高斯核对图像进行卷积再删除偶…

大疆车载更新产品矩阵,覆盖从主动安全到城区领航的全场景

新年智驾供应商的攻势&#xff0c;也像车企一样猛烈。大疆车载近期趁着官网更新&#xff0c;对外公布了梳理后的智驾方案序列&#xff0c;覆盖8大功能产品&#xff1a;主动安全、行车辅助、泊车辅助、记忆泊车、记忆行车、跨层记忆泊车、领航高速、领航城区。需要关注的是&…

金融帝国实验室(Capitalism Lab)《官方中文社群抽奖规则》(修订)

★修 订 说 明★ 为进一步完善社群决策制定程序&#xff0c;提高抽奖活动公平化、丰富化水平&#xff0c;切实提升抽奖活动质量&#xff0c;现对《官方中文社群抽奖规则》进行修订&#xff08;第四次&#xff09;。 ————————————— ◎〖本次修订内容〗&#xf…

C++ 浅谈之 AVL 树和红黑树

C 浅谈之 AVL 树和红黑树 HELLO&#xff0c;各位博友好&#xff0c;我是阿呆 &#x1f648;&#x1f648;&#x1f648; 这里是 C 浅谈系列&#xff0c;收录在专栏 C 语言中 &#x1f61c;&#x1f61c;&#x1f61c; 本系列阿呆将记录一些 C 语言重要的语法特性 &#x1f3…

可靠、安全、稳定,开源高质量项目 | 亚马逊的开源文化

亚马逊的领导力准则是亚马逊文化的核心&#xff0c;它如同亚马逊的 DNA 融入贯穿每一个重要决策&#xff0c;深深影响着每一位亚麻人、影响着每一位亚马逊的客户、合作伙伴以及每一位亚马逊云科技的构建者。同时&#xff0c;亚马逊的领导力准则对亚马逊与开源的互动方式也产生着…

(原创)不小心禁用或者卸载Kotlin插件的解决方法

问题 之前因为kotlin版本的一些问题&#xff0c;不小心禁用了kotlin插件 等到再重启Android Studio&#xff0c;就发现进不去了 后来在网上找到方法解决了&#xff0c;但是某一天 又脑子一热&#xff0c;直接把Kotlin插件给卸载了&#xff0c;这下直接玩大发了 花了一点时间才…

Springboot 使用quartz 定时任务 增删改查

前段时间公司项目用到了 定时任务 所以写了一篇定时任务的文章 &#xff0c;浏览量还不错 &#xff0c; Springboot 整合定时任务 ) 所以就准备写第二篇&#xff0c; 如果你是一名Java工程师&#xff0c;你也可以会看到如下的页面 &#xff0c;去添加定时任务 定时任务展示 :…

linux学习笔记 超详细 0基础(下)shell

shell是一个命令解释器&#xff0c;为我们提供了交互式的文本控制台界面&#xff0c;我们可以通过终端控制台来输入命令&#xff0c;由shell解释并交给linux内核执行。Shell是一个解释器&#xff0c;Unix下的Bourne Shell命令解释器的加强版Bourne Again Shell &#xff0c;bas…

甘特图:项目管理工具,轻松简化工作流程

项目规模越大&#xff0c;管理就越复杂&#xff0c;有时候甚至一个项目经理需要管理多个项目&#xff0c;当多个项目、多条任务同时进行&#xff0c;项目所涉及的范围广&#xff0c;内容越来越复杂&#xff0c;使得项目越难以把控&#xff0c;好的管理工具&#xff0c;可以提升…