2016-06-20 13 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を捕まえるべきではないことを意味します。ブロックの内側にbreakを入れて、すべて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の標準ライブラリはまた、あなたが以外のすべてのThrowablesをキャッチすることができます。このようなケースのための特別な構文が含まれてOutOfMemoryErrorまたはStackOverflowError、ともControlThrowableを拡張するすべてのもののような致命的なもの:

import scala.util.control.NonFatal 

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

私は質問を更新します、もう一度見ることができますか? – Guo

+0

私はそれを得た!ご協力ありがとうございました! – Guo

関連する問題