2017-01-27 1 views
1

Kann mir jemand sagen, warum dieser Code nicht funktioniert? Es wirft einen IndexOutOfBoundsException.Code wirft eine IndexOutOfBoundsException?

package blok6afvink6; 

/** 
* 
*/ 

import java.io.File; 
import java.io.FileNotFoundException; 
import java.io.FileReader; 
import java.util.ArrayList; 
import java.util.Scanner; 

public class Blok6afvink6 { 

    public static void main(String[] args) throws FileNotFoundException { 

     //1st, use Scanner to readin all sequence names and sequences; 
     //create two arrayList to store sequence names and sequences; 
     ArrayList<String> name = new ArrayList<String>(); 
     ArrayList<String> sequence = new ArrayList<String>(); 

     Scanner ScanLine = new Scanner(new FileReader("OverlapGraph.txt")); 
     String seq = ""; 
     while (ScanLine.hasNextLine()) { 
      String temp = ScanLine.nextLine(); 
      if (temp.charAt(0) == '>') { 
       sequence.add(seq); 
       name.add(temp.substring(1)); 
       seq = ""; 
      } else { 
       seq += temp; 
      } 
     } 

     ScanLine.close(); 
     sequence.remove(0); 
     sequence.add(seq); 

     //naam en seq printen 
     int Len = name.size(); 
     for (int i = 0; i < Len; i++) { 
      System.out.println(name.get(i) + ": " + sequence.get(i)); 
     } 
     //3rd, connect all sequences with O3 overlap, put the linked-names into a new string ArrayList 
     ArrayList<String> overLaps = linkOverlaps(name, sequence); 

     System.out.println("\nPrintout results:"); 
     for (int i = 0; i < overLaps.size(); i++) { 
      System.out.println(overLaps.get(i)); 
     } 
    } 

    private static ArrayList<String> linkOverlaps(ArrayList<String> name, ArrayList<String> sequence) { 
     ArrayList<String> overLap = new ArrayList<String>(); 
     //int size = name.size(); 
     for (int i = 0; i < name.size(); i++) { 
      int Len1 = sequence.get(i).length(); 

      for (int j = 0; j < name.size(); j++) { 
       if (i != j && sequence.get(i).substring(Len1 - 3).equals(sequence.get(j).substring(0, 3))) { 
        String linked = name.get(i) + " " + name.get(j); 
        overLap.add(linked); 
       } 
      } 
     } 
     return overLap; 
    } 

} 

Der Fehler:

Exception in thread "main" java.lang.IndexOutOfBoundsException: Index: 0, Size: 0 
    at java.util.ArrayList.rangeCheck(ArrayList.java:653) 
    at java.util.ArrayList.remove(ArrayList.java:492) 
    at blok6afvink6.Blok6afvink6.main(Blok6afvink6.java:36) 
+1

Weil Sie versuchen, ein Element aus dem 'sequence' entfernen' ArrayList', dass doesn‘ t existieren: 'sequenz.remove (0);' – CraigR8806

+0

Woher wissen Sie, dass die ArrayLists immer Elemente in ihnen haben werden? – EJoshuaS

+2

Sie sollten erklären, warum Sie denken, dass diese Ausnahme anders ist als alle anderen Male, die Leute die gleiche Ausnahme haben. – csmckelvey

Antwort

0

Schauen Sie genau auf die Fehlermeldung:

Exception in thread "main" java.lang.IndexOutOfBoundsException: Index: 0, Size: 0 

Es scheint, dass einer Ihrer Sammlungen Größe hat 0. Wenn ja, würde dies dazu führen, Ausnahme, da Sie nicht immer sicherstellen, dass die Sammlungen tatsächlich über Elemente verfügen, bevor Sie versuchen, auf sie zuzugreifen.

Überprüfen Sie insbesondere sequence.

3

Linie 36 in der Ausnahme verwiesen zu sein scheint:

sequence.remove(0); 

Dies ist nur mit dieser Ausnahme, wenn die Liste leer war fehlschlagen.

Also muss man davon ausgehen, dass sequence.add(seq); nie aufgerufen wird.

Wenn das OK und erwarten Sie für leere zuerst überprüfen kann:

if (!sequence.isEmpty()) { 
    sequence.remove(0); 
} 
1

versuchen

if(sequence.size() > 0) { 
    sequence.remove(0); 
} 
+2

Bitte erklären Sie, warum Sie eingereicht haben, was Sie eingereicht haben. Stack Overflow ist ein Wissensverteilungscenter, kein Code-Schreibdienst. Es wäre ** sehr viel besser, wenn OP gelernt hätte zu fischen. – CraigR8806

+0

In diesem Fall gab es einen logischen Fehler. Wir haben keinen Konzeptfehler. Manchmal ist die kurze Antwort die beste Antwort. Danke durch Feedback –

Verwandte Themen