#课后作业1:课件动手动脑及验证内容解答 - 20243867孙堃2405

news/2025/11/3 18:05:41/文章来源:https://www.cnblogs.com/sunkun116/p/19187847

一、AboutException.java示例运行与异常处理基础验证

  1. 代码示例(模拟)
    public class AboutException {
    public static void main(String[] args) {
    // 演示被0除异常
    int i = 1, j = 0, k;
    try {
    k = i / j; // 可能抛出ArithmeticException的代码
    } catch (ArithmeticException e) {
    // 异常处理逻辑
    System.out.println("捕获到被0除异常:" + e.getMessage());
    e.printStackTrace(); // 打印异常堆栈信息
    } finally {
    System.out.println("无论是否发生异常,finally块都会执行");
    }

     // 演示数组越界异常int[] arr = {1, 2, 3};try {System.out.println(arr[5]); // 数组下标越界,抛出ArrayIndexOutOfBoundsException} catch (ArrayIndexOutOfBoundsException e) {System.out.println("捕获到数组越界异常:" + e.getMessage());}
    

    }
    }

  2. 运行结果
    捕获到被0除异常:/ by zero
    java.lang.ArithmeticException: / by zero
    at AboutException.main(AboutException.java:6)
    无论是否发生异常,finally块都会执行
    捕获到数组越界异常:Index 5 out of bounds for length 3

  3. 验证结论

  • try块包裹可能发生异常的代码,当异常发生时,程序跳转到对应catch块执行处理逻辑;
  • printStackTrace()方法可打印异常传播路径(方法调用堆栈),getMessage()方法可获取异常的具体描述信息;
  • finally块无论是否发生异常,都会被执行,常用于资源释放等“善后”操作。

二、assert语句与AssertionError验证

  1. 代码示例
    import java.util.Arrays;
    import java.util.List;

public class TestAssert {
public static void main(String[] args) {
List ints = Arrays.asList(1, 2, 3);
int s = 0;
for (int n : ints) {
s += n;
}
assert s == 7; // 实际s=6,断言失败将抛出AssertionError
}
}

  1. 运行步骤与结果
  • 步骤1:默认关闭assert功能运行(直接用java TestAssert命令),程序无任何输出,断言未生效;
  • 步骤2:启用assert功能运行(命令:java -ea TestAssert),运行结果如下:
    Exception in thread "main" java.lang.AssertionError
    at TestAssert.main(TestAssert.java:10)
  1. 验证结论
  • AssertionError属于Error类的子类,是系统级错误,默认情况下JVM关闭assert功能;
  • 需通过JVM参数“-ea”(enable assertions)启用assert功能,断言条件不满足时才会抛出AssertionError。

三、整数与浮点数除以零差异验证(基于javap反汇编)

  1. 测试代码
    // 整数除以零(抛出异常)
    public class IntDivideByZero {
    public static void main(String[] args) {
    int i = 1, j = 0, k;
    k = i / j;
    }
    }

// 浮点数除以零(不抛出异常)
public class DoubleDivideByZero {
public static void main(String[] args) {
double d1 = 100, d2 = 0, result;
result = d1 / d2;
System.out.println("浮点数除以零:" + result);
}
}

  1. javap反汇编步骤与结果
  • 步骤1:编译代码(javac IntDivideByZero.java DoubleDivideByZero.java);
  • 步骤2:反汇编查看字节码(javap -c IntDivideByZero 与 javap -c DoubleDivideByZero);
  • 关键字节码差异:
    • IntDivideByZero的main方法中,整数除法对应“idiv”字节码指令;
    • DoubleDivideByZero的main方法中,浮点数除法对应“ddiv”字节码指令。
  1. 验证结论
  • JVM对“idiv”和“ddiv”指令采用不同处理策略:整数除以零违反数学逻辑,JVM抛出ArithmeticException;浮点数除以零在IEEE 754标准中定义为“Infinity”(无穷大),因此不抛出异常,直接返回该结果。

四、多层异常捕获验证(CatchWho.java与CatchWho2.java)

