Blog

一、前言

这学期学习 Java 面向对象程序设计,我一共完成了三次作业。三次作业从最简单的单一货舱装载,到多货舱管理,再到加入旅客、行李、重心计算、载重平衡,难度逐渐上升,代码量、类的数量、逻辑复杂度都在增加。 我本身Java基础不算好,刚开始写代码的时候,语法、类结构、输入输出、甚至变量作用域都经常出错。三次作业下来,我经历了无数次编译报错、运行崩溃、提交测试点全错、调试到深夜、反复修改、不断被打回的过程。这次总结博客,我会从作业整体情况、设计思路、代码实现、复杂度分析、Bug 分析、学习心得几个方面,把三次作业完整复盘一遍。

二、整体情况概述

  • 题目集1基础航班货运配载需求

本次作为整套系列作业的入门基础版本,整体功能设计较为简单,主要目的是让我们熟悉面向对象基础类的创建、成员变量封装、简单业务逻辑编写。本次作业需要设计一套基础航班货运配载模块,能够录入航班编号、航班最大允许装载重量、需要装载的货物总数量,依次录入每一件货物的名称以及对应重量。

  • 题目集2多货舱货运配载迭代需求

在第一版单一货舱货物配载程序的基础之上,第二套作业进行了全方位功能升级与业务细化,将飞机存放货物的空间划分为多个独立货舱,每一个独立货舱都拥有专属的最大装载重量上限,同时每一个货舱内部还划分出行列网格形式的物理存放位置。此外,本次作业新增双重航班重量判定标准,不仅需要判断单个货舱是否超载,还需要综合判断整架航班整体重量是否超标。

  • 题目集3航空器载重平衡配平系统需求

第三套作业是三次作业新增了民航真实配载核心业务功能。本次作业首次加入旅客以及旅客随身行李重量统计功能,精准计算所有旅客整体总重量以及对应力矩。同时区分飞机前货舱与后货舱,为两个货舱设定不同的力臂数值,结合空机固定重量、空机标准力臂最后换算成重心占平均空气动力弦的百分比数值。

三、题目集1:基础航班货运配载

(1)需求回顾

第一次作业最简单,需求是:1.输入航班号、最大载重、货物件数;2.输入每件货物名称、重量;3.按重量从大到小排序;4.输出每件货物、总重量、是否超载。

(2)类设计

一共3个类:

  1. Cargo:只存货物名字、重量,getter方法
  2. LoadManager:管理航班、货物数组、排序、计算重量、判断超载
  3. Main:输入、创建对象、调用方法

(3)类图

屏幕截图 2026-05-17 221832

(4)复杂度分析

四、题目集2:多货舱货运配载

(1)需求回顾

第二次作业升级:1.多个货舱,每个货舱有最大载重、行列;2.货物指定目标货舱;3.按重量降序装载;4.判断单舱超载、航班总超载、业载超载 。

(2)类设计

一共7个类:

  1. Position:行列
  2. Cargo:id、重量、目标舱
  3. CargoCompartment:货舱、装载、当前重量、超载判断
  4. Flight:航班、货舱列表、总重量
  5. LoadDispatcher:排序(手写冒泡)
  6. InputValidator:输入校验
  7. Main:输入、调用

(3)类图

(4)复杂度分析

五、题目集3:航空器载重平衡配平系统

(1)需求回顾

第三次最难,真实航空配载:1.旅客+行李;2.前舱、后舱不同力臂;3.计算总重量、总力矩、重心、%MAC;4.判断重心安全范围(25~38%);5.非法输入拦截;6.货舱容量不足警告。

(2)类设计

一共10个类:

  1. Luggage:行李重量
  2. Passenger:标准体重 75kg+行李
  3. Position:行列
  4. Cargo:id、重量
  5. CargoCompartment:前后舱、装载、当前重量
  6. Flight:航班、旅客列表、货舱列表
  7. LoadDispatcher:按id冒泡排序
  8. WeightBalanceCalculator:力矩、重心、%MAC、安全判断
  9. InputValidator:静态校验、负数、范围
  10. Main:输入、调用

