2017-05-07 62 views
1

我想在Scala中打印一個二維矩陣,並且我不斷收到數組索引超出限制的異常。 我使用了易碎代碼,但仍然遇到問題。數組索引超出範圍的異常 - Scala

package com.edureka.scala 
import scala.util.control.Breaks._ 

class Pascal 
{ 
    val r,c=0 
    val matrix=Array.ofDim[Int](r,c) //declare a two-dimensional array 
    def fun 
     { 
     breakable 
     { 
      for(r <- 0 until 4 ;c <- 0 until 4) 
      { 
       println(matrix(r)(c)=r+c) 
       if(r>3)break 
      } 
      } 
     } 
} 

object pas1 extends App 
{ 

    val pasobj=new Pascal() 
    pasobj.fun 

} 
+0

沒有理由來聲明變量,比如'r'和'C',在for循環使用它們。這使得另一個Scala程序員難以閱讀這段代碼。 – ashawley

回答

1

你正在創建一個空數組:

val matrix = Array.ofDim[Int](0, 0) 
matrix: Array[Array[Int]] = Array() 

由於沒有條目,檢索一個失敗:

scala> matrix(0)(0) 
java.lang.ArrayIndexOutOfBoundsException: 0 

並分配到一個失敗,還有:

scala> matrix(0)(0) = 0 
java.lang.ArrayIndexOutOfBoundsException: 0 

您需要聲明4×4維數組:

val matrix = Array.ofDim[Int](4, 4) 
matrix: Array[Array[Int]] = Array(Array(0, 0, 0, 0), Array(0, 0, 0, 0), ...) 

然後你就可以成功地分配:

scala> matrix(3)(3) = 3 

和檢索,以及:

scala> matrix(3)(3) 
res1: Int = 3 
0

你定義一個陣列型數組,既然您聲明r,c=0

@ val m = Array.ofDim[Int](0, 0) 
m: Array[Array[Int]] = Array() 

,然後在循環中,您嘗試訪問數組中的元素(不存在)

@ m(0)(0) 
java.lang.ArrayIndexOutOfBoundsException: 0 
    $sess.cmd5$.<init>(cmd5.sc:1) 
    $sess.cmd5$.<clinit>(cmd5.sc:-1) 

只需在創建數組的數組不使用值填充它,尤其是當你設置它的尺寸如0。您可以設置維度較高,你將有一個填充陣列:

@ val m2 = Array.ofDim[Int](5, 5) 
m2: Array[Array[Int]] = Array(
    Array(0, 0, 0, 0, 0), 
    Array(0, 0, 0, 0, 0), 
    Array(0, 0, 0, 0, 0), 
    Array(0, 0, 0, 0, 0), 
    Array(0, 0, 0, 0, 0) 
) 
@ m2(1)(4) 
res7: Int = 0 
+0

在Scala中使用for-comprehensions沒有任何問題http://docs.scala-lang.org/tutorials/tour/sequence-comprehensions.html – ashawley

+0

你是絕對正確的,這不是我的地方,做法 – Charles