Я новичок в scala, и я пишу код scala для реализации протокола печенья. Сам протокол значения не имеет. Есть узлы, и у каждого узла есть таблица маршрутизации, которую я хочу заполнить. Вот часть кода:
def act () {
def getMatchingNode (initialMatch :String) : Int = {
val len = initialMatch.length
for (i <- 0 to noOfNodes-1) {
var flag : Int = 1
for (j <- 0 to len-1) {
if (list(i).key.charAt(j) == initialMatch(j)) {
continue
}
else {
flag = 0
}
}
if (flag == 1) {
return i
}
}
return -1
}
// iterate over rows
for (ii <- 0 to rows - 1) {
for (jj <- 0 to 15) {
var initialMatch = ""
for (k <- 0 to ii-1) {
initialMatch = initialMatch + key.charAt(k)
}
initialMatch += jj
println("initialMatch",initialMatch)
if (getMatchingNode(initialMatch) != -1) {
Routing(0)(jj) = list(getMatchingNode(initialMatch)).key
}
else {
Routing(0)(jj) = "NULL"
}
}
}
}// act
Проблема в том, что когда происходит вызов функции getMatchingNode, актор внезапно умирает сам по себе. «список» — это список всех узлов. (список узловых объектов) Также это поведение непоследовательно. Вызов getMatchingNode должен выполняться 15 раз для каждого актора (для 10 узлов). Но при отладке актор убивает себя в вызове функции getMatchingNode после одного вызова, а иногда и после 3-4 вызовов. Код библиотеки scala, который выполняется, выглядит следующим образом:
def run() {
try {
beginExecution()
try {
if (fun eq null)
handler(msg)
else
fun()
} catch {
case _: KillActorControl =>
// do nothing
case e: Exception if reactor.exceptionHandler.isDefinedAt(e) =>
reactor.exceptionHandler(e)
}
reactor.kill()
}
Eclipse показывает, что этот код был вызван из цикла for в функции getMatchingNode.
def getMatchingNode (initialMatch :String) : Int = {
val len = initialMatch.length
for (i <- 0 to noOfNodes-1)
Странно то, что иногда цикл ведет себя нормально, а иногда уходит в scala-код, который убивает актера.
Любые входные данные, что не так с кодом ??
Любая помощь будет оценена по достоинству.