2016-06-20 142 views
2

我的代碼丟異常scala.util.control.BreakControl,但我不知道爲什麼。有人知道嗎?什麼情況會拋出異常「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 
        } 
       } 
      } 
+3

你能告訴你的代碼(和完整堆棧跟蹤)? – Thilo

+0

@Thilo我更新了這個問題,你能再次看到嗎? – Guo

回答

9

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。您在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 
    } 
    } 
} 

斯卡拉標準庫還包括這樣的情況下的一種特殊構造,它可以讓您捕捉到所有Throwables除致命的像OutOfMemoryErrorStackOverflowError,也擴展ControlThrowable一切:

import scala.util.control.NonFatal 

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

我更新了這個問題,你能再看一次嗎? – Guo

+0

我懂了!感謝您的幫助! – Guo

相關問題