(3)类图

(4)复杂度分析

六、调试过程与踩坑心得

1.题目集1调试

1.1编译语法报错

我最开始编写代码的时候,为了编写方便,直接将CargoLoadSystem、Cargo、Flight三个功能类全部编写在同一个Main.java源文件当中,并且习惯性给每一个类都加上了public访问修饰符,保存代码之后直接进行编译运行,立刻弹出三条明确的语法错误提示:

Main.java:3:error:class CargoLoadSystem is public, should be declared in a file named CargoLoadSystem.java

Main.java:35:error:class Cargo is public, should be declared in a file named Cargo.java

Main.java:49:error:class Flight is public, should be declared in a file named Flight.java

我找到原因:一个Java源代码文件当中,只允许存在唯一一个使用public修饰的类,并且这个public修饰的类名称必须和当前Java文件名称保持完全一致。我立刻修改代码结构,只保留主程序Main类为public类,其余所有自定义实体类全部取消public修饰符,统一放置在同一个源文件当中。

1.2全部测试点非零返回

我再次将代码提交至线上作业平台,提交结果为tc01单件货物测试、tc02无货物测试、tc03超载测试、tc04排序测试、tc05超载测试所有测试点全部显示非零返回,最终得分全部为零。

发现原因:首先是我在处理Scanner控制台输入流程时不够严谨,读取整数和浮点数之后没有及时吸收换行符;其次是我在编写数组存储货物逻辑时,没有做好货物数量边界判断;同时还存在部分变量没有初始化、调用空对象属性等空指针问题。确定问题之后,我在所有数值类型数据读取语句之后统一添加换行吸收语句;同时完善数量判断条件,提前规避数组越界问题。

1.3排序测试点错误

再次提交只剩下tc04排序加超载综合测试点答案错误,其余测试点全部判定答案正确。

发现原因:题目要求货物按照重量从高到低降序排列,但是我在编写选择排序判断条件时出现失误,最终货物输出顺序和题目要求相反。找准逻辑错误之后,我直接修改排序内部的大小比较符号,将从小到大排序调整为从大到小排序。

2.题目集2调试

2.1部分测试点判定错误

case1和case4两个核心测试点持续判定答案错误。

发现原因:第一处是货物排序逻辑存在漏洞,在完成重量降序排序的时候,没有兼顾同等重量货物的录入先后顺序;第二处是在编写货舱查找逻辑时,没有对查找结果进行空值判断;第三处是我在编写输出语句时,没有严格对照样例格式,存在多余空格、小数保留位数不统一等格式问题。我逐一修改问题,优化冒泡排序内部循环逻辑;增加货舱对象空值判断语句;统一全部输出语句。

2.2 所有测试点全部错误

十个测试点全部判定答案错误。

发现问题:首先是CargoCompartment货舱类内部记录当前装载重量的成员变量初始化出现问题,初始数值没有设置为0;其次是我在统计航班整体总货物重量时,循环遍历逻辑编写失误,出现重复累加重量的情况;最后是货舱超载、航班整体超载的判断条件书写颠倒,正常状态和超载状态判定结果相反。我重新重构货舱重量统计代码、航班总重量遍历统计代码,修正所有判断条件以确保每一步数据计算都准确无误。

2.3 完成大部分测试点

大部分基础测试点、边界测试点都能够顺利通过,只剩下少数几个综合场景测试点依旧判定错误,剩余错误问题基本都集中在细节输出层面。

发现原因:首先是货物装载失败的提示语句当中,没有按照题目要求添加“(超载)”固定标注;其次是遍历输出货舱状态信息时,没有严格按照最开始录入货舱的顺序进行输出;还有少量浮点数临界数值判断不够严谨,出现边界状态判定失误。我对标题目给出的输入输出样例修改所有输出文案,调整集合遍历顺序,优化浮点数大小判断逻辑。

