scala foreach 中的 IntelliJ 断点不起作用

IntelliJ breakpoint in scala foreach not working

我正在使用 IntelliJ IDEA Ultimate 16.1.2 和 Scala 12。在 foreach 循环中设置断点时,它们不会被命中。

foreach 上方的断点工作并在断点(有效断点)中获取刻度线,但 foreach 中的断点不获取刻度线并且程序也不会在那里中断。

我尝试使 IntelliJ Cash 失效,重新启动我的 PC 和 IntelliJ,重建 maven - 没有任何效果。

这是我正在使用的 VM 参数,但我也尝试过没有任何参数,但没有帮助:

-XX:+UnlockCommercialFeatures
-XX:+FlightRecorder
-Dcom.sun.management.jmxremote
-XX:StartFlightRecording=filename=recording.jfr
-server
-Xms1G
-Xmx4G
-XX:+UseG1GC
-XX:+UseStringDeduplication 

感谢您的帮助!

这是我的代码:

class RunTestCasesAction extends AbstractAction {

  def actionPerformed(e: ActionEvent) = {
      val parent = methodToGetParentComponent() //breakpoint works
      getFileName(parent).foreach { testFileName => 
        val dialog = new SomeDialog() // breakpoint doesn't work    
      }
  }

  private def getFileName(parent: Component): Option[String] = {
    val baseDir = getExportDir
    val fc = new JFileChooser(baseDir)
    val rc = fc.showDialog(null, "Select test file")

    if (rc == JFileChooser.APPROVE_OPTION) Some(fc.getSelectedFile.toString) else None
  }

您正在做的是创建新对象并在 foreach 循环内分配它们。 这对项目的其他部分没有影响。

编译器会优化您的代码,这样就永远不会执行此代码块。这个 val dialog = new SomeDialog() 是在 foreach 中创建的,这个对象会立即被销毁,因为它们的作用域只在 foreach 循环中,所以没有必要这样做。

如果你想进入循环,把重要的东西放在那里,什么是可重用的。例如。你可以收集这个对象。 确保编译器不会以这种方式优化您的代码。

也许您可以尝试使用一些编译器优化标志,但我不确定。

这是关于 how debuggers work 的信息。