Scala Basic for循环被跳过并且不进入执行循环

时间:2018-08-03 04:45:58

标签: java scala for-loop syntax compilation

在我的服务中遇到了一个问题,即放置在Scala类中的所有for循环都被跳过,并且没有进入执行循环:

def createSample(){
  for (x <- 0 until 3) {
    println(x)
  }
}

另一个例子:

class messageTest extends FunSpec with GivenWhenThen with Matchers {

  def validatemessage(message: message, checkMessageRef: Boolean = true) = {
    assert(message.getMessageId == UserId.fromString("545n”))

    if (checkMessageRef) {
      assert(message.getMessageReferenceText == “refersnce”)
     }
  }

  val messageV5 = createmessageV5
  val testmessage = createtestMessageContextV5

  describe("message") {
    it("throws an error if message is not populated") {
      assert(
        intercept[InvalidFieldException] {
          new message(null, testmessage, "Search")
        }.getMessage == "Message Context cannot be null")
    }
    it("throws an error if MessagetestContext is not populated") {
      assert(
        intercept[InvalidFieldException] {
          new message(messageV5, null, “Fetch”)
        }.getMessage == "test Message Context cannot be null")
    }

    it("should initiate the context with testmessage when populated") {
      When("the constructor is called with valid data")
      messageV5.setUserId(“123454")
      val message = new message(messageV5, testmessage, "Search")

      Then("message is correctly populated")
      validatemessage(message, false)

    }

    it("should initiate debugTrace to accordingly to the input provided in the message") {
      val messageV5 = createmessageV5
      messageV5.setUserGUID("123454")
      When("the with a 'null' DebugTrace object")
      messageV5.setDebugTrace(null)
      Then("message debug trace is false")
      assert(!new message(messageV5, testmessage, "Search").getDebugTrace)
      When("the with a 'false' DebugTrace object")
      messageV5.setDebugTrace(false)
      Then("message debug trace is false")
      assert(!new message(messageV5, testmessage, "Search").getDebugTrace)
      When("the with a 'true' DebugTrace object")
      messageV5.setDebugTrace(true)
      Then("message debug trace is false")
      assert(new message(messageV5, testmessage, "Search").getDebugTrace)
    }

  }

  def createmessageV5: messageType = {
    val messageV5 = new messageType

    ***for (x <- 0 until 3) {
     println(x)
    }***

    messageV5.setMessageId(“545n”)

    messageV5.setMessageReference(“reference”)

    messageV5
  }
}

以上只是测试的一部分,但是可以按预期工作,但是当我将这个for循环添加到类中时,它只会被跳过,无论我将其放入什么scala测试中,都一样。

简而言之,当编译它时,由于某种原因它会被读为空语句,而只是跳到可执行代码的下一行。

2 个答案:

答案 0 :(得分:0)

好吧,尝试一下:

scala> def createSample(){
     |   for (x <- 0 until 3) {
     |     println(x)
     |   }
     | }
createSample: ()Unit

scala> createSample()
0
1
2

您的代码没有问题。因此,问题在于该方法未得到调用,因为:

  1. 您没有打电话!
  2. 存在exception或某种错误,例如:

    scala> def createError(){
     |   throw new Exception("Ack Ack")
     | }
    createError: ()Unit
    
    scala> def pipe(){
     | createError()
     | createSample()
     | }
    pipe: Unit
    
    scala> pipe()
    java.lang.Exception: Ack Ack
    at .createError(<console>:8)
    at .pipe(<console>:10)
    ... 33 elided
    

现在,因为您说它是一项服务,所以我认为您正在调用第三方服务,但未捕获到它的错误,因此您看不到异常;因此该部分代码没有运行。

答案 1 :(得分:0)

目前尚不清楚这是代码问题还是调试器问题,因此这是两种可能的情况:

代码发布

如果createSample在调试器之外运行时未打印任何内容,则是代码问题,在调试器下运行它只会使事情变得混乱。使用println语句来跟踪代码的执行,这可能有助于显示为什么未调用该函数。用最小的失败示例更新您的问题,我们将尝试帮助解决问题。

调试器问题

如果createSample在调试器外部正确打印,则这是一个调试问题。调试器无法“进入循环”,因为代码中的there is no loop只是对foreach对象上的Range的调用。默认情况下,除非您选择Force Step Into,否则IntelliJ只会跳过此呼叫。如果这样做,最终将到达Range.foreach中的实际循环,进而调用包含您的println语句的lambda函数。

如果在println语句上设置断点,调试器应在此处停止。