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 的信息。
我正在使用 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 的信息。