IllegalArgumentException

MiMa

Top Contributor
Guten Abend,
den ganzen Tags fleissig am proggen und der Code verändert sich ständig.
Seit Stunden versuche ich zu ergründen warum ein IllegalArgumentException geworfen wird. Allerdings habe ich bisher noch nie etwas davon gehört?!?
Code:
Exception in thread "main" java.lang.IllegalArgumentException
    at sun.nio.ch.FileChannelImpl.position(FileChannelImpl.java:278)
    at sun.nio.ch.FileChannelImpl.position(FileChannelImpl.java:50)
    at com.mpatric.mp3agic.Mp3File.initId3v1Tag(Mp3File.java:273)
    at com.mpatric.mp3agic.Mp3File.init(Mp3File.java:94)
    at com.mpatric.mp3agic.Mp3File.<init>(Mp3File.java:71)
    at com.mpatric.mp3agic.Mp3File.<init>(Mp3File.java:62)
    at soundstation.SoundStation.main(SoundStation.java:88)
Die Bibliothek mp3agic arbeitete bisher einwandfrei und ohne Probleme.
Als ich die main etwas umstrukturiert habe war es dann vorbei mit der Lauffähigkeit?
Der Code sieht wie folgt aus:
Java:
// *** Dateiliste verarbeiten ***
        for (File datei : listeDatei) {
            LOG.info("Verarbeitung der MP3 Audiodatei - beginnt " + datei);
     
            //*** MP3 Daten durch mp3agic ermitteln
            Mp3File mp3datei = new Mp3File(datei);
     
            LOG.info("MP3 ID Tag Standard    " + (mp3datei.hasCustomTag() ? "JA" : "Nein"));
            LOG.info("MP3 ID Tag Version 3v1 " + (mp3datei.hasId3v1Tag() ? "JA" : "Nein"));
            LOG.info("MP3 ID Tag Version 3v2 " + (mp3datei.hasId3v2Tag() ? "JA" : "Nein"));
     
            if (mp3datei.hasId3v1Tag() == true || mp3datei.hasId3v2Tag() == true) {
                // Die Datei enthält Metadaten
                listeID3 = SoundParser.sucheMP3Tags(datei.getAbsoluteFile(), mp3datei);
                LOG.info("Ausgabe gefundenen ID3-TAGs");
                SoundParser.ausgebenIdTags(listeID3);

                // Prüfung auf Eintrag Album
                albumAblage = SoundParser.pruefungEintragAlbum(listeID3, listeZusammenstellungen, listeFilmmusik);
                LOG.info("Das Ablageverzeichnis ist : " + albumAblage);

                // Ablagevariablen
                File quellDatei = new File(datei.getAbsolutePath());
                File zielDatei = new File(zielVerzeichnis + "\\" + datei.getName());

                SoundParser.ablageAudioDatei(quellDatei, zielVerzeichnis, listeID3, endung, mitLeerzeichen, albumAblage);
                LOG.info("Verarbeitung der MP3 Audiodatei - beendet " + datei);
         
            } else if (mp3datei.hasId3v1Tag() == false && mp3datei.hasId3v2Tag() == false) {
                LOG.error("In der Audiodatei wurden keine Metadaten gefunden.");

                // Ablagevariablen
                File quellDatei = new File(datei.getAbsolutePath());
                File zielDatei = new File(zielVerzeichnis + "\\" + datei.getName());
            } // listeDatei for-Schleife
Das Programm arbeitet bis zur Zeile korrekt
Java:
LOG.info("Verarbeitung der MP3 Audiodatei - beginnt " + datei);
Danach wird ein mp3datei Objekt erstellt um zu prüfen ob die Datei Metadaten enthält.
Entsprechend wird dann verzweigt.
Die weiteren LOG.info werden nicht mal verarbeitet.
Ich weiss das es an der Zeile
Java:
 Mp3File mp3datei = new Mp3File(datei);
Der Fehler tritt auf, wenn die Datei keine Metadaten enthält. Also kein Title, Interpreter usw.
Bei Dateien die Metadaten besitzen, funktioniert das Programm weiterhin.
Das muss wohl der Ausnahmefall sein wenn keinerlei Metadaten vorliegen.
Aber sollte dann nicht doch ein mp3datei Objekt zu erstellen sein um dann mit hasID3... abfragen zu können ob Metadaten drin sind oder nicht?
Danke
Mi.
 
Zuletzt bearbeitet:

Tobse

Top Contributor
Das muss wohl der Ausnahmefall sein wenn keinerlei Metadaten vorliegen.
Aber sollte dann nicht doch ein mp3datei Objekt zu erstellen sein um dann mit hasID3... abfragen zu können ob Metadaten drin sind oder nicht?

Du hast Recht damit, dass es eigentlich nach dem Erstellen des Objekts eine Möglichkeit geben muss, zu prüfen, ob Metainformationen drin waren.
Den Fehler, den du bekommst, Ist aber kein Ausnahmefall. Es ist ein Bug in der Library. Ein Ausnahmefall müsste ja so etwas sein wie "NoMetatagsFoundExcpetion" o.ä..

P.S.: wenn du den Quellcode zur Library hast, kannst du einfach Mal in den Javadoc zu sun.nio.ch.FileChannelImpl.position sehen. Dort steht 100%ig drin, unter welchen Umständen diese Methode eine NPE wirft. Dann kannst du in Mp3File.java auf Zeile 273 sehen, wie die FileChannel.position aufgerufen wird, vllt sogar einen Breakpoint setzen um die Variablen-Werte zu sehen. Dadurch kannst du rausfinden, ob du eine Möglichkeit für einen Workaround hast.

In jedem Fall solltest du eine bessere Library nutzen.
 

MiMa

Top Contributor
Danke für die Info.
Eigentlich komme ich mit der Library gut zurecht und ist für mich auch Schlüssig.
Bei externen Librarys ist immer das Problem das diese dann kaum aktualisiert werden.
Bei dieser war der letzte Commit am 14 Oktober 2017. Also schon aktueller.
Der Bug ist zwar unerfreulich, aber haben die nicht alle irgendwo ein problem?
Der Quellcode liegt auf GIT. https://github.com/mpatric/mp3agic
Allerdings bin ich nicht der Profi Programmierer der sich in Bibliotheken auskennt. Ich fange auch erst gerade an eigene Bibliotheken zu entwickeln um Klassen und Methoden immer wieder verwenden zu können.

Wenn Du eine bessere Library kennst, dann poste doch mal bitte den link.
Danke
Mi
 

Tobse

Top Contributor
Ich habe leider keine Erfahrung mit Java + MP3. So ein Fehler deutet IMHO aber darauf hin, dass die Autoren die Library nicht ernsthaft testen und/oder sich nicht um edge-cases sorgen. Daher meine Empfehlung, zu wechseln.

Wenn das aber die beste Library in dem Umfeld ist, musst du wohl mit dem Bug Leben. Wenn im Oktober 17 das letzte Mal committed wurde hast aber IMO aber auch eine gute Chance, dass sie den Bug fixen. Erstellt ihnen einfach Mal ein Issue dazu auf GitHub.
 

Ähnliche Java Themen

Neue Themen


Oben