我的代码抛出异常 scala.util.control.BreakControl
,但我不知道为什么。有谁知道吗?
我使用breakable
和break
的某个地方,但我不知道为什么会导致此例外。
片段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
}
}
}
答案 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
并打印它们。 BreakControl
是Throwable
,因此它会被您抓住而不是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标准库还包含一个针对此类案例的特殊构造,可让您捕获除Throwables
或OutOfMemoryError
等致命内容之外的所有StackOverflowError
,以及扩展ControlThrowable
的所有内容。 1}}:
import scala.util.control.NonFatal
try {
//do stuff
} catch {
case NonFatal(e) => e.printStackTrace
}