如何在Java中从外部jar捕获异常

如何在Java中从外部jar捕获异常,java,exception-handling,mallet,Java,Exception Handling,Mallet,我正在尝试使用运行LDA算法。当我尝试使用一组参数运行LDA时,这是正常的,但使用另一组参数时,我出现以下错误: 09-Oct-2014 23:50:24.354 INFO [http-nio-8084-exec-127] cc.mallet.topics.ParallelTopicModel.estimate <50> LL/token: -8.73265 09-Oct-2014 23:50:24.657 INFO [http-nio-8084-exec-127] null.nu

我正在尝试使用运行LDA算法。当我尝试使用一组参数运行LDA时,这是正常的,但使用另一组参数时,我出现以下错误:

09-Oct-2014 23:50:24.354 INFO [http-nio-8084-exec-127] cc.mallet.topics.ParallelTopicModel.estimate <50> LL/token: -8.73265 
09-Oct-2014 23:50:24.657 INFO [http-nio-8084-exec-127] null.null [beta: 0.00795]  
09-Oct-2014 23:50:24.657 INFO [http-nio-8084-exec-127] null.null <60> LL/token: -8.6299 
09-Oct-2014 23:50:24.957 INFO [http-nio-8084-exec-127] cc.mallet.topics.ParallelTopicModel.estimate <70> LL/token: -8.61982 
09-Oct-2014 23:50:25.019 INFO [http-nio-8084-exec-127] null.null [beta: 0.00583]  
09-Oct-2014 23:50:25.263 INFO [http-nio-8084-exec-127] cc.mallet.topics.ParallelTopicModel.estimate <80> LL/token: -8.89656 
09-Oct-2014 23:50:25.402 INFO [http-nio-8084-exec-127] null.null [beta: 0.00484]

java.lang.ArrayIndexOutOfBoundsException: -1    at 
cc.mallet.topics.WorkerRunnable.sampleTopicsForOneDoc(WorkerRunnable.java:489)  at 
cc.mallet.topics.WorkerRunnable.run(WorkerRunnable.java:275)    at 
java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:511)     at 
java.util.concurrent.FutureTask.run(FutureTask.java:266)    at 
java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142)     at 
java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617)     at 
java.lang.Thread.run(Thread.java:745) java.lang.ArrayIndexOutOfBoundsException: -1  at 
cc.mallet.topics.WorkerRunnable.sampleTopicsForOneDoc(WorkerRunnable.java:489)  at 
cc.mallet.topics.WorkerRunnable.run(WorkerRunnable.java:275)    at 
java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:511)     at 
java.util.concurrent.FutureTask.run(FutureTask.java:266)    at 
java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142)     at 
java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617)     at 
java.lang.Thread.run(Thread.java:745)
如何捕获由外部JAR引起的异常?我有一个问题,但对我不起作用。有什么想法吗

编辑:

我的项目是一个RESTfulWebService,它运行在ApacheTomcat服务器上。我尝试在dopost函数中调用lda算法

编辑2

Mallet是一个开源库。所以我试着读代码,我发现下面的代码

public class ParallelTopicModel implements Serializable {
    int numThreads = 2;
    public void estimate() throws IOException {
        WorkerRunnable[] runnables = new WorkerRunnable[numThreads];
        for (int thread = 0; thread < numThreads; thread++) {
            runnables[thread] = new WorkerRunnable(numTopics, alpha, alphaSum, beta,
                                                   random, data, runnableCounts, 
                                                  runnableTotals, offset, docsPerThread);
        //some code
        }
    }

}

public class WorkerRunnable implements Runnable {

