Java 为什么可以';我不能抓住特塞拉特例外吗?

Java 为什么可以';我不能抓住特塞拉特例外吗?,java,swing,tesseract,tess4j,Java,Swing,Tesseract,Tess4j,我正在使用Tesseract OCR技术,我一直在使用以下代码: 在测试过程中,我想测试捕获关闭,因此我向Tesseract提供了错误的信息,这将导致TesseractException。 我设法从createDocuments()方法中引发了TesseractException。 以下是堆栈跟踪: 注意,在异常中我们可以找到doOcr()的行125,它位于try-catch子句中,但即使控制台显示抛出TesseractException,代码仍会移到行126,返回true 我使用net.s

我正在使用Tesseract OCR技术,我一直在使用以下代码:

在测试过程中,我想测试捕获关闭,因此我向Tesseract提供了错误的信息,这将导致
TesseractException
。 我设法从
createDocuments()
方法中引发了
TesseractException
。 以下是堆栈跟踪:

注意,在异常中我们可以找到doOcr()的
行125
,它位于try-catch子句中,但即使控制台显示抛出
TesseractException
,代码仍会移到
行126
,返回true

我使用
net.sourceforge.tess4j.Tesseract
来启动OCR过程,但我也尝试了
net.sourceforge.tess4j.Tesseract1
,这导致了与tess4j相同的红色控制台输出,但没有
TesseractException


我的问题是我做错了什么?我只是假设我的代码有问题,因为正在抛出
TesseractException
,但我的代码没有捕获它。

查看
Tesseract.java
的源代码:

@Override
public void createDocuments(String[] filenames, String[] outputbases, List<RenderedFormat> formats) throws TesseractException {
    if (filenames.length != outputbases.length) {
        throw new RuntimeException("The two arrays must match in length.");
    }

    init();
    setTessVariables();

    try {
        for (int i = 0; i < filenames.length; i++) {
            File workingTiffFile = null;
            try {
                String filename = filenames[i];

                // if PDF, convert to multi-page TIFF
                if (filename.toLowerCase().endsWith(".pdf")) {
                    workingTiffFile = PdfUtilities.convertPdf2Tiff(new File(filename));
                    filename = workingTiffFile.getPath();
                }

                TessResultRenderer renderer = createRenderers(outputbases[i], formats);
                createDocuments(filename, renderer);
                api.TessDeleteResultRenderer(renderer);
            } catch (Exception e) {
                // skip the problematic image file
                logger.error(e.getMessage(), e);
            } finally {
                if (workingTiffFile != null && workingTiffFile.exists()) {
                    workingTiffFile.delete();
                }
            }
        }
    } finally {
        dispose();
    }
}

/**
 * Creates documents.
 *
 * @param filename input file
 * @param renderer renderer
 * @throws TesseractException
 */
private void createDocuments(String filename, TessResultRenderer renderer) throws TesseractException {
    api.TessBaseAPISetInputName(handle, filename); //for reading a UNLV zone file
    int result = api.TessBaseAPIProcessPages(handle, filename, null, 0, renderer);

    if (result == ITessAPI.FALSE) {
        throw new TesseractException("Error during processing page.");
    }
}
@覆盖
public void createDocuments(字符串[]文件名、字符串[]输出基、列表格式)引发TesseractException{
if(filenames.length!=outputbases.length){
抛出新的RuntimeException(“两个数组的长度必须匹配”);
}
init();
setTessVariables();
试一试{
对于(int i=0;i
在第579行抛出异常。此方法由上面的公共方法调用-在第551行。这在try-catch块内,带有
logger.error(e.getMessage(),e)(第555行)

现在的问题是你真正想要实现什么

如果不想查看此日志,可以将slf4j配置为不打印此库中的日志


如果您想要获得实际的异常,则不可能,因为库会将其吞并。我不熟悉这个库,但从代码上看,在try-catch块下似乎没有任何好的选项——抛出异常的方法是私有的,只在这个地方使用。但是,当
api.TessBaseAPIProcessPages(…)
返回
ITessAPI.FALSE
并且
api
具有getter时,会引发异常。因此,您可以调用
TessBaseAPIProcessPages(…)
方法并检查结果。这可能并不理想,因为您可能要对每个图像处理两次。另一个解决方案是分叉源代码并自己修改它。您可能还想联系作者并征求意见-您可以更进一步,提交一个请求,供他们批准和发布。

将pdf.ttf文件添加到tessdata路径(tessdata/pdf.ttf)

如果第125行
restInstance.createDocuments(…)
抛出异常,则无法执行第126行。您可以在控制台上看到带有堆栈跟踪的日志-它来自哪里?使用调试器并检查正在执行的行。另外,能否显示导入的
TesseractException
?可能不止一个,而您导入了错误的?@JaroslawPawlak在调试期间,当我在第125行时,控制台输出TesseractException。此外,我再次仔细检查了导入,这是唯一的tesseractexception。net.sourceforge.tess4j.TesseractException;好吧,它捕获了异常,那么为什么要抛出它呢?还有,我该如何解决这个问题,或者是否有一种能够捕获TesseractException的防错方法?谢谢您的快速回答。我很害怕,但我想这就是生活。我会尽量联系作者,也有可能他会找到这篇文章。我只想通过捕捉TestSercExtExt来确定TestSerACT OCR进程的成功,但是被吞咽的异常确实与.See溢出有关。欢迎来到StAdvExcel,考虑阐述这个答案(也许解释为什么这是解决作者的问题),你的意思是和“TestDATA”一样吗?