سؤال

أنا الحصول على NPE أثناء محاولة قراءة في ملف صورة ولا أستطيع لحياة لي معرفة السبب.هنا هو بلدي خط:

BufferedImage source = ImageIO.read(new File(imgPath));

imgPath هو في الأساس ضمان أن تكون صالحة قبل أن يحصل هنا هو نسخ الملف من الملقم.عندما يضرب هذا الخط ، أحصل على هذا تتبع المكدس:

Exception in thread "Thread-26" java.lang.NullPointerException
    at com.ctreber.aclib.image.ico.ICOReader.getICOEntry(ICOReader.java:120)
    at com.ctreber.aclib.image.ico.ICOReader.read(ICOReader.java:89)
    at javax.imageio.ImageIO.read(ImageIO.java:1400)
    at javax.imageio.ImageIO.read(ImageIO.java:1286)
    at PrintServer.resizeImage(PrintServer.java:981)    <---My function
    <Stack of rest of my application here>

أيضا, هذا هو القيت في إطار الإخراج:

لا يمكن إنشاء ICOFile:لا يمكن قراءة بايت:2

ليس لدي أي فكرة عما يجري ، خاصة وأن الملف منشئ هو النجاح.أنا لا يمكن أن يبدو للعثور على أي شخص لديه مشكلة مماثلة.أي شخص لديك أي أفكار ؟ (جافا 5 إذا كان ذلك يجعل من أي اختلاف)

هل كانت مفيدة؟

المحلول

أنا مطعون حول بعض أكثر و وجدت أنه يمكنك تحديد ImageReader ImageIO استخدام وقراءتها في هذا الطريق.أنا مطعون حول codebase وجدت أن لدينا بالفعل وظيفة في مكان فعل بالضبط ما كنت تحاول إنجاز هنا.مجرد عن أي شخص آخر يعمل في موضوع مشابه هنا هو جوهر رمز (بعض الهراء هو محدد أعلاه, ولكن هذا من شأنه أن يساعد أي شخص يحاول القيام بذلك):

File imageFile = new File(filename);
Iterator<ImageReader> imageReaders = ImageIO.getImageReadersByFormatName("jpeg");
if ( imageReaders.hasNext() ) {
    imageReader = (ImageReader)imageReaders.next();
    stream = ImageIO.createImageInputStream(imageFile);
    imageReader.setInput(stream, true);
    ImageReadParam param = imageReader.getDefaultReadParam();
    curImage = imageReader.read(0, param);
}

شكرا على الاقتراحات والمساعدة في كل شيء.

نصائح أخرى

الملف منشئ يكاد يكون من المؤكد سوف تنجح ، بغض النظر عما إذا كان يشير إلى صالح/القائمة ملف.على الأقل كنت تحقق ما إذا كان الملف المصدر موجود عبر exists() الأسلوب.

نلاحظ أيضا أن ImageIO.read غير مؤشر الترابط-الآمن (ذلك إعادة استعمال مؤقتا ImageReaders التي لا مؤشر الترابط-الآمن).

هذا يعني أنك لا يمكن بسهولة قراءة ملفات متعددة في نفس الوقت.للقيام بذلك سيكون لديك للتعامل مع ImageReaders نفسك.

هل تعتبر أن الملف ببساطة قد تكون تالفة أو أن ImageIO تحاول أن تقرأ على أنها نوع خاطئ من الملف ؟

أبحث عن ICOReader الدرجة النتائج في ضربة واحدة: IconsFactory من جيدي-المشتركة.
على ما يبدو كان لديهم نفس المشكلة:

// Using ImageIO approach results in exception like this.
//    Exception in thread "main" java.lang.NullPointerException
//            at com.ctreber.aclib.image.ico.ICOReader.getICOEntry(ICOReader.java:120)
//            at com.ctreber.aclib.image.ico.ICOReader.read(ICOReader.java:89)
//            at javax.imageio.ImageIO.read(ImageIO.java:1400)
//            at javax.imageio.ImageIO.read(ImageIO.java:1322)
//            at com.jidesoft.icons.IconsFactory.b(Unknown Source)
//            at com.jidesoft.icons.IconsFactory.a(Unknown Source)
//            at com.jidesoft.icons.IconsFactory.getImageIcon(Unknown Source)
//            at com.jidesoft.plaf.vsnet.VsnetMetalUtils.initComponentDefaults(Unknown Source)

//    private static ImageIcon createImageIconWithException(final Class<?> baseClass, final String file) throws IOException {
//        try {
//            InputStream resource =
//                    baseClass.getResourceAsStream(file);
//            if (resource == null) {
//                throw new IOException("File " + file + " not found");
//            }
//            BufferedInputStream in =
//                    new BufferedInputStream(resource);
//            return new ImageIcon(ImageIO.read(in));
//        }
//        catch (IOException ioe) {
//            throw ioe;
//        }
//    }

ماذا فعلوا بدلا من ذلك ؟

private static ImageIcon createImageIconWithException(
        final Class<?> baseClass, final String file)
        throws IOException {
    InputStream resource = baseClass.getResourceAsStream(file);

    final byte[][] buffer = new byte[1][];
    try {
        if (resource == null) {
            throw new IOException("File " + file + " not found");
        }
        BufferedInputStream in = new BufferedInputStream(resource);
        ByteArrayOutputStream out = new ByteArrayOutputStream(1024);

        buffer[0] = new byte[1024];
        int n;
        while ((n = in.read(buffer[0])) > 0) {

            out.write(buffer[0], 0, n);
        }
        in.close();
        out.flush();
        buffer[0] = out.toByteArray();
    } catch (IOException ioe) {
        throw ioe;
    }

    if (buffer[0] == null) {
        throw new IOException(baseClass.getName() + "/" + file
                + " not found.");
    }
    if (buffer[0].length == 0) {
        throw new IOException("Warning: " + file
                + " is zero-length");
    }

    return new ImageIcon(Toolkit.getDefaultToolkit().createImage(
            buffer[0]));
}

لذلك قد ترغب في محاولة على نفس النهج:قراءة الخام بايت و استخدام Toolkit لخلق صورة منها.

"إنه jpeg ولكن لا jpeg التمديد".

قد يكون ذلك.

يبدو أن مكتبة AC.lib-ICO هو رمي NPE.منذ هذه المكتبة هو المقصود من قراءة Microsoft ICO تنسيق ملف JPEG قد يكون هناك مشكلة في ذلك.

النظر أن ينص صراحة شكل باستخدام طريقة بديلة.

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