第一期

OOP实验猪脚说——第一期 #

前言 #

因为同学们的共性问题非常多,所以各位助教(猪脚)总结并写了下来方便各位查阅,不定期更新,希望能帮到大家。

迭代实验 #

前置步骤 #

Windows用户 #

  1. 下载群内提供的patpat示例教程.zip并解压,使用方式在其中的README.md中有详细说明。为了防止大家懒得看,也可以看接下来的步骤;

  2. patpat-windows-amd64.exe需要重新命名为patpat.exe

  3. patpat示例教程下打开终端(命令行)运行如下命令:

    ./patpat reg -sid your_sid -pwd your_password
    # 如./patpat reg -sid 18373722 -pwd buaa-se-oop
    
  4. 账号创建后,密码不支持修改。如需修改,请联系助教。

macOS或Linux用户 #

  1. 下载群内提供的patpat示例教程.zip并解压,使用方式在其中的README.md中有详细说明。为了防止大家懒得看,也可以看接下来的步骤;

  2. 下载群内提供的patpat各版本.zip并解压,选择正确的版本移入patpat示例教程文件夹中,替换并删除掉原有的patpat-windows-amd64.exe

  3. 替换后的文件需要重新命名为patpat

  4. patpat示例教程下打开终端(命令行)运行chmod +x patpat,使评测机程序具有可执行权限;

  5. patpat示例教程下打开终端(命令行)运行如下命令:

    ./patpat reg -sid your_sid -pwd your_password
    # 如./patpat reg -sid 18373722 -pwd buaa-se-oop
    
  6. 账号创建后,密码不支持修改。如需修改,请联系助教。

实验具体流程 #

  1. 编写完迭代作业的代码;

  2. 建立一个n-学号-姓名的文件夹在patpat示例教程下,其内建立out文件夹(outn-学号-姓名文件夹的子孙);

  3. 把你idea中的src文件夹直接复制粘入n-学号-姓名中 (srcout的兄弟);

  4. 终端(命令行)中运行

    ./patpat ta -judge 1-学号-姓名 -pwd your_pwd -tag 随意打一些文字,可以用来标注第几次尝试 # 线上测试命令
    

    命令(不是stu命令不是stu命令不是stu命令,自己编写测试文件和stu自测基本上用不到,只是提供了这么个功能,完全没必要用,我上次就没用过);

  5. patpat给出所有测试点AC(重要!!不满足ta命令全AC你的迭代作业不会有分数);

  6. 打包n-学号-姓名文件夹交到云平台对应实验中。

常见错误 #

  1. 编码格式有误,最简单粗暴的方法:删除中文注释或改成英文注释。或者调整文件编码与默认编码格式一致。

    已知 JDK 18 版本主要集中在 9 个增强功能上,其中之一即是将 UTF-8 设置为标准 Java API 的默认字符集。在 JDK 17 及更早版本中,默认字符集要在 Java 虚拟机运行时才能确定,所以取决于不同的操作系统、语言环境等因素,在实现和处理方面存在着一些问题。而从Java 18开始,依赖于默认字符集的 API 会在所有实现、操作系统、语言环境和配置中保持一致。

  2. 项目结构有误,所有Java文件应直接放在src文件夹下,此时应没有任何package语句。

  3. 文件路径有误,在涉及文件读写时注意文件路径,在使用patpat运行时目录是在patpat所在目录,例如访问src文件夹应./1-学号-姓名/src这样去访问,建议在访问或创建文件/文件夹时逐级判断文件夹是否存在,若不存在则创建或抛出异常。

  4. 关于TLE:我们没有特别限制迭代任务的时长,如果有这种情况一定是有BUG的,请自查。不过还有一种特殊情况会导致TLE,那就是你的代码中new了多个Scanner实例,patpat仅支持单一Scanner实例,这点非常重要,请检查。

  5. 关于RE:只要exit code不为0,那一定是发生了异常但是你没有try-catch,导致异常直接被抛出,程序终止运行。这种情况你的程序是一定存在bug的,通用的做法是使用try-catch包裹可能会抛出异常的代码段,并用println打印出异常信息,这样你就可以知道是哪里出了问题了,即使是在patpat评测中,发生了异常你的输出也会被打印在“实际输出行”中,方便debug。大致的检查方向是:NPE、IO异常、数组越界、除0异常、类型转换异常、NumberFormatException(Integer.parseInt)等等。

基础知识 #

关于javacjava命令 #

Java执行class文件是根据CLASSPATH指定的地方来找,而非当前目录。如果希望它查询当前目录,需要在CLASSPATH中加入.;,代表当前目录,分号用于隔开不同查询目录。

可以使用 -cp . 来临时设置CLASSPATH为当前目录,只对本次执行有效。

在使用例如javac -d out ./src/test/*.java进行打包编译后,在运行时需要带上包名,例如:

cd out
java test.Test // 假定Test为主类

String类型了解引用数据类型 #

Java基础之String类型详解_阿星_Alex的博客-CSDN博客_javastring类型

Java的引用与C的指针比较 #

Java中的“引用类型”和C中的“指针”区别_chengwei1128的博客-CSDN博客_c语言指针和java引用区别

类变量的初始化顺序 #

Java语法专题2: 类变量的初始化顺序 - Milton - 博客园 (cnblogs.com)