ImageIcon: ZipException bei ungültiger PNG-Datei

Joe77

Neues Mitglied
Hallo,

ich habe ein Programm, welches PNG-Bilder von verschiedenen URLs runterlädt.
Wird das Bild gefunden, wird es gespeichert ansonsten wird die nächste URL probiert.
Das funktioniert auch problemlos.

Manchmal kommt es aber vor, dass das Bild bei einer URL zwar gefunden wird, aber eigentlich keine gültige PNG-Datei ist (weil jemand dort eine ungültige Datei zur Verfügung gestellt hat).

Beim Laden einer ungültigen Datei in ein
Code:
ImageIcon
tritt eine
Code:
ZipException
auf, welche aber nicht abgefangen werden kann.
Meine Vermutung: Die Exception wird bereits in
Code:
ImageIcon
(oder woanders im Call-Stack) abgefangen und über
Code:
printStackTrace()
ausgegeben.

Alles was ich will ist, auf eine ungültige Datei reagieren zu können und ggf. mit der nächsten URL weitermachen.

Mit dem folgenden Test-Programm kann das ganze getestet werden. Auf einen Button-Druck hin versucht es die Dateien
Code:
c:\valid.png
und
Code:
c:\corrupt.png
zu öffnen und anzuzeigen.
Beim Öffnen von
Code:
c:\corrupt.png
tritt dann in Zeile 98 die Exception auf und wird auf der Konsole ausgegeben.
Wenn ich versuche die ZipException abzufangen, schimpft der Java-Compiler:
Code:
exception java.util.zip.ZipException is never thrown in body of corresponding try statement
Das abfangen einer allgemeinen Exception bringt auch nichts. Der entsprechende Code-Teil wird nicht betreten.

In der angehängten Datei
Code:
Test.zip
die beiden PNG-Bilder, die JAVA-Datei und eine JAR-Datei enthalten.

Noch mal meine Frage: wie kann ich auf diese Exception reagieren bzw. wie kann ich sonst überprüfen, ob die PNG-Datei gültig ist.

Schon mal Danke im voraus
Joe

Java:
import java.awt.Color;
import java.awt.Dimension;
import java.awt.FlowLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.io.File;
import java.net.MalformedURLException;
import java.util.zip.ZipException;

import javax.swing.BoxLayout;
import javax.swing.ImageIcon;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JTextArea;
import javax.swing.border.LineBorder;

public class Test extends JFrame {

	private JLabel validImage;
	private JLabel corruptImage;
	private JTextArea error;

	public static void main(String[] args) {
		new Test();
	}

	public Test() {
		super();
		this.setDefaultCloseOperation(EXIT_ON_CLOSE);
		this.setSize(400, 500);
		this.setTitle("Test");

		JPanel pnImages = new JPanel(new FlowLayout());
		validImage = new JLabel();
		validImage.setBorder(new LineBorder(Color.BLACK));
		validImage.setPreferredSize(new Dimension(170, 235));
		corruptImage = new JLabel();
		corruptImage.setBorder(new LineBorder(Color.BLACK));
		corruptImage.setPreferredSize(new Dimension(170, 235));
		pnImages.add(validImage);
		pnImages.add(corruptImage);

		JPanel pnButton = new JPanel(new FlowLayout());
		JButton button = new JButton("Load images");
		button.addActionListener(new ActionListener() {
			public void actionPerformed(ActionEvent ev) {
				loadImages();
			}
		});
		pnButton.add(button);

		JPanel pnError = new JPanel(new FlowLayout());
		error = new JTextArea();
		error.setPreferredSize(new Dimension(350, 100));
		error.setBorder(new LineBorder(Color.BLACK));
		error.setFocusable(false);
		pnError.add(error);

		JPanel panel = new JPanel();
		panel.setLayout(new BoxLayout(panel, BoxLayout.Y_AXIS));
		panel.add(pnImages);
		panel.add(pnButton);
		panel.add(pnError);

		this.setContentPane(panel);

		this.setVisible(true);
	}