3.题目集3调试

3.1语法变量报错

在编写第三套作业主程序收尾阶段,我习惯性在main方法外部编写了scanner关闭语句,编译代码之后直接弹出找不到符号的语法错误:

Main.java:275:error: cannot find symbol

scanner.close();

发现原因:局部变量的作用域仅仅局限在当前方法内部,在方法外部无法直接调用使用,自然会出现找不到变量的报错提示。为解决问题我将语句移动到main方法代码末尾,保证变量调用在有效作用域之内。

3.2 大量核心测试点失败

本次报错问题集中在航空配平核心计算模块,tc1高重心危险测试、tc2前舱容量不足测试、tc3后舱容量不足测试、tc10低重心危险测试等多个核心业务测试点全部判定答案错误。

发现原因:专业计算公式套用失误。第一点是我混淆了前货舱和后货舱对应的标准力臂数值;第二点是在计算重心百分比公式时,遗漏减去MAC前缘基准距离这一核心步骤;第三点是在判断货舱容量是否充足时,没有考虑double浮点类型数据运算存在的精度误差,临界重量数值判断经常出现误判。然后我按照题目给出的五大计算步骤拆分代码,先单独调试旅客重量与力矩计算代码,再单独调试前后货舱货物力矩代码,最后整合空机数据完成整体运算,分步打印每一步运算结果,对照标准数值逐一修正公式错误,慢慢将所有计算逻辑全部修正正确。

3.3剩一处边界测试点错误

仅剩下tc8装载前舱货物数量范围非法这一边界测试点持续判定错误,其余所有测试点全部拿到满分。

七、学习收获与总结

三次作业从不会到会、从乱写到规范、从全错到大部分通过,我收获非常多:1.我纠正了最开始混乱的代码编写习惯,记住了诸多基础语法细节,夯实了Java语言底层基础。2.在整套作业编写过程当中,我反复练习面向对象核心设计思想,熟练掌握了实体类、业务管理类、工具调度类、数据校验类的划分方式。3.我掌握了数组与ArrayList动态集合两种常用存储容器的使用场景与使用区别,且可以独立手写完成选择排序、冒泡排序多种基础排序算法。最重要的是我将书本编程知识和真实行业业务场景结合,不再编写脱离实际测试代码,同时掌握了线上OJ作业平台的提交规则,学会根据测试点反向排查代码漏洞。

但我也有许多不足,第一点是我的代码精简优化能力不足,不会简化冗余代码。第二点是我对于程序异常处理能力比较薄弱。第三点是我对于复杂计算公式代码转化能力较弱,很难一次性精准完成代码转换,必须分步拆分调试才能完成编写。第四点是我对于程序边界场景考虑不够周全,经常忽略临界数值、空数据、极限数量等特殊运行场景。

针对自身现存的诸多不足,我制定了后续学习计划。

第一、继续巩固Java面向对象基础知识点,利用课余时间多练习不同场景下的类结构划分练习题。

第二、加强基础算法练习,继续手写练习各类常用排序、查找算法,提升循环结构代码编写熟练度。

第三、系统学习Java标准异常处理机制,学会使用try-catch捕获运行异常,优化程序运行容错能力。

八、结语

从最开始连基础public类语法规则都频频出错,到如今能够独立完成包含十个左右自定义类的管理系统,我在不断成长。这三套依托民航配载场景设计的迭代作业,不仅夯实了我的Java编程基础,更让我明白软件开发从来都不是简单堆砌代码,而是一项系统性工作。在今后的Java课程学习和自主练习过程当中,我将会继续保持严谨的学习态度,正视自身的短板,从基础知识点抓起,从代码细节做起,不断积累实战编写经验,一步步提升自身程序设计与代码开发水平。

posted @ 2026-05-18 20:08  董志凡  阅读(12)  评论(0)    收藏  举报