(一)CatchWho.java运行验证

  1. 代码示例(修正语法错误:ArrayIndex0utOfBoundsException应为ArrayIndexOutOfBoundsException)
    public class CatchWho {
    public static void main(String[] args) {
    try {
    try {
    throw new ArrayIndexOutOfBoundsException();
    } catch (ArrayIndexOutOfBoundsException e) {
    System.out.println("ArrayIndexOutOfBoundsException/内层try-catch");
    }
    throw new ArithmeticException();
    } catch (ArithmeticException e) {
    System.out.println("发生ArithmeticException");
    } catch (ArrayIndexOutOfBoundsException e) {
    System.out.println("ArrayIndexOutOfBoundsException/外层try-catch");
    }
    }
    }

  2. 运行结果
    ArrayIndexOutOfBoundsException/内层try-catch
    发生ArithmeticException

  3. 验证结论

  • 内层try块抛出的ArrayIndexOutOfBoundsException被内层catch块捕获并处理;
  • 内层异常处理完成后,外层try块继续执行“throw new ArithmeticException()”,该异常被外层对应catch块捕获。

(二)CatchWho2.java运行验证

  1. 代码示例(修正语法错误)
    public class CatchWho2 {
    public static void main(String[] args) {
    try {
    try {
    throw new ArrayIndexOutOfBoundsException();
    } catch (ArithmeticException e) { // 内层catch块类型与抛出异常不匹配
    System.out.println("ArrayIndexOutOfBoundsException/内层try-catch");
    }
    throw new ArithmeticException();
    } catch (ArithmeticException e) {
    System.out.println("发生ArithmeticException");
    } catch (ArrayIndexOutOfBoundsException e) {
    System.out.println("ArrayIndexOutOfBoundsException/外层try-catch");
    }
    }
    }

  2. 运行结果
    ArrayIndexOutOfBoundsException/外层try-catch

  3. 验证结论

  • 内层try块抛出ArrayIndexOutOfBoundsException,但内层catch块声明捕获ArithmeticException,异常无法被内层处理,向外层传播;
  • 外层catch块中,ArrayIndexOutOfBoundsException对应的catch块在前(注:原代码中外层catch顺序为ArithmeticException在前,此处需注意:若外层先捕获ArithmeticException,ArrayIndexOutOfBoundsException仍会被后续catch块捕获),最终被外层对应catch块处理;
  • 内层未执行“throw new ArithmeticException()”,因此该异常未抛出。

五、finally执行时机与System.exit()影响验证(EmbedFinally.java与SystemExitAndFinally.java)

(一)EmbedFinally.java(多层嵌套finally)

  1. 代码示例
    public class EmbedFinally {
    public static void main(String[] args) {
    try { // 外层try
    System.out.println("进入外层try块");
    try { // 内层try
    System.out.println("进入内层try块");
    throw new ArithmeticException("内层异常"); // 抛出异常
    } catch (ArithmeticException e) {
    System.out.println("内层catch:" + e.getMessage());
    } finally {
    System.out.println("内层finally块执行");
    }
    } catch (Exception e) {
    System.out.println("外层catch块执行");
    } finally {
    System.out.println("外层finally块执行");
    }
    }
    }

  2. 运行结果
    进入外层try块
    进入内层try块
    内层catch:内层异常
    内层finally块执行
    外层finally块执行

  3. 验证结论

  • 多层嵌套finally时,执行顺序与嵌套顺序一致:先执行内层finally,再执行外层finally;
  • 无论异常在哪个层级抛出,只要被捕获,所有层级的finally都会执行。

(二)SystemExitAndFinally.java(System.exit()对finally的影响)

  1. 代码示例
    public class SystemExitAndFinally {
    public static void main(String[] args) {
    try {
    System.out.println("进入try块");
    System.exit(0); // 终止JVM运行
    } catch (Exception e) {
    System.out.println("catch块执行");
    } finally {
    System.out.println("finally块执行");
    }
    }
    }

  2. 运行结果
    进入try块

  3. 验证结论

  • finally块并非“绝对”执行:当执行System.exit(0)时,JVM直接终止,后续代码(包括finally块)不再执行;
  • System.exit(int status)用于强制终止JVM,status为0表示正常终止,非0表示异常终止。

