2010-09-06 4 views
7

Je dispose d'un fichier journal contenant les données suivantes:problème en utilisant la nextLine() et hasNextLine() de scanner

Plus court chemin (2) :: RV3280-RV0973C-RV2888C
Plus court chemin (1): : RV3280-RV2502C
chemin le plus court (2) :: RV3280-RV2501C-RV1263
chemin le plus court (2) :: RV2363-Rv3285-RV3280

A partir de chaque ligne, le nombre i exige dans les crochets, le nom de la première protéine (RV3280 dans la première ligne) et le nom de la dernière protéine (RV2888C dans la première ligne).

J'ai écrit un code pour cela en utilisant l'objet Scanner. Je reçois les résultats souhaités mais je reçois également un message d'erreur.

try{ 
       Scanner s = new Scanner(new File(args[0])); 
       while (s.hasNextLine()) { 
        s.findInLine("Shortest path\\((\\d+)\\)::(\\w+).*-(\\w+)"); // at each line, look for this pattern 
        MatchResult result = s.match(); // results from 
        for (int i=1; i<=result.groupCount(); i++) { 
         System.out.println(result.group(i)); 
        } 
        s.nextLine(); // line no. 29 
       } 
       s.close(); 
     } 

     catch (FileNotFoundException e) { 
      System.out.print("cannot find file"); 
     } 

La sortie obtenue pour le fichier d'entrée ci-dessus est:

Exception in thread "main" java.util.NoSuchElementException: No line found 
     at java.util.Scanner.nextLine(Scanner.java:1516) 
     at nearnessindex.Main.main(Main.java:29) 
2 
RV3280 
RV2888C 
1 
RV3280 
RV2502C 
2 
RV3280 
RV1263 
2 
RV2363 
RV3280 
Java Result: 1 
BUILD SUCCESSFUL (total time: 1 second) 

Pourquoi cette erreur se produit-elle et comment la corriger?

Répondre

3

Vos données d'entrée ne probablement pas fin avec un séparateur de ligne qui serait la cause. Les appels à findInLine déplace le scanner passé le modèle correspondant et si vous êtes à la fin des données d'entrée lors de l'appel nextLine il jetteront la NoSuchElementException

Une solution facile sans réorganisant le code pour beaucoup serait de mettre fin au tout boucle avec:

if (s.hasNextLine()) { 
    s.nextLine(); 
} 
+0

Salut Key, oui cela fonctionne dès ajouté un séparateur de ligne. Je n'ai pas pensé au déménagement de Scanner à la fin de la ligne :) Merci beaucoup et merci pour le correctif aussi. – Harish

0
public static void main(String[] args) { 
      Scanner s = new Scanner("Shortest path(2)::RV3280-RV0973C-RV2888C" 
        + "\nShortest path(1)::RV3280-RV2502C" 
        + "\nShortest path(2)::RV3280-RV2501C-RV1263" 
        + "\nShortest path(2)::RV2363-Rv3285-RV3280"); 
      while (s.hasNextLine()) { 
       s.findInLine("Shortest path\\((\\d+)\\)::(\\w+).*-(\\w+)"); // at each line, look for this pattern 
       MatchResult result = s.match(); // results from 
       for (int i = 1; i <= result.groupCount(); i++) { 
        System.out.println(result.group(i)); 
       } 
       s.nextLine(); // line no. 29 
      } 
      s.close(); 
    } 
} 

run: 
2 
RV3280 
RV2888C 
1 
RV3280 
RV2502C 
2 
RV3280 
RV1263 
2 
RV2363 
RV3280 
BUILD SUCCESSFUL (total time: 0 seconds) 

Cela fonctionne bien pour moi, peut-être vous avez des caractères étranges ou des lignes vides dans votre fichier?

2 lignes vides à la fin me donnent que: Exception dans le thread « principal » java.lang.IllegalStateException: Aucun résultat disponible correspondance

Si votre fichier d'entrée est que strictement formaté, vous pouvez faire quelque chose comme ça , ce qui est beaucoup plus facile parce que vous pouvez vous débarrasser de cette regex méchant;)

String[] lines = new String[]{"Shortest path(2)::RV3280-RV0973C-RV2888C", "Shortest path(1)::RV3280-RV2502C", "Shortest path(2)::RV3280-RV2501C-RV1263", "Shortest path(2)::RV2363-Rv3285-RV3280", "\n", "\n"}; 
    final int positionOfIndex = 14; 
    final int startPositionOfProteins = 18; 
    for (String line : lines) { 
     if (!line.trim().isEmpty()) { 
      System.out.print(line.charAt(positionOfIndex) + ": "); 
      String[] proteins = line.substring(startPositionOfProteins).split("-"); 
      System.out.println(proteins[0] + " " + proteins[proteins.size() -1]); 

     } 
    } 
+0

2 lignes vides à la fin donne "Aucun résultat de correspondance" car la première ligne vide est vérifiée pour les correspondances. Votre code se débarrasse de la regex "méchant" mais ce dont j'ai besoin, c'est juste la première et la dernière protéine, pas la liste complète. Merci quand même, je peux peut-être utiliser ça ailleurs. – Harish

+0

sry n'a pas vu que .. j'ai changé une seule ligne, devrait fonctionner maintenant. – atamanroman

+0

hmm ... ya maintenant ça marcherait. – Harish

Questions connexes