Javaの未チェック/ランタイム例外(特にSecurityException)をキャッチする方法
質問
Webサイトから画像を取得するメソッドを備えたJavaクラスがあります。
private Image image;
private int height;
private int width;
private String imageUri;
public Image getImage() {
if (image == null) {
log.info("Fetching image: " + imageUri);
try {
URL iURL = new URL(imageUri);
ImageIcon ii = new ImageIcon(iURL);
image = ii.getImage();
height = image.getHeight(null);
width = image.getWidth(null);
} catch (SecurityException e) {
log.error("Unable to fetch image: " + imageUri,e);
} catch (MalformedURLException e) {
log.error("Unable to fetch image: " + imageUri,e);
}
}
return image;
}
問題は、取得しようとした imageUri が時々リダイレクトされ、ImageIcon コンストラクターが java.lang.SecurityException をスローすることです。これは catch 句でキャッチされず、プログラムが終了します。
この例外をキャッチする方法を誰かが提案できますか?
ありがとう
解決 4
によりイメージアイコンが非常に古い学校であること、そして(私はしたくない)新しいスレッドを生成し、私の解決策はあります:
public Image getImage() {
if (image == null) {
log.info("Fetching image: " + imageUri);
try {
URL iURL = new URL(imageUri);
InputStream is = new BufferedInputStream(iURL.openStream());
image = ImageIO.read(is);
height = image.getHeight();
width = image.getWidth();
} catch (MalformedURLException e) {
log.error("Unable to fetch image: " + imageUri, e);
} catch (IOException e) {
log.error("Unable to fetch image: " + imageUri, e);
}
}
return image;
}
などのリダイレクト、死者のリンクを持つすべての問題は現在正常に処理されます。
他のヒント
例外はtryブロックでラップされていないコンストラクタによってスローされます。
new ImageIcon(new URL(imageUri))
ImageIcon を使用して画像をロードするのは、1998 年です。あなたが欲しいのは ImageIO.read().
例外が実際のgetImage(から投げた場合)、あなたのコードは、それをキャッチする必要があります。 SecurityExceptionが例外です。あなたはどこか、それは間違っているんです。例えば、トライの下にイメージアイコンのコンストラクタを置きます。それが解決しない場合は、してみてください。
catch( Throwable th )
これは、しかし悪い癖です。少なくともそれをログインした後に再スローそれ(またはラッパー例外)にしてみます。
これは古いスレッドですが、同じ問題に到達してこの投稿にアクセスした後に得たので、別の回答を追加することを考えました。
アプリ(= javax)に依存関係を追加したくないので、 ここで提案される解決策 ビットマップを取得してから使用しました setImageBitmap この場合、 セキュリティ例外 捕まった