	private void loadImages() {
		validImage.setIcon(loadImage("c:\\valid.png"));
		corruptImage.setIcon(loadImage("c:\\corrupt.png"));
	}

	private ImageIcon loadImage(String filename) {
		File file = new File(filename);
		ImageIcon icon = null;

		if (file.exists()) {
			try {
				// With corrupt.png the next statement prints out:
				// java.util.zip.ZipException: incorrect header check
				// at
				// java.util.zip.InflaterInputStream.read(InflaterInputStream.java:164)
				// at
				// java.io.BufferedInputStream.fill(BufferedInputStream.java:235)
				// at
				// java.io.BufferedInputStream.read(BufferedInputStream.java:254)
				// at
				// sun.awt.image.PNGImageDecoder.produceImage(PNGImageDecoder.java:362)
				// at
				// sun.awt.image.InputStreamImageSource.doFetch(InputStreamImageSource.java:264)
				// at
				// sun.awt.image.ImageFetcher.fetchloop(ImageFetcher.java:189)
				// at sun.awt.image.ImageFetcher.run(ImageFetcher.java:153)
				icon = new ImageIcon(file.toURI().toURL());
			} catch (MalformedURLException e) {
				error.setText(error.getText() + "\n"
						+ "MalformedURLException!!!");
			} catch (Exception e) {
				error.setText(error.getText() + "\n" + "Exception!!!");
			}
			// Can't catch ZipException because compiler says: exception
			// java.util.zip.ZipException is never thrown in body of
			// corresponding try statement
			// } catch (ZipException e) {
			// System.out.println("ZipException!!!");
		} else {
			error.setText(error.getText() + "\n" + "File not found: "
					+ filename);
		}

		return icon;
	}
}
 
S

SlaterB

Gast
du kannst da genauso gut reagieren wie wenn die Bank während einer Online.Überweisung Geld von deinem Konto abzieht, nämlich gar nicht,
eine Methode hat ein Interface mit Parametern, Rückgabewert und wirft die Exceptions oder nicht,
was im innereren passiert kannst du nicht beeinflussen,

von Überschreiben der Klasse abgesehen, dazu detailliert den Quellcode anschauen, die Fehlerstelle finden und soweit möglich eine eigene Klasse verwenden mit geänderten Ablauf oder die Java-API verändern..

---

wenn du direkt an der Datei erkennen kannst, ob sie korrekt oder korrupt ist, dann das vorher selber testen

-----

was kommt eigentlich letztlich an deinen Aufrufer zurück, null-Wert oder eine andere RuntimeException?
 
Zuletzt bearbeitet von einem Moderator:

Joe77

Neues Mitglied
von Überschreiben der Klasse abgesehen, dazu detailliert den Quellcode anschauen, die Fehlerstelle finden und soweit möglich eine eigene Klasse verwenden mit geänderten Ablauf oder die Java-API verändern..
Nachdem die Exception in
Code:
InflaterInputStream.read
auftritt hab ich mal probiert selber diesen Stream aufzumachen:
Java:
try
{
  fstream = new FileInputStream(file);
  inflater = new InflaterInputStream(fstream);
  byte[] bytes = new byte[64000];
  // FIXME Always throws ZipException, also on valid images.
  inflater.read(bytes);
  result = true;
}
catch (Exception e)
{
  result = false;
}
Ich kann dann tatsächlich die Exception abfagen, allerdings trat sie auch beim gültigen Bild auf. D.h. für mich, bei gültigen Bildern kommt er bei der Original-Java-Klasse eigentlich gar nicht zum InflaterInputStream.

Wenn ich mir den Call-Stack bei der Exception so anschaue, müsste ich eigentlich dann folgende Klassen überschreiben:
  • ImageIcion
  • ImageFetcher
  • InputStreamImageSource
  • PNGImageDecoder
  • BufferedInputStream
  • InflaterInputStream
