什么情况会抛出异常“scala.util.control.BreakControl”?

时间:2016-06-20 10:16:29

标签: scala

我的代码抛出异常 scala.util.control.BreakControl,但我不知道为什么。有谁知道吗?

enter image description here

我使用breakablebreak的某个地方,但我不知道为什么会导致此例外。

片段1

breakable {
                for (quaOfLine <- dataOfLine) {
                    try {
                        // ...   some other code

                        if (judgeTime(jsonQua.getInt("startTime")) == judgeTime(jsonLine.getInt("startTime"))) {

                           // ... some other code
                            if (quaRRIDs.length / RRIDs.length.toFloat >= 0.8 || quaRRIDs.length / RRIDs.length.toFloat <= 1.2) {
                                var count = 0
                                breakable {
                                    for (rrid <- RRIDs) {
                                        for (quaRRID <- quaRRIDs) {
                                            if (rrid == quaRRID) {
                                                count += 1
                                                break                   //break
                                            }
                                        }
                                    }
                                }
                                if (count / RRIDs.length.toFloat >= 0.8) {
                                    sameLine = qualifier + "::" + value
                                    break           // break
                                }
                            }
                        }
                    } catch {
                        case e: Throwable => e.printStackTrace
                    }
                }
            }

片段2

breakable {
                for (quaOfDest <- dataOfDest) {
                    try {
                        val qualifier = quaOfDest.getString("qualifier")
                        val value = quaOfDest.getString("value")
                        val jsonQua = new JSONObject(value)


                        val (quaSLon, quaSLat, quaELon, quaELat) = getSELonLat(jsonQua)

                        if (jsonQua.getInt("timeBucket").toString == judgeTime(jsonLine.getInt("startTime"))) {

                            someDest = qualifier + "::" + value
                            break     //break
                        }
                    } catch {
                        case e: Throwable => e.printStackTrace
                    }
                }
            }

1 个答案:

答案 0 :(得分:10)

方法scala.util.control.BreakControl抛出

scala.util.control.Breaks.break。它用于模拟Java中的break语句。它的使用方式如下:

import scala.util.control.Breaks.{break, breakable}

breakable {
  for(i <- 1 until 10) {
    println(i)
    if(i > 5) break
  }
}

BreakControl是一个私有类,因此通常不会被break以外的任何内容抛出。

这也意味着在breakable区域内你不应该自己抓住BreakControl。您在break块内try然后捕获所有Throwables并打印它们。 BreakControlThrowable,因此它会被您抓住而不是breakable方法。

如果你真的想要抓住所有Exceptions / Throwables,你应该这样做:

import scala.util.control.Breaks.{break, breakable}
import scala.util.control.ControlThrowable

breakable {
  for(i <- 1 until 10) {
    try {
      println(i)
      if(i > 5) break
    } catch {
      case c: ControlThrowable => throw c
      case t: Throwable => t.printStackTrace
    }
  }
}

Scala标准库还包含一个针对此类案例的特殊构造,可让您捕获除ThrowablesOutOfMemoryError等致命内容之外的所有StackOverflowError,以及扩展ControlThrowable的所有内容。 1}}:

import scala.util.control.NonFatal

try {
  //do stuff
} catch {
  case NonFatal(e) => e.printStackTrace
}