Skip to main content

FAQ - Project 2A

课程组会持续更新此页面,解答大家关于项目的问题!如果你的问题在这里找不到答案,可以在实验课、答疑时间 (OH) 或者 Ed 上提问!

在循环中调用 .years()

这可能会导致问题,尽量避免在循环中调用 .years()

我收到 SLF4J: No SLF4J providers were found. 错误,我该怎么办?

收到此错误没关系。你的代码还是能跑的。如果想消除这个错误,可以试试拉取 library-fa23 然后重新导入库。

设置

我在导入时遇到错误,例如 Cannot resolve symbol 'spark',但已经在 IntelliJ 中选择了 library-fa23 文件。

按照说明:你还需要进入 library-fa23 文件夹,运行 git pull,确保你拥有项目需要的所有库文件。添加库的时候,选择 library-fa23 文件夹里的 所有 库 (或者直接导入整个文件夹也行)。

导入的时候,可能需要一个个地选择 .jar 文件 (别直接选整个文件夹)。

运行 main 的时候,出现一堆红字,是不是出错了?

应该没事儿 -- 只要输出显示服务器启动成功,就说明一切正常。

入门

如何测试服务器组件?

最好的办法是稍微改动一下代码,启动服务器,然后看看在网页上点按钮会发生什么。如果生成字符串的时候遇到问题,可以试试在你的 “handle” 方法里打印出来看看。

如果在 plus 和 divide 中缺少一年,我应该如何处理?

对于 plus,直接用第一年的数据就好 (相当于加 0)。 对于 divide,直接忽略那一年 (输出里不要包含它)。

我的 NGramMap 里面的方法都写得太长了,debug 起来很困难,怎么办?

根据实验要求,这个类的大部分工作应该在构造函数里完成。这意味着你的主要任务是在构造函数里解析数据文件,把它们整理成易于后续操作的形式,这样就能更轻松地实现其他方法。这个类应该会让你想起hw2的PercolationStats。构造函数做了很多工作,相比之下,这些方法相对简单。

另外,别忘了善用抽象。还记得你为TimeSeries写的plusdivide方法吗?也许它们在这里能派上用场。如果你发现自己在遍历TimeSeries里的数据,不妨想想有没有更简单的办法。

常见异常

为什么在将字符串解析为整数时会收到NumberFormatException

由于其底层的位表示,整数在Java中只能这么大/小(你将在61C中了解更多关于这方面的内容!)如果你的字符串表示的数字超出了有效的整数范围,则会抛出NumberFormatException。如果你预计存储大量数字,最好使用Double代替,它可以存储更广泛的值。

手动运行AG测试,结果和AG给出的不一样/不符合预期,这是怎么回事?

这可能与边缘情况有关。数据集可能不匹配,因此AG的期望和本地结果可能不匹配。

为什么我得到randomizedTest超时错误,而一切看起来都正确?

检查你的plusdivideBy方法。看看你是不是有嵌套循环。不一定非得写两个for语句才算嵌套循环。想想你是怎么拿到years的(用的哪个方法),再看看你是不是在获取years的方法之上又调用了其他方法来get特定年份。

其他一些可能的错误和提醒:

  • 记住,handler方法本身不复杂,主要逻辑都在NGramMap里。
  • 还有,记得在NGramMap里调用正确的方法。
  • 如果handler方法有问题,先检查一下格式!
  • 超时也可能与多次调用weightHistory有关,这是一个昂贵的操作。你可以利用weightHistory(word, startYear, endYear)

Gradescope 提示 '提交在 [TEST NAME] 测试中失败,可能由于内存超限'。

这可能是 Gradescope 后台故障导致的。如果遇到此问题,请在 Ed 上发帖。

本地测试失败,但 Gradescope 上却通过

这可能与你读取文件时 while 循环的实现方式有关。建议使用 isEmpty() 替代 hasNextLine() 进行判断。