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
tritt eine
auf, welche aber nicht abgefangen werden kann.
Meine Vermutung: Die Exception wird bereits in
(oder woanders im Call-Stack) abgefangen und über
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
und
zu öffnen und anzuzeigen.
Beim Öffnen von
tritt dann in Zeile 98 die Exception auf und wird auf der Konsole ausgegeben.
Wenn ich versuche die ZipException abzufangen, schimpft der Java-Compiler:
Das abfangen einer allgemeinen Exception bringt auch nichts. Der entsprechende Code-Teil wird nicht betreten.
In der angehängten Datei
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
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
Code:
ZipException
Meine Vermutung: Die Exception wird bereits in
Code:
ImageIcon
Code:
printStackTrace()
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
Code:
c:\corrupt.png
Beim Öffnen von
Code:
c:\corrupt.png
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
In der angehängten Datei
Code:
Test.zip
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;
}
}