六、Java 7 try-with-resources特性验证(自动释放资源)

  1. 代码示例(基于FileInputStream,需处理IOException)
    import java.io.FileInputStream;
    import java.io.IOException;

public class TryWithResourcesDemo {
public static void main(String[] args) {
// try-with-resources语法:括号内创建实现AutoCloseable接口的对象
try (FileInputStream fis = new FileInputStream("test.txt")) {
System.out.println("文件输入流创建成功,可进行读写操作");
// 模拟文件操作(此处省略具体读写逻辑)
} catch (IOException e) {
System.out.println("捕获IO异常:" + e.getMessage());
}
// 无需手动调用fis.close(),JVM自动调用
}
}

  1. 运行结果(分两种情况)
  • 情况1:test.txt文件存在,运行结果:
    文件输入流创建成功,可进行读写操作
  • 情况2:test.txt文件不存在,运行结果:
    捕获IO异常:test.txt (系统找不到指定的文件)
  1. 验证结论
  • try-with-resources语法要求括号内的对象必须实现AutoCloseable接口(FileInputStream实现了该接口);
  • 当程序离开try块(正常执行完成或发生异常)时,JVM会自动调用AutoCloseable接口的close()方法释放资源,无需在finally块中手动调用,避免资源泄露;
  • 若close()方法本身抛出异常,会被catch块捕获(与业务异常一并处理)。

七、受控异常(Checked Exception)验证(TestThrows.java)

  1. 原错误代码与编译报错
    public class TestThrows {
    public static void main(String[] args) {
    FileInputStream fis = new FileInputStream("a.txt"); // 编译报错
    }
    }
  • 编译报错原因:FileInputStream的构造方法声明抛出FileNotFoundException(受控异常),该异常属于直接派生自Exception的Checked Exception,必须显式处理(捕获或声明抛出),否则编译不通过。
  1. 修正代码1(声明抛出异常)
    import java.io.FileInputStream;
    import java.io.FileNotFoundException;

public class TestThrows {
// main方法声明抛出FileNotFoundException,由JVM默认处理(打印异常信息并终止程序)
public static void main(String[] args) throws FileNotFoundException {
FileInputStream fis = new FileInputStream("a.txt");
}
}

  1. 修正代码2(捕获异常)
    import java.io.FileInputStream;
    import java.io.FileNotFoundException;
    import java.io.IOException;

public class TestThrows {
public static void main(String[] args) {
try {
FileInputStream fis = new FileInputStream("a.txt");
} catch (FileNotFoundException e) {
System.out.println("捕获文件未找到异常:" + e.getMessage());
} catch (IOException e) { // FileNotFoundException是IOException的子类,需放在前面捕获
System.out.println("捕获IO异常:" + e.getMessage());
}
}
}

  1. 验证结论
  • 受控异常(Checked Exception)直接派生自Exception,必须显式处理:要么在方法上用throws声明抛出,由调用者处理;要么用try-catch捕获处理;
  • 捕获异常时,子类异常的catch块必须放在父类异常catch块之前(如FileNotFoundException的catch块需在IOException之前),否则编译报错(父类异常会“遮蔽”子类异常,子类异常的catch块无法执行)。

八、子类重写方法抛出受控异常的限制验证(OverrideThrows.java)

  1. 代码示例(父类与子类)
    import java.io.FileNotFoundException;
    import java.io.IOException;

// 父类
class Parent {
// 父类方法声明抛出IOException(受控异常)
public void readFile() throws IOException {
System.out.println("父类读取文件方法");
}
}

// 子类1(合法:抛出父类异常的子类)
class Child1 extends Parent {
@Override
public void readFile() throws FileNotFoundException { // FileNotFoundException是IOException的子类
System.out.println("子类1读取文件方法");
}
}