    public void run() {

        try {
            //some code   
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

}
公共类ParallelTopicModel实现可序列化{
int numThreads=2;
public void estimate()引发异常{
WorkerRunnable[]runnables=新的WorkerRunnable[numThreads];
对于(int-thread=0;thread
我的网络服务:

@POST
@Produces("application/xml")
public String getXml(@FormParam("xmlinput") String xmlinput) throws  Exception {
try {
     //call estimate function in ParallelTopicModel class
     //return  an xml;
} catch (Exception e) {
    return "<?xml version=\"1.0\" encoding=\"UTF-8\"?>" + "<modelingOutput>null</modelingOutput>";
}
@POST
@生成(“应用程序/xml”)
公共字符串getXml(@FormParam(“xmlinput”)字符串xmlinput)引发异常{
试一试{
//ParallelTopicModel类中的调用估计函数
//返回一个xml;
}捕获(例外e){
返回“”+“null”;
}
那么,如何处理在web服务中生成可运行类的异常呢

`空的


我读过很多问题,比如和,但我没有找到解决方案。这里的问题不是调用外部jar。调用链中的任何方法引发的异常,无论实际类的字节码存储在哪里,都会在第一个
catch
阻塞链时被捕获

这里的问题是,异常发生在不同的线程中。如果从代码中启动一个单独的线程,则该线程中的异常不会传递给线程。就代码而言,该调用已完成。如果另一个线程中的代码未捕获到异常,则该线程的异常将捕获这些异常安德勒,如果真有这样的人

运行时错误通常是由错误的输入引起的,因此避免这些错误的通常策略是理解为什么您的参数会导致该方法中的数组索引为负,然后确保从不将此类参数传递给该方法

如果这是不可能的,您可以为线程创建一个异常处理程序。只有在您控制创建线程并且可以在其中设置处理程序的情况下,这才有效

您可能想了解更多关于在线程中处理异常的信息

编辑

由于他们的
WorkerRunnable
代码似乎可以捕获所有异常(并打印堆栈跟踪),因此无法自己捕获它们。您可以执行以下两种操作之一:

  • 如前所述,检查您传递的哪些参数导致了数组越界错误,并避免这些情况。使用
    if
    语句,如果参数不正确,则打印
    null
    输出,而不首先运行建模
  • 使用他们的源代码,将他们的
    catch
    子句更改为设置一个变量来告诉您出现异常,编译它并使用该jar而不是他们的。这就是开源的目的。您可能希望与该库的维护人员沟通,并告诉他们,如果他们添加一种方法来检测异常异常由一个子线程引起

  • 你写的代码有什么问题吗?它没有捕获到exectpion吗?我的代码捕获所有异常。这个异常不是来自我的代码。它来自jar文件。这不只是一个日志语句吗?你的代码停止运行是因为异常冒泡还是你只是因为外部jar打印了一些东西而烦恼?因为外部jar打印了一些东西ar打印错误。如果它打印到System.out,您对此无能为力。异常从未进入您的代码。如果jar记录信息,为什么会出现问题?您可以始终将
    System.out
    重定向到不同的
    打印流
    ,但我建议您不要这样做。这也意味着您将无法使用con编辑:Mallet似乎使用了
    java.util.logging
    ,因此您可以通过调整根logger:Thnaks来禁用控制台输出,以获得答案。请参见编辑2。我的问题现在有点不同。谢谢您的编辑,但是,1)我无法验证参数,因为我不知道它什么时候坏2)它很难更改他们的代码。我想与该库的维护人员沟通,但现在我必须找到一个解决方案。那么我可以检查其他进程的线程是否处于活动状态或崩溃状态吗?我读了这篇文章,我想知道是否可以处理类似这样的异常抱歉@Jimmysnn,这对您没有帮助。首先,您无法访问o这些线程,因为它们的引用是您无法控制的方法中的局部变量。但即使可以,也无法区分失败运行和成功运行。因为它们有一个
    try…catch
    块,所以线程始终成功终止。它从不引发异常。
    @POST
    @Produces("application/xml")
    public String getXml(@FormParam("xmlinput") String xmlinput) throws  Exception {
    try {
         //call estimate function in ParallelTopicModel class
         //return  an xml;
    } catch (Exception e) {
        return "<?xml version=\"1.0\" encoding=\"UTF-8\"?>" + "<modelingOutput>null</modelingOutput>";
    }