----------------------------------
wenn du direkt an der Datei erkennen kannst, ob sie korrekt oder korrupt ist, dann das vorher selber testen
Das weiß ich leider nicht wie ich das machen soll.
----------------------------------
was kommt eigentlich letztlich an deinen Aufrufer zurück, null-Wert oder eine andere RuntimeException?
Das erstellte ImageIcon ist dann seltsamerweise eigentlich ok. Ich die Width, Height und Description auslesen und die Werte sind richtig. Andere Properties (falls überhaupt vorhanden) hab ich noch abgefragt. Es wird aber nichts angezeigt.
Von dem her kann ich auf Grund des ImageIcon nicht unterscheiden, ob das Bild gültig ist oder nicht.
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
B ImageIcon auf JPanel austauschen AWT, Swing, JavaFX & SWT 3
C Swing ImageIcon erstellen, skalieren und verwenden AWT, Swing, JavaFX & SWT 3
N imageIcon zeigt kein Bild an AWT, Swing, JavaFX & SWT 5
P Swing Mehrere JLabels mit ImageIcon in JPanel lesen AWT, Swing, JavaFX & SWT 1
F JLabel mit ImageIcon per Button bewegen AWT, Swing, JavaFX & SWT 4
CptK Swing Button: ImageIcon unter den Text AWT, Swing, JavaFX & SWT 4
cool_brivk24 Swing ImageIcon lädt kein Bild AWT, Swing, JavaFX & SWT 12
P Kein Bild wird angezeigt bei ImageIcon AWT, Swing, JavaFX & SWT 16
S Bild mit ImageIcon auf GUI verkleinern AWT, Swing, JavaFX & SWT 3
K Swing JTable mit ImageIcon und Text in einer Zelle AWT, Swing, JavaFX & SWT 1
L ImageIcon auf JPanel wird nicht angezeigt(keiner Fehlermeldung) AWT, Swing, JavaFX & SWT 11
stylegangsta JButton Fehelr javax.swing.ImageIcon.<init>(Unknown Source) AWT, Swing, JavaFX & SWT 24
L JButton mit ImageIcon/Fehlermeldung AWT, Swing, JavaFX & SWT 1
Tausendsassa ImageIcon?! Hilfe! AWT, Swing, JavaFX & SWT 10
S JLabel mit ImageIcon, komischer Rahmen? AWT, Swing, JavaFX & SWT 2
O ImageIcon lädt nicht AWT, Swing, JavaFX & SWT 2
kaoZ Swing JToolBar, ImageIcon werden teilweise verdeckt AWT, Swing, JavaFX & SWT 0
R ImageIcon - Über Socket AWT, Swing, JavaFX & SWT 1
P ImageIcon lade schlägt fehl AWT, Swing, JavaFX & SWT 5
B Repaint auf JFrame, JLabel und ImageIcon AWT, Swing, JavaFX & SWT 4
S JLabel zeigt ImageIcon nicht AWT, Swing, JavaFX & SWT 13
B ImageIcon - Probleme mit dem Dateipfad AWT, Swing, JavaFX & SWT 5
C Swing ImageIcon mit Bild aus Temp-Verzeichniss füllen AWT, Swing, JavaFX & SWT 15
P ImageIcon auf Rectangle AWT, Swing, JavaFX & SWT 3
C ImageIcon eines Labels auf einem Panel in neuem Fenster anzeigen AWT, Swing, JavaFX & SWT 2
A Swing ImageIcon hover AWT, Swing, JavaFX & SWT 9
M ImageIcon Bild wird beim verkleinern des Fensters nicht verkleinert AWT, Swing, JavaFX & SWT 3
B Swing ImageIcon Resizing AWT, Swing, JavaFX & SWT 15
S ImageIcon von Label entfernen AWT, Swing, JavaFX & SWT 9
B Warten bis neues ImageIcon zugewiesen ist AWT, Swing, JavaFX & SWT 3
Zettelkasten imageIcon-Rand wegmachen AWT, Swing, JavaFX & SWT 5
S Abspeichern aus einem ImageIcon ins korrekte Format AWT, Swing, JavaFX & SWT 2
S ImageIcon Grösse anpassen AWT, Swing, JavaFX & SWT 2
J Geladene Grafik in ImageIcon auf Panel fest positionern. AWT, Swing, JavaFX & SWT 8
badfish Swing ImageIcon auf JLabel, Fenster Maximieren verbieten und Icon oben links austauschen? AWT, Swing, JavaFX & SWT 5
B Problem mit imageIO und ImageIcon AWT, Swing, JavaFX & SWT 5
M Swing ImageIcon über JFileChooser einbinden AWT, Swing, JavaFX & SWT 4
C Swing JComboBox - Problem bei Darstellen von ImageIcon AWT, Swing, JavaFX & SWT 4
G ImageIcon viel zu groß AWT, Swing, JavaFX & SWT 2
G IMageIcon Bildgröße ändern AWT, Swing, JavaFX & SWT 7
isowiz Leeres ImageIcon einer bes timmten Größe erzeugen AWT, Swing, JavaFX & SWT 2
W ImageIcon im JLabel mit autosize? AWT, Swing, JavaFX & SWT 3
B ImageIcon JFrame AWT, Swing, JavaFX & SWT 3
M ImageIcon auf AbstractButton links-/rechtbündig AWT, Swing, JavaFX & SWT 2
D jButton mit ImageIcon & MouseListener AWT, Swing, JavaFX & SWT 5
M ImageIcon in JLabel verkleinern AWT, Swing, JavaFX & SWT 8
S n-e-w JLabel(n-e-w ImageIcon(i)) funkt. nicht im JScrollPane AWT, Swing, JavaFX & SWT 2
M Problem, an ImageIcon in JPanels zu kommen. AWT, Swing, JavaFX & SWT 2
J Bildfilterung und Ausgabe in ein ImageIcon AWT, Swing, JavaFX & SWT 2
X ImageIcon für JButton AWT, Swing, JavaFX & SWT 4
X JButton "effect" für ImageIcon AWT, Swing, JavaFX & SWT 6
F ImageIcon -> BufferedImage AWT, Swing, JavaFX & SWT 2
T ImageIcon als Seperator im Jmenu AWT, Swing, JavaFX & SWT 8
G JLabel und ImageIcon AWT, Swing, JavaFX & SWT 16
padde479 ImageIcon laden AWT, Swing, JavaFX & SWT 6
L Anzeigen von fotos: ImageIcon oder BufferedImage + paint() ? AWT, Swing, JavaFX & SWT 5
J ImageIcon, Image - 100% CPU Auslastung . AWT, Swing, JavaFX & SWT 3
B imageicon relativer Pfad AWT, Swing, JavaFX & SWT 5
F ImageIcon Größe ändern AWT, Swing, JavaFX & SWT 29
M ImageIcon / .paintIcon() AWT, Swing, JavaFX & SWT 2
M Problem mit ImageIcon in einer JTable AWT, Swing, JavaFX & SWT 2
D JButton einen neuen ImageIcon setzen? AWT, Swing, JavaFX & SWT 2
R resize ImageIcon AWT, Swing, JavaFX & SWT 7
B Problem mit ImageIcon/Swing in Linux AWT, Swing, JavaFX & SWT 6
K ImageIcon fehler ? AWT, Swing, JavaFX & SWT 4
M ImageIcon laden? AWT, Swing, JavaFX & SWT 2
G JTree - ungültiger selection update AWT, Swing, JavaFX & SWT 2

Ähnliche Java Themen

Neue Themen


Oben