2014-11-23 76 views
1

問題解決了,我最終需要一個單獨的數組位置計數器。謝謝您的幫助! 我正在寫一個小型應用程序,它接受一個字符串,將每個字符串處理成7位二進制代碼,然後根據字符串填充音樂等級。例如,如果我有二進制1000100,在C Major的鍵中,它會給我C和G(C 0 0 0 G 0 0)的音符。在Java中的二維不規則數組上出現異常

我遇到了一個需要輸入String [](其中每個元素都是單個字符值爲二進制值,7位)並且在字符串本身中處理每個單獨字符的特定代碼的問題並存儲字符串中發生1的索引號。例如,串1000100將輸出1和5

下面是確實,該方法:

public static String[][] convertToScale(String[] e){ 
    String[][] notes = new String[e.length][]; //create array to hold arrays of Strings that represent notes 
    for(int i = 0; i < e.length; i++){ 
     notes[i] = new String[findOccurancesOf(e[i])]; //create arrays to hold array of strings 
     for(int x = 0; x < e[i].length(); x++){ 
      if((e[i].charAt(x)) != 48){ //checks to see if the char being evaluated is 0(Ascii code 48) 
       notes[i][x] = Integer.toString(x + 1); // if the value isn't 0, it fills in the array for that position.the value at x+1 represents the position of the scale the note is at 
      } 
     } 
    } 
    return notes; 
} 

這裏是作爲代碼使用來獲得的1的出現在E [1]:

public static int findOccurancesOf(String s){ 
    int counter = 0; 
    for(int i = 0; i < s.length(); i++) { 
     if(s.charAt(i) == 1) { 
      counter++; 
     } 
    } 
    return counter; 
} 

我遇到的問題是使用convertToScale方法。當使用「Hello world」作爲我的輸入時(輸入在被任何一種方法處理之前被轉換爲7位二進制數據),它首次通過第二次for-each循環,但在它嘗試陣列中填充另一點,它引發

java.lang.ArrayIndexOutOfBoundsException:3

編輯:這發生在convertToScale方法的線notes[i][x] = Integer.toString(x + 1);。在嘗試下面的建議更改後,我多次運行調試程序,並且仍然在同一行發生同樣的錯誤。 findOccurancesOf方法返回正確的值(當評估H(1001000)時,它返回2.)所以讓我困惑的是,當它填充數組中的第二個點時,超出界限異常就會出現。

而且,隨時告訴我,如果別的是瘋了還是我的語法是壞的。謝謝!

+0

調試你的代碼,你會在更短的發現問題超過20秒。 – Maroun 2014-11-23 08:56:43

+0

請指出此異常在哪一行發生。 – Henry 2014-11-23 08:56:53

+0

調試是我嘗試的第一件事,那就是我最困惑的東西!我更新了錯誤發生線的問題。謝謝:) – DFXLuna 2014-11-23 19:23:14

回答

1

findOccurancesOf()

if(s.charAt(i) == 1) {應該if(s.charAt(i) == '1') {檢查字符 '1'。

否則它看起來與ASCII值的字符1.

有一個出界異常的,因爲如果findOccuranceOf()返回錯誤的值,然後notes[i]不與下面的行的convertToScale()正確長度構建:

notes[i] = new String[findOccurancesOf(e[i])]; 

此外,你可能想使用類似:

notes[i][c++] = Integer.toString(x + 1); 

與一些計數器c初始化爲0,如果我正確理解你的意圖。

+0

它如何解釋'ArrayIndexOutOfBoundsException'? – alfasin 2014-11-23 08:59:14

+0

@alfasin更新了答案。 – irrelephant 2014-11-23 09:00:43

+0

即使它不是以正確的長度構建的,迭代運行在'x alfasin 2014-11-23 09:02:30

0

原因AIOOBE在於這一行:

notes[i] = new String[findOccurancesOf(e[i])]; //create arrays to hold array of strings 

當你調用findOccurancesOf方法找到1一次出現在字符串中說你好,你不發現並返回0,然後調用notes[i][x] = Integer.toString(x + 1);與x作爲0.因爲你從來沒有分配空間,所以你會得到數組索引超出界限的異常。

我建議如下因素:

  • 分配索引之前驗證您的字符串說比0或者更大的事物。
  • 初始化你的筆記[I]爲notes[i] = new String[e[i].length];
  • 檢查單引號像字符,而不是a == 1
+0

我想我可能已經很好地解釋了這個問題。在輸入(字符串)到達這些方法時,它已變成一個String [],每個元素都是原始字符串中每個字符的7位二進制轉換。另外,當將第二個數組添加到notes [i]中時,我希望第二個數組的元素數只有二進制輸入中的1。這就是爲什麼我在每個二進制字符串中找到1的出現次數並將第二個數組初始化爲該值的原因。謝謝! :) – DFXLuna 2014-11-23 19:22:02

0

異常被提到什麼阿爾瑪斯造成的,但是請注意,你的邏輯錯誤是最可能在findOccurencesOf方法中,如果想法是在字符串內部找到所有的'1'字符,則必須更改爲我在下面列出的內容,請注意這些指令。否則,一個char是越來越轉換爲字節ASCII碼,並且除非ASCII碼一個代碼匹配,該方法將返回0,導致您的例外

if(s.charAt(i) == '1') { 
+0

我嘗試了你的建議後更新了問題!謝謝 :) – DFXLuna 2014-11-23 19:19:27