【问题标题】:IntelliJ breakpoint in scala foreach not workingscala foreach中的IntelliJ断点不起作用
【发布时间】:2017-03-21 17:58:57
【问题描述】:

我正在使用 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
  • 你能举个例子吗?我在 Scala 2.12.1 的 main 方法中尝试了一个带有 for 循环的简单应用程序,它工作正常。
  • 通过“将它们设置在 foreach 循环中”,您是指在 for { a<-b } 部分内,还是在 yield {...} 部分内?
  • @Rumid 是的,代码已执行但我无法中断
  • @JustinKaeser 我像这样在 aOption[String] 上执行 foreach val foo:Option[String] = Some("bar") foo.foreach { s => ... }

标签: scala debugging intellij-idea foreach breakpoints


【解决方案1】:

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

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

如果您想进入循环内部,请将重要的、可重用的内容放在那里。例如。你可以收集这些对象。 确保编译器不会以这种方式优化您的代码。

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

这里是how debuggers work的信息。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-07-09
    • 2014-06-07
    • 1970-01-01
    • 1970-01-01
    • 2013-01-18
    • 2016-05-27
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多