// 子类2(非法:抛出父类异常的父类,编译报错)
class Child2 extends Parent {
@Override
// 编译报错:子类方法抛出的异常不能是父类方法抛出异常的父类
public void readFile() throws Exception {
System.out.println("子类2读取文件方法");
}
}

  1. 编译结果
  • Child1编译通过:子类重写方法抛出的异常(FileNotFoundException)是父类方法抛出异常(IOException)的子类,符合规则;
  • Child2编译报错:子类重写方法抛出的异常(Exception)是父类方法抛出异常(IOException)的父类,违反“子类抛出受控异常不能超出父类异常范围”的规则。
  1. 验证结论
  • 子类重写父类方法时,若父类方法声明抛出受控异常,子类方法抛出的受控异常必须是父类异常的子类或相同异常,不能是父类异常的父类;
  • 子类方法可选择不抛出任何异常(即使父类方法抛出异常),但不能抛出比父类方法范围更广的受控异常。

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

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

相关文章

智变未来:中国AI HR市场进程盘点与主流玩家深度分析

摘要:随着人工智能技术的飞速发展,全球人力资源管理领域正经历一场深刻的变革。本文将深度剖析AI在企业人力资源领域的发展与落地概况,聚焦中国AIHR市场的独特特征,并对主流玩家进行详细盘点。特别是对在中国AI HR…

PostgreSQL数据库:新手开启从0到1的学习之路

一、先了解一下PostgreSQL 是什么?PostgreSQL是一款遵循 SQL 标准的开源关系型数据库,起源于加州大学伯克利分校的研究项目。支持关系型数据、JSON/JSONB 非结构化数据、地理信息等多种数据类型,能满足从个人项目到…

2025电线电缆生产厂家,电线电缆厂家精选:武汉特航,赋能多行业的技术型品牌揭秘!

在电线电缆行业中,一批规模适中、专注细分领域的小型厂家凭借精准的市场定位、扎实的产品品质和灵活的服务模式,成为行业中值得关注的力量。以下结合产品合规性、技术适配性、市场口碑等维度,精选 武汉本地优质小型…

nfs 自动挂载的一些问题

nfs 自动挂载的一些问题在测试nfs 自动挂载的时候发现的一个问题,平时没太注意,先进行了不少nfs 挂载参数的调整尝试,依然不行,后边发现是可以开启 systemd-networkd-wait-online 或者NetworkManager-wait-online.…

2025年浙江轻奶茶加盟渠道权威推荐榜单:奶茶加盟/茶饮加盟/奶茶店加盟渠道精选

浙江省作为中国茶饮行业的重要市场,在2024年茶饮加盟市场规模突破85亿元,同比增长22%,其中新中式茶饮占据市场份额的38%,成为创业投资的热门领域。 在这场茶饮行业升级的浪潮中,浙江本土孕育了多个具有全国影响力…

2025优质小型环保腻子粉,植物腻子粉,净醛腻子粉,健康腻子粉,无味腻子粉,腻子粉厂家推荐,实用选型参考

在装修建材市场中,腻子粉作为墙面处理的核心材料,其品质直接影响装修效果与居住体验。面对市面上众多品牌,小型厂家凭借灵活的生产模式、针对性的产品设计和贴心的服务,成为不少装修团队和业主的优选。以下结合产品…

2025年河南心理健康咨询机构权威推荐:河南婚姻心理咨询/河南家庭心理咨询/河南心理咨询机构服务中心精选

据河南省心理健康服务中心统计数据显示,2024年全省心理咨询服务需求量同比增长27.5%,其中青少年心理问题、婚姻家庭关系及情绪管理咨询位列前三位,占总咨询量的68.3%。 随着社会对心理健康的重视程度不断提高,河南…

面试:安全框架与安全管理-网络-防火墙与IPS - 徐正柱

面试:安全框架与安全管理-网络-防火墙与IPSPosted on 2025-11-03 17:58 徐正柱- 阅读(0) 评论(0) 收藏 举报安全产品类型代表产品(非云版本)技术特性‌WAF‌绿盟WAF、安恒明御WAF、天融信WAF、F5 BIG-IP、深信…

2025年汽车机油,润滑油厂家推荐榜:聚焦能源高端化发展潜力!

随着润滑油行业向 “高性能、环保化、智能化” 转型,市场对合规优质产品的需求持续攀升,一批专注细分领域的小规模润滑油厂家凭借精准定位与扎实品质,逐渐在区域市场崭露头角。以下推荐规模适中、特色鲜明的企业,为…

