# Lab 项目启动故障诊断与修复技术报告 项目路径:`D:\VisualStudioProgram\VSCodePrograms\JavaProjects\Lab` 运行环境:Windows + PowerShell 5 + JDK 25.0.2 ## 目标与验收标准 - 诊断并修复导致项目无法编译/运行的全部错误 - 确保在 `Lab` 目录下可以“一次性”完成编译并启动 - 验证既有图形面积计算与打印功能可正常工作,并保留日志证据 ## 过程记录(按时间顺序) ### 1)首次复现:编译失败(类名与文件名不一致) #### 报错原始输出(完整) 执行命令(在 `D:\VisualStudioProgram\VSCodePrograms\JavaProjects` 目录下): ```text javac -encoding UTF-8 Lab\*.java ``` 编译器输出: ```text Lab\Main.java:3: 错误: 类 main 是公共的, 应在名为 main.java 的文件中声明 public class main { ^ 1 个错误 ``` #### 根本原因分析 - `Main.java` 文件内声明的是 `public class main`(类名为小写 `main`)。 - Java 规则:`public` 顶级类名必须与文件名完全一致(区分大小写)。因此 `Main.java` 只能声明 `public class Main`。 #### 修复步骤 - 将 `Main.java` 中的 `public class main` 更正为 `public class Main`。 #### 验证方式与结果 - 重新执行 `javac` 编译,返回码为 `0`(编译通过)。 --- ### 2)启动方式问题:包声明与目录作为“项目根”不匹配(导致直接在 Lab 目录下不便运行) #### 现象说明 源码最初包含 `package Lab;`。当用户将 `Lab` 目录直接作为工作目录(也就是把 `Lab` 当作 classpath 根)时: - `package Lab;` 期望类文件位于 `...\Lab\Lab\` 下(相对 classpath 根多一层 `Lab` 目录)。 - 但实际源码文件就位于 `...\Lab\`,导致“在 Lab 目录直接编译/运行”的体验与包结构冲突。 #### 根本原因分析 - “包名/目录层级/运行时 classpath 根”三者不一致。 - 本项目为单文件夹小练习,更符合“默认包 + 在 Lab 目录直接 javac/java”的使用方式。 #### 修复步骤 - 从以下源码文件中移除 `package Lab;` 声明,使其落在默认包: - `Main.java` - `shape.java` - `Circle.java` - `Rectangle.java` - `Triangle.java` - `ShapeUtil.java` - 调整 `Main.java` 以调用现有功能(创建图形并打印面积),用于功能验证。 #### 验证方式与结果 在 `D:\VisualStudioProgram\VSCodePrograms\JavaProjects\Lab` 目录下执行: ```text javac -encoding UTF-8 *.java java Main ``` 程序成功启动并输出面积信息(见“最终成功证据”)。 --- ### 3)验证阶段二次报错:PowerShell 5 不支持 `&&` 作为语句分隔符 #### 报错原始输出(完整) 执行命令(在 `Lab` 目录下): ```text javac -encoding UTF-8 *.java && java Main ``` PowerShell 输出: ```text 所在位置 行:1 字符: 30 + javac -encoding UTF-8 *.java && java Main ; exit $LASTEXITCODE + ~~ 标记“&&”不是此版本中的有效语句分隔符。 + CategoryInfo : ParserError: (:) [], ParentContainsErrorRecordException + FullyQualifiedErrorId : InvalidEndOfLine ``` #### 根本原因分析 - Windows PowerShell 5 不支持 `&&` 作为命令连接符(该特性在 PowerShell 7 才提供)。 #### 修复步骤 - 将“编译成功才运行”的命令改为 PowerShell 5 兼容写法: ```text javac -encoding UTF-8 *.java; if ($LASTEXITCODE -eq 0) { java Main } ``` #### 验证方式与结果 - 以上命令在 PowerShell 5 下成功执行并得到正确输出(见“最终成功证据”)。 ## 最终成功证据(日志) JDK 版本: ```text javac 25.0.2 ``` 在 `Lab` 目录下编译并启动: ```text javac -encoding UTF-8 *.java; if ($LASTEXITCODE -eq 0) { java Main } The area of the shape is: 12.566370614359172 The area of the shape is: 12.0 The area of the shape is: 25.0 ``` ## 预防同类问题的改进建议 - 规范类/文件命名:任何 `public class X` 必须位于 `X.java` 中,并保持大小写一致。 - 明确“项目根”概念:若使用 `package`,应保证源码目录层级与包名一致;否则采用默认包并在同一目录下编译运行。 - 统一运行脚本:在 Windows 环境建议提供 PowerShell 5 兼容命令,或明确要求 PowerShell 7+ 才能使用 `&&`。