Nieuws:

We zijn er weer.

Na lange tijd van afwezigheid zijn we er weer  :laugh:
We hebben alle wachtwoorden gereset, je oude wachtwoord werkt niet meer.Je moet via het "wachtwoord vergeten"-linkje je wachtwoord resetten. Je krijgt hiervoor een mailtje op het adres dat je bij ons geregistreerd hebt.

De komende tijd zijn we nog druk bezig om de rest van de site op te bouwen, dus het kan zijn dat sommige onderdelen (tijdelijk) niet werken.

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

Auteur Topic: Java ArrayList  (gelezen 2548 keer)

Offline n3p3nthess

  • Lid
  • Steunpunt: Nee
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

  • Vertaalteam
    • rachidbm
    • Mijn blog
  • Steunpunt: Nee
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!

Offline n3p3nthess

  • Lid
  • Steunpunt: Nee
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;
    }
}

Offline n3p3nthess

  • Lid
  • Steunpunt: Nee
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);
}