سؤال

أرغب في التقاط خطأ وتجاهل و ArrayIndexOutofBoundSexception (إنه في الأساس ليس شيئًا أتحكم فيه ، لذلك أحتاج إلى برنامجي للاحتفاظ بالتشغيل).

ومع ذلك ، لا يبدو أن زوج المحاولة/الصيد يلتقط الاستثناء وتجاهله. نأمل أن تتمكن من اختيار ما أفعله خطأ.

يحدث الاستثناء في هذا الخط

content = extractor.getTextFrompage (page) ؛

ها هو رمزتي:

for(int page=1;page<=noPages;page++){
    try{
        System.out.println(page);           
        content = extractor.getTextFromPage(page);
        }
    }   
    catch (ArrayIndexOutOfBoundsException e){
    System.out.println("This page  can't be read");
    }    
}

استثناء في الموضوع "MAIN" java.lang.arrayIndexOutofBoundSexception: فهرس غير صالح: 02 في com.lowagie.text.pdf.cmapawaredocumentfont.decodesinglecid .lowagie.text.pdf.parser.pdfContentStreamProcessor.decode (مصدر غير معروف) في com.lowagie.text.pdf.parser.pdfcontentStreatser.displaypdfstring (مصدر غير معروف) (مصدر غير معروف) في com.lowagie.text.pdf.parser.pdfContentStreamProcessor.invokeOperator (مصدر غير معروف) في com.lowagie.text.pdf.parser.pdfcontentstreamprocessor.processcontent .pdftextextractor.gettextfrompage (مصدر غير معروف) في com.pdfextractor.main.extractor.main (extractor.java:64)

تعديل: لقد جربت/تمسك داخل الحلقة
وأضاف تتبع المكدس
وإزالة الفهرس = 1

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

المحلول

سؤال غبي ، ولكن هل ArrayIndExoutofBoundSexception التي وضعتها في الصيد من نفس الحزمة التي يتم إلقاؤها؟ أي Java.lang

أو ربما يصطاد رمي لمعرفة ما إذا كان هذا يعمل.

نصائح أخرى

من الممكن أن تكون الرمز الذي تتصل به يتعامل مع ArrayIndexOutOfBoundsException وطباعة تتبع المكدس من تلقاء نفسه دون إعادة تجويفه. إذا كان هذا هو الحال ، فلن ترى الخاص بك System.out.println اتصل.

تحرير: إذا كنت ترغب في الاستمرار PDFContentStreamProcessor#processContent سوف يصطاد ArrayIndexOutOfBoundsException ثم رمي مثيل لها com.lowagie.text.ExceptionConverter, ، وهي فئة فرعية من RuntimeException.

ربما هذا أمر غير عقلاني (بعد كل شيء ، أنا أركض في 3 ساعات من النوم في آخر 36 ساعة) ، ولكن على غرار ما ذكرته Digiarnie و Ankur: هل حاولت ببساطة catch (Exception e)?

إنه بالتأكيد ليس مثاليًا ، لأنه من الواضح أنه (جنبًا إلى جنب مع Throwable t اقتراح) سوف يلتقط كل استثناء تحت أشعة الشمس ، لا يقتصر على ArrayOutOfBoundsException. فقط فكرت في الفكرة هناك إذا لم تجربها بعد.

بدلاً من استخدام هذا الاستثناء ، يجب عليك إصلاح الرمز الخاص بك حتى لا تتجاوز حدود الصفيف!

تحسب معظم المصفوفات من 0 إلى Array.Length-1

إذا قمت باستبدال حلقةك بهذا ، فيمكنك أن يتجنب هذا المشكلة بأكملها:

for (int page = 0;page < noPages;page++){

تحتاج إلى محاولة/التقاط داخل Forloop. تنبثق التحكم في Try Catch ، وحرائق الصيد ، ويستأنف السيطرة بعد ذلك ، ولكن تم بالفعل إنهاء Forloop.

    for(int page=1;page<=noPages;page++)
    {
        try
        {
            content = extractor.getTextFromPage(page); 
            System.out.println(content);
        }
        catch (ArrayIndexOutOfBoundsException e)
        {
            System.out.println("This page can't be read");
        }
    }

ربما هذا سؤال سخيف ... هل أنت متأكد من أن الاستثناء يتم طرحه في الكود الذي نشرته وليس بطريقة مختلفة؟

كان يجب أن يكون البرنامج يعمل. يجب أن تعطي المزيد من التفاصيل بما في ذلك اسم الفصل الخاص بك. يمكنك المحاولة عن طريق التقاط استثناء أو وضع كتلة أخيرًا مع بعض SOP فيه.

هذا غريب - لقد ألقيت نظرة على مصدر Itext بالطريقة التي يتم إلقاؤها من (cmapawaredocumentfont.decodesinglecid) ويبدو أن هذا: هذا:

 private String decodeSingleCID(byte[] bytes, int offset, int len){
        if (toUnicodeCmap != null){
            if (offset + len > bytes.length)
                throw new ArrayIndexOutOfBoundsException("Invalid index: " + offset + len);
            return toUnicodeCmap.lookup(bytes, offset, len);
        }

        if (len == 1){
            return new String(cidbyte2uni, 0xff & bytes[offset], 1);
        }

        throw new Error("Multi-byte glyphs not implemented yet");
    }

ArrayIndExOutofBoundSexception الذي يلقيه هو Java القياسي. لا يمكنني رؤية أي سبب من الأسباب التي لا تعمل تجربتك الأصلية.

ربما يجب عليك نشر الفصل بأكمله؟ أيضًا ، ما هو إصدار Itext الذي تستخدمه؟

انتظر لحظة! أنت تفتقد بعض الأقواس هناك :) بيان الصيد الخاص بك خارج بيانك! تمتلك هذا:

for(int page=1;page<=noPages;page++){
    try{
        System.out.println(page);               
        content = extractor.getTextFromPage(page);
        }
    }   
    catch (ArrayIndexOutOfBoundsException e){
    System.out.println("This page  can't be read");
    }    
}

يجب أن يكون:

for(int page=1;page<=noPages;page++) {
    try{
        System.out.println(page);               
        content = extractor.getTextFromPage(page);
    }
    catch (ArrayIndexOutOfBoundsException e){
        System.out.println("This page  can't be read");
    } 
} //end for loop  

}//This closes your method or whatever is enclosing the for loop
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top