2017-04-27 3 views
0

Je travaille sur un projet de collège où je dois extraire des données de célébrités de l'API TVMaze vers Java.Java DataInputStream Chaîne hors limites: 0

Je stocke les résultats recherchés dans un fichier binaire en utilisant 'DIS' et comme j'ai des objets, je remballe et dépouille le fichier en lecture/écriture.

Je reçois une erreur lorsque j'essaie de recharger le fichier dans la HashMap.

Exception in thread "main" java.lang.StringIndexOutOfBoundsException: index de chaîne hors de la plage: 0

L'erreur est dirigé dans la méthode de charge et Depad Méthode.

Cela a fonctionné pour moi hier, mais pour une raison inconnue, il a cessé de fonctionner.

Enregistrer le code:

private static void save(HashMap<String, ArrayList<Person>> persons) throws IOException 
{ 
    try 
    { 
     ArrayList<Person> p = convertFileData(persons); 
     File f = new File("person.dat"); 
     if(!f.exists()) 
     { 
      f.createNewFile(); 
     } 

     DataOutputStream dos = new DataOutputStream(new FileOutputStream(f)); 
     Iterator<Person> iter = p.iterator(); 
     while(iter.hasNext()) 
     { 
      Person s = iter.next(); 
      dos.writeDouble(s.getScore()); 
      dos.writeBytes(pad(s.getQueryName(), 30)); 
      dos.writeBytes(pad(s.getName(), 30)); 
      dos.writeInt(s.getId()); 
      List<String> images = s.getImageUrls(); 
      for(String image : images) 
      { 
       dos.writeBytes(pad(image, 80)); 
      } 
      dos.writeBytes(pad(s.getPersonUrl(), 50)); 
      dos.writeDouble(s.getMyRating()); 
      ArrayList<String> comments = s.getMyComments(); 
      int commentSize = comments.size(); 
      System.out.println(commentSize); 
      dos.writeInt(commentSize); 
      for(String comment : comments) 
      { 
       dos.writeBytes(pad(comment, 40)); 
      } 
     } 
     dos.close(); 
    } 
    catch(IOException e) 
    { 
     e.printStackTrace(); 
    } 
} 

Code charge:

public static HashMap<String, ArrayList<Person>> load() throws FileNotFoundException, IOException 
{ 
    File f = new File("person.dat"); 
    HashMap<String, ArrayList<Person>> persons = new HashMap<>(); 
    if(f.exists()) 
    { 
     DataInputStream dis = new DataInputStream(new FileInputStream(f)); 
     ArrayList<Person> x = new ArrayList<>(); 
     while(dis.available() > 0) 
     { 
      double score = dis.readDouble(); 
      System.out.println(score); 

      byte[] queryNameBytes = new byte[30]; 
      dis.read(queryNameBytes); 
      String queryName = depad(new String(queryNameBytes)); 
      System.out.println(queryName); 

      byte[] nameBytes = new byte[30]; 
      dis.read(nameBytes); 
      String name = depad(new String(nameBytes)); 
      System.out.println(name); 

      int id = dis.readInt(); 
      System.out.println(id); 

      ArrayList<String> imageUrls = new ArrayList<>(); 

      byte[] mediumImage = new byte[80]; 
      dis.read(mediumImage); 
      String mImage = depad(new String(mediumImage)); 
      imageUrls.add(mImage); 

      byte[] originalImage = new byte[80]; 
      dis.read(originalImage); 
      String oImage = depad(new String(originalImage)); 
      imageUrls.add(oImage); 
      System.out.println(imageUrls); 

      byte[] personLinkBytes = new byte[50]; 
      dis.read(personLinkBytes); 
      String personLink = depad(new String(personLinkBytes)); 
      System.out.println(personLink); 

      double myRating = dis.readDouble(); 
      System.out.println(myRating); 

      ArrayList<String> myComments = new ArrayList<>(); 

      int commentCount = dis.readInt(); 
      System.out.println(commentCount); 
      for(int i = 0; i < commentCount; i++) 
      { 
       byte[] myCommentsBytes = new byte[40]; 
       dis.read(myCommentsBytes); 
       String myComment = depad(new String(myCommentsBytes)); 
       myComments.add(myComment); 
      } 
      System.out.println(myComments); 
      x.add(new Person(score, queryName, name, id, imageUrls, personLink, myRating, myComments)); 

      persons.put(queryName, x); // -> Add person to Map    
     } 
     dis.close(); 
    } 
    return persons; 
} 

Code Pad:

public static String pad(String s, int size) 
{ 
    while (s.length() < size) 
    { 
     s = (char)0 + s; 
    } 
    return s; 
} 

code Depad:

public static String depad(String s) 
{ 
    while(s.charAt(0) == (char)0) 
    { 
     s = s.substring(1); 
    } 
    return s; 
} 

Répondre

0

Regardez votre code:

public static String depad(String s) 
{ 
    while(s.charAt(0) == (char)0) 
    { 
     s = s.substring(1); 
    } 
} 

si cordes s est 0 en taille? Ensuite, vous obtiendrez l'exception StringIndexOutOfBoundsException comme prévu. Vous devriez toujours faire ce genre de vérification lorsque vous lisez des données qui peuvent changer.

+0

Oh, d'accord. Merci d'avoir signalé mon défaut. Je ne suis nouveau que pour les flux d'entrée/sortie de données. Merci pour le tuyau! – RidiculousBeans

+0

Content de vous aider! Apprenez à utiliser votre débogueur, et vous trouverez ces types de problèmes beaucoup plus faciles à résoudre. Si vous pouvez accepter ma réponse, vous me feriez aussi un solide. Merci. – DCON

+0

Je vais devoir attendre pour accepter la réponse. J'ai réalisé que la taille de remplissage dans mon code me donne des problèmes. – RidiculousBeans