【问题标题】:ArrayIndexOutOfBoundsException not being caught and ignoredArrayIndexOutOfBoundsException 未被捕获和忽略
【发布时间】:2010-12-17 17:55:43
【问题描述】:

我想捕获并忽略 ArrayIndexOutOfBoundsException 错误(基本上它不是我可以控制的,所以我需要我的程序继续运行)。

但是我的 try/catch 对似乎没有捕捉到异常并忽略它。希望你能找出我做错了什么。

异常发生在这一行

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");
    }    
}

线程“主”java.lang.ArrayIndexOutOfBoundsException 中的异常:无效索引:02 在 com.lowagie.text.pdf.CMapAwareDocumentFont.decodeSingleCID(未知来源) 在 com.lowagie.text.pdf.CMapAwareDocumentFont.decode(未知来源) 在 com.lowagie.text.pdf.parser.PdfContentStreamProcessor.decode(未知来源) 在 com.lowagie.text.pdf.parser.PdfContentStreamProcessor.displayPdfString(未知来源) 在 com.lowagie.text.pdf.parser.PdfContentStreamProcessor$ShowText.invoke(未知来源) 在 com.lowagie.text.pdf.parser.PdfContentStreamProcessor.invokeOperator(未知来源) 在 com.lowagie.text.pdf.parser.PdfContentStreamProcessor.processContent(未知来源) 在 com.lowagie.text.pdf.parser.PdfTextExtractor.getTextFromPage(未知来源) 在 com.pdfextractor.main.Extractor.main(Extractor.java:64)

编辑:我已将 try/catch 放在 for 循环中
并添加了堆栈跟踪
并删除了 index=1

【问题讨论】:

  • 顺便说一句,'int index = 1' 行在这种情况下完全没用,除非您在 try 块中省略了代码以用于发布目的
  • 是的没错,我省略了处理但忘记了index=1,现在将其删除
  • 循环内只有try,catch语句在外
  • 那是关于 iText 并试图找出导致异常的原因。这是关于我们如何忽略无法解决的异常。

标签: java exception-handling indexoutofboundsexception


【解决方案1】:

您需要将 try/catch 放在 forloop 中。控制弹出到try catch,catch触发,之后恢复控制,但是forloop已经终止了。

【讨论】:

  • 谢谢,但我仍然遇到问题。最初我将它放在 for 循环中。
【解决方案2】:

您应该修复代码,而不是使用此异常,以免超出数组边界!

大多数数组的计数从 0 到 array.length-1

如果你用这个替换你的 for 循环,你可能会避免整个问题:

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

【讨论】:

  • 导致问题的代码不是我自己的,并且页码对应于真实的页码,因此不能任意更改 - 简而言之,我没有导致异常,但我需要处理/忽略 eit
  • 但是你知道是什么页码导致了异常吗? 99% 的时间你应该在遍历数组时使用小于 (
  • 是的,试过了,导致问题的页码是page=31,文档共有39页。所以简而言之,错误与这个循环无关,它来自 getTextFromPage() 方法背后的代码 - 因为我只在某些文档和每个文档的不同位置获取它,它必须与如何做有关方法有效 - 它是 iText 包的一部分。
  • 是的,我看到了您刚刚添加的堆栈跟踪,很明显它来自您正在使用的 PDF API。不知道为什么它没有被抓住。您的代码中有一个额外的大括号,但这实际上应该导致编译错误。我想,如果绝望的话,你可以尝试捕捉 Throwable 看看是否可以捕获 something
【解决方案3】:
    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");
        }
    }

【讨论】:

  • page=0 导致另一个错误 - 没有 page=0 第一页是 page=1。 page 变量对应于真实的页码。
  • 是否有可以在提取器对象上调用的计数方法?你从哪里得到 noPages?
  • 是的,还有其他代码可以获取该值 int noPages = reader.getNumberOfPages();该代码工作正常
【解决方案4】:

愚蠢的问题,但是您放入 catch 中的 ArrayIndexOutOfBoundsException 与被抛出的包是否相同?即 java.lang

或者也许 catch throwable 看看这是否有效。

【讨论】:

  • 这实际上是一个非常好的问题,事实并非如此,但后来我导入了“import java.lang.ArrayIndexOutOfBoundsException;”我仍然得到错误。我也有“import java.io.IOException;”我想知道这是否会导致冲突?
  • 不应该。当你 try-catch (Throwable t) 发生了什么?
  • 抱歉在开会 - 刚刚尝试过 throwable,这似乎是最好的解决方案。
【解决方案5】:

您正在调用的代码可能正在处理ArrayIndexOutOfBoundsException 并自行打印堆栈跟踪而不重新抛出它。如果是这种情况,您将看不到您的System.out.println 被调用。

编辑:如果您想继续前进,最好知道PDFContentStreamProcessor#processContent 将捕获ArrayIndexOutOfBoundsException,然后抛出其com.lowagie.text.ExceptionConverter 的实例,这是RuntimeException 的子类。

【讨论】:

  • 谢谢,我将不得不读一些书来了解投掷和接球,但我怀疑你是对的。会检查并报告。
  • 正要提出同样的建议。似乎很有可能(即使其他组件这样做会很奇怪)
  • 您也可以尝试(讨厌)调试代码并进入另一个库(假设您有源代码或在您的 IDE 中有反编译器)并准确查看它在做什么。
  • 感谢 akf - 不幸的是,我的 Java 技能还不够好,无法知道如何实施您在 EDIT 中的建议
【解决方案6】:

也许这很简单(毕竟,我在过去的 36 小时内只睡了 3 小时),但就像 digiarnie 和 Ankur 提到的那样:您是否尝试过简单的 catch (Exception e)

这绝对不是理想的,因为显然它(连同Throwable t 建议)将捕获阳光下的所有异常,不限于ArrayOutOfBoundsException。如果您还没有尝试过,只是想出主意。

【讨论】:

    【解决方案7】:

    也许这是一个愚蠢的问题...您确定异常是在您发布的代码中引发的,而不是在其他方法中引发的吗?

    【讨论】:

      【解决方案8】:

      该程序应该可以运行。您应该提供更多详细信息,包括您的班级名称。您可以尝试通过捕获 Exception 或在 finally 块中添加一些 s.o.p 来尝试。

      【讨论】:

        【解决方案9】:

        这很奇怪——我实际上在引发异常的方法中查看了 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 异常。我看不出您原来的 try-catch 不起作用的任何原因。

        也许您应该发布整个课程?另外,您使用的是哪个版本的 itext?

        【讨论】:

          【解决方案10】:

          等一下!你在那里缺少一些大括号:) 你的 catch 语句在你的 for 语句之外!你有这个:

          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
          

          【讨论】:

          • 实际上,如果你有这样的,它不会编译。
          猜你喜欢
          • 2021-09-02
          • 1970-01-01
          • 2013-12-28
          • 2020-02-09
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多