Nieuws:

Welkom, Gast. Alsjeblieft inloggen of registreren.
Heb je de activerings-mail niet ontvangen?

Auteur Topic: Java ArrayList  (gelezen 2749 keer)

Java ArrayList
« Gepost op: 2010/03/08, 23:09:14 »
Iemand enig idee wat ik fout doe?
import java.io.File;
import java.util.ArrayList;
import java.util.Arrays;
import org.blinkenlights.jid3.MP3File;
import org.blinkenlights.jid3.MediaFile;

public class generateFileQueue
{
    static ArrayList<String> fileQueue;

    public generateFileQueue(File musicFolder)
    {
        fileQueue = new ArrayList(Arrays.asList(musicFolder.list()));
    }

    public void printQueue()
    {
        for (String file : fileQueue)
        {
            System.out.printf("%s\n", file);
        }
    }

    public void removeTagged(String musicFolder, String skipComment)
    {
        for(String file : fileQueue)
        {
            MediaFile fileToCheck = new MP3File(new File(musicFolder + file));

            try
            {
                if (fileToCheck.getID3V2Tag().getArtist().equals("3 Doors Down"))
                {
                    System.out.println(file);
                    fileQueue.remove(file);
                }
            } catch (org.blinkenlights.jid3.ID3Exception ex1)
            {
                System.out.printf("%s %s\n", "Error: ", ex1.getMessage());
            } catch (NullPointerException ex2)
            {
                System.out.printf("%s\n", "Comment Tag Needs To Be Created");
            }
        }
    }

    public int getFileQueueLength()
    {
        return fileQueue.size();
    }
}

De foutmelding is:
Exception in thread "main" java.util.ConcurrentModificationException
        at java.util.AbstractList$Itr.checkForComodification(AbstractList.java:372)
        at java.util.AbstractList$Itr.next(AbstractList.java:343)
        at generateFileQueue.removeTagged(generateFileQueue.java:26)
        at tagit.main(tagit.java:17)

Offline Rachid

  • Lid
    • rachidbm
    • Mijn blog
Re: Java ArrayList
« Reactie #1 Gepost op: 2010/03/09, 00:45:31 »
Dat is lastig te zien met alleen deze code. Maar aan de Exceptie (ConcurrentModificationException) te zien is het iets met threads. Volgens mij proberen meerdere threads tegelijk die methode uit te voeren.
Probeer die methode es synchronised te maken.

Je zou die methode static kunnen maken, maar ik weet niet of dat je probleem wel oplost.
Ben je ook blij dat Ubuntu zo toegankelijk en gratis is, en wil je graag net als ik iets terugdoen, kijk dan eens rond bij mwanzo, dé poort naar het bijdragen aan Ubuntu en haar gemeenschap!

Re: Java ArrayList
« Reactie #2 Gepost op: 2010/03/13, 12:22:45 »
Ok, heb het probleem opgelost.
Ik heb gebruik gemaakt van een Iterator om door de lijst te gaan in plaats van de for-lus.

Begrijp nog steeds het probleem niet, maarja zo werkt het ook.

import java.io.File;
import java.util.ArrayList;
import java.util.Iterator;
import org.blinkenlights.jid3.MP3File;

public class handleFileQueue
{
    private ArrayList<File> fileQueue;

    public handleFileQueue(File musicFolder)
    {
        fileQueue = new ArrayList();
        String[] fileArr = musicFolder.list();

        for (int i = 0; i < fileArr.length; i++)
        {
            fileQueue.add(new File(musicFolder + "/" + fileArr[i]));
        }
    }

    public void printQueue()
    {
        for (File file : fileQueue)
        {
            System.out.printf("%s\n", file);
        }
    }

    public void removeTagged(String skipComment)
    {
        Iterator<File> itr = fileQueue.iterator();

        while (itr.hasNext())
        {
            MP3File currentFile = new MP3File(itr.next());

            try
            {
                if (currentFile.getID3V2Tag().getComment().equalsIgnoreCase(skipComment))
                {
                    itr.remove();
                }
            } catch (org.blinkenlights.jid3.ID3Exception excp1)
            {
                System.out.printf("%s\n%s\n%s\n\n", "error reading MP3File", "error in handleFileQueue", excp1.getMessage());
            } catch (NullPointerException excp2)
            {
                System.out.printf("%s\n%s\n%s\n\n", "error: NullPointerException, no comment tag set", "error in handleFileQueue", excp2.getMessage());
            }
        }
    }

    public int getFileQueueLength()
    {
        return fileQueue.size();
    }

    public ArrayList<File> getFileQueue()
    {
        return fileQueue;
    }
}

Re: Java ArrayList
« Reactie #3 Gepost op: 2010/03/17, 13:56:34 »
Ben er uiteindelijk dan toch achter gekomen waarom het niet werkte.
De for each loop kan enkel gebruikt worden om de waarden van de lijst te lezen en niet om te schrijven.

for(item:lijst)
{
System.out.println(item);
}

wordt door de compiler vervangen door:

for(int i = 0; i < lijst.length; i++)
{
object tmp = lijst[i];
System.out.println(tmp);
}