2017-06-25 3 views
0
String currentLine = reader.readLine(); 
while (currentLine != null) 
{ 
    String[] studentDetail = currentLine.split(""); 

    String name = studentDetail[0]; 

    int number = Integer.valueOf(studentDetail[1]); 
    currentLine = reader.readLine(); 
} 

So habe ich eine Datei wie folgt:Integer.valueOf() Fehler ArrayIndexOutOfBoundsException:

student1 
    student16 
    student6 
    student9 
    student10 
    student15 

Wenn ich das Programm ausführen, sagte: ArrayIndexOutOfBoundsException: 1

die Ausgabe sollte wie folgt aussehen :

student1 
    student6 
    student9 
    student10 
    student11 
    student15 
    student16 
+0

Sie müssen mehr von Ihrem Code veröffentlichen. –

+0

Sie können Debuggen, um herauszufinden, was Ihr Variablenname enthält, da IndexOutOfBounds angibt, dass auf einen Array mit einem ungültigen Index zugegriffen wurde. Der Index ist entweder negativ oder größer als oder gleich der Größe des Arrays. –

+0

was müssen Sie wissen? – Camila

Antwort

0

Programmieren Sie zunächst die Schnittstelle List anstelle des Betontyps ArrayList. Zweitens, verwenden Sie eine try-with-resources (oder schließen Sie explizit Ihre reader in einem finally Block). Drittens würde ich eine Pattern (eine Regex) und dann eine Matcher in der Schleife nach "Name" und "Nummer" suchen. Das könnte etwa so aussehen,

List<Student> student = new ArrayList<>(); 
try (BufferedReader reader = new BufferedReader(new FileReader(new File(infile)))) { 
    Pattern p = Pattern.compile("(\\D+)(\\d+)"); 
    String currentLine; 
    while ((currentLine = reader.readLine()) != null) { 
     Matcher m = p.matcher(currentLine); 
     if (m.matches()) { 
      // Assuming `Student` has a `String`, `int` constructor 
      student.add(new Student(m.group(1), Integer.parseInt(m.group(2)))); 
     } 
    } 
} catch (FileNotFoundException fnfe) { 
    fnfe.printStackTrace(); 
} 

Schließlich ist zu beachten, dass Integer.valueOf(String) gibt einen Integer (die Sie dann unbox). Deshalb habe ich hier Integer.parseInt(String) verwendet.

+0

das funktioniert perfekt danke. – Camila

+0

Frisch wenn ich einen Versuch machen und fangen möchte, wenn die Datei nicht gefunden wird, wie kann ich es tun? – Camila

+0

@EliottFrish Ich brauche Hilfe für Sie, bitte – Camila

0

Unter der Annahme, alle Linien beginnen mit student und enden mit einer Nummer, können Sie alle Zeilen lesen und fügen Sie sie zu einem list und dann sort die list durch die Nummer nach student, dann print jedes Element. Zum Beispiel:

String currentLine; 
List<String> test = new ArrayList<String>(); 
while ((currentLine = reader.readLine()) != null) 
    test.add(currentLine()); 
test.stream() 
    .sorted((s1, s2) -> Integer.parseInt(s1.substring(7)) - Integer.parseInt(s2.substring(7))) 
    .forEach(System.out::println); 

Ausgang:

student1 
student6 
student8 
student9 

Wenn Sie nicht stream() und lambda verwenden möchten, können Sie die list mit einem benutzerdefinierten sortieren Comparator dann loop durch das list und jedes Element drucken:

Collections.sort(test, new Comparator<String>() { 
    @Override 
    public int compare(String s1, String s2) { 
     int n1 = Integer.parseInt(s1.substring(7)); 
     int n2 = Integer.parseInt(s2.substring(7)); 
     return n1-n2; 
    } 
}); 
+0

Nein, diesen Code kann ich verwenden, weil ich bereits die Vergleichbarkeit mit einer Schnittstelle habe, ich muss nur wissen, wie ich den Int-Wert für jede Zeile nehmen und in ein Array setzen kann. – Camila

+0

@Camila 'Integer.parseInt (currentLineString (7));' gibt Ihnen den int-Wert jeder Zeile. –

+0

Ok, aber wenn ich student1 student2 student4 student10 student13 student14 ??? wie kann ich die string für student und die ints für jede zeile? – Camila

-1

Ihre Datei muss so aussehen

student 1 
student 2 
student 3 

vergessen Sie nicht, Leerzeichen zwischen Student und Nummer hinzuzufügen. Und in Ihrer Iteration müssen Sie diese Zeile hinzu: currentLine = reader.readLine(); Sie wie folgt aufteilen: String[] directoryDetail = currentLine.split(" "); statt String[] directoryDetail = currentLine.split(""); , denn wenn man String[] directoryDetail = currentLine.split(""); mit student1 das Ergebnis verwendet, ist ein String-Array von String mit Länge = 0

+1

Im Allgemeinen lösen Sie nicht Programmierprobleme durch Ändern der Art der Eingabe. Das liegt außerhalb deiner Kontrolle. Das Problem ist normalerweise "Wie gehe ich mit dem Input um, den ich bekomme"? – ajb

Verwandte Themen