2025小众嵌入式一体机,悬臂式一体机,ARM一体机,一体机厂家推荐榜:朗宇智能,聚焦细分场景的实力之选

在一体机市场中,除了大型企业占据的主流赛道,一批规模适中、专注细分领域的厂家凭借精准的场景适配、扎实的产品品质和灵活的服务模式,逐渐成为不同行业用户的优选。以下结合产品性能、场景应用反馈及用户口碑,综合…

2025西南地区小型花卉大棚,单栋大棚,玻璃温室大棚,温室大棚厂家实用推荐:青程农业,适配中小种植户需求

在设施农业快速发展的当下,温室大棚的适配性、耐用性直接关系到种植户的生产效率与收益。对于中小种植户、家庭农场及初创农业项目而言,选择规模适中、性价比高且服务贴心的厂家尤为重要。以下结合地域适配性、产品实…

2025 年 11 月 DALI 调光系统厂家推荐排行榜,调光网关/调光开关/调光电源/调光驱动/调光传感器/调光模块/调光控制系统公司推荐

2025 年 11 月 DALI 调光系统厂家推荐排行榜,调光网关/调光开关/调光电源/调光驱动/调光传感器/调光模块/调光控制系统公司推荐 随着智能照明技术的快速发展,数字可寻址灯光接口(DALI)协议已成为现代建筑照明控制的…

2025 年热电偶厂家最新推荐排行榜:聚焦 K 型 / T 型 / 铠装丝 / 高温热电偶优质品牌

引言 当前工业制造、医疗电子、智能设备等领域对温度测量的精准性、稳定性需求日益严苛,热电偶作为核心传感元件,市场需求持续增长。但市场上制造商数量繁杂,部分品牌技术积累不足、品控体系松散,导致产品在极端环…

2025年今日黄金回收价格机构权威推荐榜单:黄金上门回收/回收黄金机构/现在黄金回收价格源头机构精选

随着国际金价持续波动,黄金回收市场迎来新一轮活跃期,专业、规范的回收服务成为消费者关注的焦点。 据中国黄金协会数据显示,2024年国内黄金回收量同比增长18.7%,市场规模突破1200亿元。与此同时,消费者对回收服务…

2025年汽车音响生产厂家权威推荐榜单:车载音响/汽车音响喇叭/汽车音响功放源头厂家精选

随着汽车智能化与消费升级的双重驱动,车载音响系统已从基础功能组件升级为提升驾乘体验的核心配置。据行业数据显示,2025年中国汽车音响市场规模增速预计保持在12%以上,其中高端音响与个性化改装需求占比显著提升。…

问问

问问import pandas as pd import numpy as np import re from typing import Tupledef curve_score(value: float, spec_range: Tuple[float, float], weight: float,min_score: float = 0.0,base_curvature: float = …

2025年北京合同纠纷律师事务所权威推荐榜:专业律师团队与高效解决方案口碑之选

2025年北京合同纠纷律师事务所权威推荐榜:专业律师团队与高效解决方案口碑之选 在当今复杂多变的商业环境中,合同纠纷已成为企业运营中最常见的法律风险之一。根据行业数据显示,合同类案件在商事纠纷中的占比持续攀…

SQL - JOIN 中关联条件和过滤条件的执行顺序

SQL - JOIN 中关联条件和过滤条件的执行顺序 SELECT a.id, a.class, b.type FROM table1 AS a LEFT JOIN table2 AS bON a.id = b.idAND a.class = AAND b.type = B;以上SQL语句在执行时是先用id关联生成数据集再用条件…

解析国标GB28181算法算力平台EasyGBS视频分发与按需直播关键技术,实现海量视频的高效触达

解析国标GB28181算法算力平台EasyGBS视频分发与按需直播关键技术,实现海量视频的高效触达在视频监控领域,将前端设备的海量视频流高效、稳定、低延迟地分发给各式各样的终端用户,是平台核心价值的最终体现。基于国标…

KubernetesClient-C

KubernetesC-SDK 告诉编译器:“这些函数是 C 写的,别给它们加花哨的 C++ 名字修饰,用纯 C 风格导出。”extern "C" { #include <kubernetes/config/kube_config.h> #include <kubernetes/api/Co…