2016-03-19 10 views
0

Ich konfrontiert ein seltsames Java-Verhalten zur Laufzeit. Alle Informationen sind auf dem Screenshot. Meine Anwendung schlägt fehl. Überraschenderweise kann es bei gleichen Eingabedaten zu unterschiedlichen Zeiten korrekt verarbeitet werden. Kannst du mir erklären, was die Ursache für dieses seltsame Verhalten ist? Ich benutze jdk 1.7.0_79 Hier vollständigen Codeteil id = "common.dto.IdsFilter"Weird Java-Verhalten

private String[] splitPackageAndNameParts(String id) { 
    // check string not empty 
    if (StringUtils.isEmpty(id)) { 
     throw new IllegalArgumentException("Unexpected id : " + id); 
    } 

    // get last point index 
    int index = id.lastIndexOf("."); 

    // check index 
    if (index == 0 || index >= (id.length() - 1)) { 
     throw new IllegalArgumentException("Unexpected id : " + id); 
    } 

    // split 
    String pkgPart = index < 0 ? "" : id.substring(0, index + 1); 
    String namePart = id.substring(index + 1, id.length()); 

    // return result 
    return new String[]{pkgPart, namePart}; 
} 

Das richtige Ergebnis pkgPart = "common.dto." sein soll, aber zur Laufzeit kehrt "common.dto" (ohne Punkt)

+0

http://meta.stackoverflow.com/questions/285551/why-may-i-not-upload-images-of-code-on-so-when-asking-a-question/285557# 285557 –

+0

Wir brauchen * tatsächlichen Code * hier. Wir können Ihnen nicht mit einem Screenshot helfen, da * wir * das nicht in unsere Kopien von IntelliJ einstecken können, um zu sehen, was vor sich geht. – Makoto

+0

Bearbeiten Sie Ihre Antwort, um zu verdeutlichen, welche Eingabedaten Sie verwenden, wie das erwartete Verhalten aussieht und welche Fehlermeldung Sie erhalten. Und poste den Code, den du hast (kein Screenshot, aber echter Java-Code), damit wir dir helfen können. –

Antwort

1

Von dem, was ich sehen kann, Es sieht aus wie ein einzelner Fehler in Ihrer Teilzeichenfolge. Was Sie tun möchten, ist bis auf ohne die Position des Indexpunkts des Zeitraums zu kapseln, da dies auch den Punkt in der Teilzeichenfolge einschließen würde.

Einfache Änderung: Entfernen Sie die + 1 aus der Teilstring-Operation.

Alternativ zu Java 8 gibt es einen klareren Weg, dies mit StringJoiner und String#split zu tun. Das wird dir das erste Element bringen; Das zweite Element ist einfach das letzte in der Split-Sammlung.

String[] split = pkg.split("\\."); 
final StringJoiner stringJoiner = new StringJoiner("."); 
for(int i = 0; i < split.length - 1; i++) { 
    stringJoiner.add(split[i]); 
} 
System.out.println(stringJoiner.toString()); 
+0

Vielen Dank! Aber ich habe das gleiche Problem. Ich entfernte '+ 1' von Teilstring-Operationen, es funktioniert problemlos in Tests, ohne jedes Problem. Aber jetzt '.' In 'namePart' zur Laufzeit verpasst. Wenn ich es auswerte, gibt es korrektes Ergebnis zurück, aber zur Laufzeit scheitert es (das gleiche Problem wie auf dem Screenshot) – jahra

+0

Ich bemerkte, dass der erste Aufruf der Methode mit '" common.dto.IdsFilter "' als Eingabe funktioniert und den richtigen Wert zurückgibt . Aber wenn ich diese Methode sofort nach dem ersten Aufruf mit dem gleichen "common.dto.IdsFilter" 'als Eingabe aufrufe, wird ein falsches Ergebnis zurückgegeben – jahra