在我的服务中遇到了一个问题,即放置在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测试中,都一样。
简而言之,当编译它时,由于某种原因它会被读为空语句,而只是跳到可执行代码的下一行。
答案 0 :(得分:0)
好吧,尝试一下:
scala> def createSample(){
| for (x <- 0 until 3) {
| println(x)
| }
| }
createSample: ()Unit
scala> createSample()
0
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
语句上设置断点,调试器应在此处停止。