2015-06-09 38 views
0

我正在Scala中編寫一個解析器程序,該程序應該使用「args」讀取輸入並對其進行分析。不要緊,我用:如何檢查args數組的結束?

while(!args.isEmpty){ 
     if (Files.exists(Paths.get(args(j)))){ 
      Statement=Statement.concat(inputXml) 
      Statement=Statement.concat(" ") 
      println(j) 
      } 
     else{ 
      Statement=Statement.concat(args(j)) 
      Statement=Statement.concat(" ") 
      println(j) 
      } 
    j=j+1 
    } 

while(args.length !=0) { 
     if (Files.exists(Paths.get(args(j)))){ 
      Statement=Statement.concat(inputXml) 
      Statement=Statement.concat(" ") 
      println(j) 
      } 
     else{ 
      Statement=Statement.concat(args(j)) 
      Statement=Statement.concat(" ") 
      println(j) 
      } 
    j=j+1 
    } 

該計劃爲我跑數組索引的時間除外出界!發送2個值作爲輸入:

Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: 2 

我該怎麼辦?我很困惑!

+0

您是否在修改'args'? –

+0

@Oliver不,我不是 – Rubbic

+0

請提供一個可重複的測試用例,我們不能用很不明確的描述和兩行不相關的代碼做很多事情。抱歉。 –

回答

4

您的例外:

Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: 2 

是因爲你沒有違反while循環; args參數永遠不會改變它的大小,所以你的while將永遠實用j超過args的大小。

也許你可以試試:

int i = 0 
while (i < args.length){ 
    // some code here 
    i++; 
} 

for(int i = 0; i < args.length; i++){ 
// some code here 
} 

如果你想通過所有的陣列

+0

謝謝我使用了第一個解決方案,它解決了:-) – Rubbic

3

遍歷從你的描述,你需要通過您的數組進行迭代,而您的索引低於最大數組大小。如果僅僅比較args.length值,則循環條件將繼續無限地評估爲真值,因爲args.length總是不同於0(如果未更改)。

你需要沿着線的東西:

for(i <- 0 until array.length){ 
... 

您可以找到關於訪問和遍歷數組herehere

1

請考慮遍歷args不使用索引引用(出源的額外信息邊界錯誤),

for (arg <- args) yield { 
    if (Files.exists(Paths.get(arg))) xmlFile 
    else "" 
}.mkString(" ") 

這理解產生收集將String轉換爲由mkString分隔的空格字符串。