كيفية التقاط استثناء Java بدون رادع/وقت التشغيل (على وجه التحديد SecurityException)

StackOverflow https://stackoverflow.com/questions/1548045

سؤال

لدي فئة 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 في هذه الحالة استثناء أمان اشتعلت

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top