0

クラスAのオブジェクトを使用して、サンプルクラスの変数「ファイル」に各アクターに異なる値を割り当てようとしています.

    class A{

  var a1=new Array[example](2) 

  def starting()= {

    for(i <- 0 to 3){

      if(i==0){
        a1(i).file="L1.txt"; 
      }
      else if(i==1){
        a1(i).file="L2.txt";
      }

      a1(i).start

    }
  }
}


class example extends Actor {

  var file="default.txt"

  var Handle = new A

  def act()= {
    loop{
      var count=0
      react{
        //remaining code
    }
  }
 }

これは、次の行に対応する nullpointerexception をスローしています。

for(i <- 0 to 3){

          if(i==0){
            a1(i).file="L1.txt"; 
          }

私はscalaの初心者です。どういうわけか、この例外の理由を理解できません。助けてください。

4

3 に答える 3

4

var a1=new Array[example](2)2 つの null を持つ新しい配列を作成するため、a1(i)null です。

使用するvar a1 = IndexedSeq.fill(2){ new example }

オフトピック:

そのようなものにはコードレビューがありますが、あなたのコードはスカラではありません。書き直してみてください。

例えば:

scala> import actors.Actor._
import actors.Actor._

scala> val as = for ( fileName <- Seq("L1.txt", "L2.txt") )
     |   yield actor {
     |     var count = 0
     |     loop {
     |       receive {
     |         case t =>
     |           count += 1
     |           println(fileName + " " + count + " " + t)
     |       }
     |     }
     |   }
as: Seq[scala.actors.Actor] = List(scala.actors.Actor$$anon$1@ef82188, scala.actors.Actor$$anon$1@44616f65)

scala> as.foreach{ _ ! 's }
L2.txt 1 's
L1.txt 1 's
于 2012-12-12T08:08:39.623 に答える
1

@seniaがすでに診断したものとは別に、2つの要素の配列を割り当ててから、その4つの要素を反復しようとしています:

for(i <- 0 to 3){

これは確実にArrayIndexOutOfBoundsException1 回生成され、 i2 になります。これが機能するには、ループ条件がfor(i <- 0 to 1)orfor(i <- 0 until 2)である必要があります。確かに、これを実装するためのより優れた、より Scala 風の方法があります。

于 2012-12-12T08:35:23.830 に答える
0

おそらくファイル「L1.txt」が見つかりません!

このURLを読むScalaでファイル全体を読む?

于 2012-12-12T08:06:01.993 に答える