2013-03-24 3 views
1

Редактировать NoSuchElementException: Всего метода:.множественных .Надеть дает

 public static String[] singlemultiplet(String filename, int numofzeros) throws IOException {//isolate notes between brackets 
    Scanner inputmeasure = new Scanner(new DataInputStream(new FileInputStream(filename))); 
     InputStream is = new BufferedInputStream(new FileInputStream(filename)); 
      BufferedReader bReader = new BufferedReader(new InputStreamReader(is)); 
      StringBuffer sbfFileContents = new StringBuffer(); 
      String line = null; 
      int lineCount = 0; 
    int j = 0; 
     int[] cmn = new int[countbrackets(filename)]; 
     String[] numbers = new String[40]; 
     String[][] matrix = new String[20][120]; 
     String[][] matrix2 = new String[20][120]; 
     String[][] matrix3 = new String[20][120]; 
      line = inputmeasure.useDelimiter("\n").next(); 
      Scanner s = new Scanner(line).useDelimiter("U"); 
      matrix[0][0] = s.useDelimiter("\r").next(); 
      String ubar = "U|"; 
      matrix2[0][0] = matrix[0][0].replace("\\),","U").replaceAll("\\)","U").replace(ubar,"U"); 
      matrix3[0][0] = matrix2[0][0].replace("|","U"); 
      Scanner s2 = new Scanner(matrix3[0][0]).useDelimiter("U"); 
      String brack = "("; 
      String[] multiplet = new String[countmultipletsandmeasures(filename) + numofzeros]; 
      String[] multiplet2 = new String[countmultipletsandmeasures(filename) + numofzeros]; 
      Arrays.fill(multiplet, ""); 
      int cmampluszeros = countmultipletsandmeasures(filename) + numofzeros; 
      for (int i = 0; i < cmampluszeros; i++) 
      { 
       matrix3[0][0] = s2.useDelimiter("U").next(); 
       multiplet[i] = matrix3[0][0]; 

      } 
      lineCount++; 
        sbfFileContents.append(line); 

      String strContent = sbfFileContents.toString(); 
    try { 
     return multiplet; 
    } finally { 
     is.close(); 
    } 
} 

Я хочу добиться того, что метод возвращает массив, который содержит multiplet куски линий Matrix3[0] читать в метод должен вырезать строку, как указано ниже, поэтому при встрече «)» или «|».

Когда я пытаюсь прочитать в первой строке Matrix3[0]:

(A#,A#,A#),(B#,B#,C#),(B#,B#,C#),(Bb,Bb,Cb)|(Ab,Ab,Ab),(Bb,Bb,Cb),(Bb,Bb,Cb),(Bb,Bb,Cb)| 

программа дает Куски

multiplet[i] 

в

multiplet: (A#,A#,A# 
multiplet: ,(B#,B#,C# 
multiplet: ,(B#,B#,C# 
multiplet: ,(Bb,Bb,Cb 
multiplet: (Ab,Ab,Ab 
multiplet: ,(Bb,Bb,Cb 
multiplet: ,(Bb,Bb,Cb 
multiplet: ,(Bb,Bb,Cb 

, который является правильным. Но когда я пытаюсь читать: (A#,A#,A#),(B#,B#,C#),(B#,B#,C#),(Bb,Bb,Cb)|A#,B#,C#,D#, E#,F#,G#, | ,A, , , , , , , , , , , , , , | Я получаю NoSuchElementException. Правильный результат будет следующим:

multiplet: (A#,A#,A# 
multiplet: ,(B#,B#,C# 
multiplet: ,(B#,B#,C# 
multiplet: ,(Bb,Bb,Cb 
multiplet: A#,B#,C#,D#, E#,F#,G#, 
multiplet: ,A, , , , , , , , , , , , , , 

Кто-нибудь знает, почему и что я должен сделать, чтобы получить правильный результат?

Edit:

Debugging даст мне следующую трассировку стека:

Breakpoint хит: "нить = главный", IOguitar.singlemultiplet(), строка = 2769 BCI = 306 2769 matrix3 [0 ] [0] = s2.useDelimiter («U»). Next();

Главный [1] шаг

Шаг завершена: "поток = главный", IOguitar.singlemultiplet(), строка = 2770 BCI = 322 2770 мультиплет [I] = matrix3 [0] [0] ;

Основной шаг [1]

Шаг завершена: "поток = главный", IOguitar.singlemultiplet(), строка = 2767 BCI = 333 2767 для (INT I = 0; I < cmampluszeros ; я ++)

Основной [1] шаг

Шаг завершен: Точка останова ударил: «ю read = main ", IOguitar.singlemultiplet(), строка = 2,769 bci = 306 2,769 matrix3 [0] [0] = s2.useDelimiter (" U "). next();

Основной [1] шаг

Шаг завершена: "поток = главный", IOguitar.singlemultiplet(), line = 2,770 bci = 322 2,770 мультиплет [i] = matrix3 [0] [0];

Основной шаг [1]

Шаг завершена: "поток = главный", IOguitar.singlemultiplet(), строка = 2767 BCI = 333 2767 для (INT I = 0; I < cmampluszeros ; я ++)

Основной [1] шаг

Шаг завершен: Точка останова ударил: «ю read = main ", IOguitar.singlemultiplet(), строка = 2,769 bci = 306 2,769 matrix3 [0] [0] = s2.useDelimiter (" U "). next();

Основной шаг [1]

Шаг завершена: "поток = главный", IOguitar.singlemultiplet(), строка = 2770 BCI = 322 2770 мультиплет [I] = matrix3 [0] [ 0];

Основной шаг [1]

Шаг завершена: "поток = главный", IOguitar.singlemultiplet(), строка = 2767 BCI = 333 2767 для (INT I = 0; I < cmampluszeros ; я ++)

Основной [1] шаг

Шаг завершен: Точка останова ударил: «ю read = main ", IOguitar.singlemultiplet(), строка = 2,769 bci = 306 2,769 matrix3 [0] [0] = s2.useDelimiter (" U "). next();

Основной шаг [1]

Шаг завершена: "поток = главный", IOguitar.singlemultiplet(), строка = 2770 BCI = 322 2770 мультиплет [I] = matrix3 [0] [ 0];

Основной шаг [1]

Шаг завершена: "поток = главный", IOguitar.singlemultiplet(), строка = 2767 BCI = 333 2767 для (INT I = 0; I < cmampluszeros ; я ++)

Основной [1] шаг

Шаг завершен: Точка останова ударил: «ю read = main ", IOguitar.singlemultiplet(), строка = 2,769 bci = 306 2,769 matrix3 [0] [0] = s2.useDelimiter (" U "). next();

Основной [1] шаг

Шаг завершена: "поток = главный", IOguitar.singlemultiplet(), line = 2,770 bci = 322 2,770 мультиплет [i] = matrix3 [0] [0];

Основной шаг [1]

Шаг завершена: "поток = главный", IOguitar.singlemultiplet(), строка = 2767 BCI = 333 2767 для (INT I = 0; I < cmampluszeros ; я ++)

Основной [1] шаг

Шаг завершен: Точка останова ударил: «ю read = main ", IOguitar.singlemultiplet(), строка = 2,769 bci = 306 2,769 matrix3 [0] [0] = s2.useDelimiter (" U "). next();

Основной шаг [1]

Шаг завершена: "поток = главный", IOguitar.singlemultiplet(), строка = 2770 BCI = 322 2770 мультиплет [I] = matrix3 [0] [ 0];

Основной шаг [1]

Шаг завершена: "поток = главный", IOguitar.singlemultiplet(), строка = 2767 BCI = 333 2767 для (INT I = 0; I < cmampluszeros ; я ++)

Основной [1] шаг

Шаг завершен: Точка останова ударил: «ю read = main ", IOguitar.singlemultiplet(), строка = 2,769 bci = 306 2,769 matrix3 [0] [0] = s2.useDelimiter (" U "). next();

Основной шаг [1]

Шаг завершена: "поток = главный", IOguitar.main(), строка = 2662 BCI = 35573 2662 e.printStackTrace();

Основной [1] шаг

java.util.NoSuchElementException на java.util.Scanner.throwFor (Scanner.java:838) на java.util.Scanner.next (сканера. Java: тысяча триста сорок семь) на IOguitar.singlemultiplet (IOguitar.java:2769) на IOguitar.countmultipletn (IOguitar.java:3121) на IOguitar.main (IOguitar.java:187)

Шаг завершена: " нить = основной», IOguitar.main(), строка = 2668 BCI = 35578 2668}

основной [1]

Но что я должен делать?

+1

Можете ли вы опубликовать трассировку стека? – raptortech97

+0

Java: пишите один раз, отлаживайте всюду. – Maroun

+0

Вы пробовали отлаживать свою программу шаг за шагом, чтобы лучше понять, что происходит? – assylias

ответ

0

Regular expressions - это более простой способ справиться с подобным разбором (он сделан для этого!). String имеет удобный способ, split(String regex), который разбивает строку так, как вы хотите, и помещает ее в массив строк, как и вы. Следующая строка будет делать трюк:

String[] multiplet = "(A#,A#,A#),(B#,B#,C#),(B#,B#,C#),(Bb,Bb,Cb)|(Ab,Ab,Ab),(Bb,Bb,Cb),(Bb,Bb,Cb),(Bb,Bb,Cb)|".split("(\\)|\\|)+"); 

Объяснения регулярного выражения:

\\) 

\\ избегает ) так буквальный ")"

| 

это означает, что или в регулярном выражении язык.

\\| 

literal "|"

("|" or ")")+ 

+ означает, что что-то внутри скобок должно быть по крайней мере один раз и жаден (так что, если два или более) или | смежные, они будут разбиты на все из них и не оставят пустую строку между ними.

+0

Я отредактировал свой вопрос, надеюсь, теперь это станет более ясным. – user1189952

+0

@ user1189952 см. Мое редактирование – ddmps

+0

Когда я использую .split ("[\\) \\ |] + | [\\ | +]"); (B #, B #, C#), (B #, B #, C#), (Bb, Bb, Cb) | A #, B #, C#, D #, E #, F #, G #, | , A,,,,,,,,,,,,,, | Я все еще получаю исключение NoSuchElementException. Что делать сейчас? – user1189952

Смежные вопросы