كيفية التقاط استثناء Java بدون رادع/وقت التشغيل (على وجه التحديد SecurityException)
سؤال
لدي فئة 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 - وهو ما لم يتم القبض عليه بواسطة بند الصيد ، مما تسبب في إنهاء برنامجي.
هل يمكن لأي شخص أن يقترح كيف يمكنني التقاط هذا الاستثناء؟
شكرًا
المحلول 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;
}
يتم الآن التعامل مع أي مشاكل مع إعادة التوجيه والروابط الميتة وما إلى ذلك بأمان.
نصائح أخرى
يتم إلقاء الاستثناء من قبل المنشئ ، والذي لم يتم لفه في كتلة المحاولة.
new ImageIcon(new URL(imageUri))
استخدام ImageIcon لتحميل صورة هو Soooooo 1998. تريد imageio.read ().
إذا تم طرح الاستثناء بالفعل من GetImage () ، فيجب أن يمسكه الرمز. SecurityException هو استثناء. لقد أخطأت في مكان ما. على سبيل المثال ، ضع مُنشئ ImageIcon تحت المحاولة. إذا لم يساعد ذلك ، فحاول
catch( Throwable th )
إنها عادة سيئة. حاول على الأقل إعادة تقديمه (أو استثناء غلاف) بعد تسجيله.
هذا موضوع قديم - لكنني فكرت في إضافة إجابة بديلة منذ أن حصلت عليها بعد الوصول إلى نفس المشكلة وضرب هذا المنشور.
بما أنني لا أرغب في إضافة المزيد من التبعيات إلى تطبيقي (= javax) استخدمت الحل المقترح هنا للحصول على صورة نقطية ثم استخدمت setImageBitMap في هذه الحالة استثناء أمان اشتعلت