【问题标题】:Servlet stops without giving any exceptionServlet 停止而不给出任何异常
【发布时间】:2010-04-04 20:25:38
【问题描述】:

我已经在 Mandriva Linux 的 Tomcat 6 服务器上实现了一个 Servlet。我已经能够使客户端与 Servlet 进行通信。为了响应请求,Servlet 尝试实例化位于同一目录中的另一个类(名为 KalmanFilter)。 KalmanFilter 尝试创建四个矩阵(使用 Jama Matrix 包)。但是此时 Servlet 停止了,没有给出任何异常!

但是,从同一目录中的另一个测试代码中,我已经能够创建 KalmanFilter 类的实例,并继续进行而没有任何错误。仅当我的 Servlet 尝试实例化 KalmanFilter 类并创建矩阵时,才会出现此问题。任何想法?

以下是代码:

MyServlet.java

import javax.servlet.*;
import javax.servlet.http.*;
import java.io.*;
import java.util.*;

public class MyServlet extends HttpServlet {   
public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException{
    doGet(request, response);
}
public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException{  
    PrintWriter out = null;  //response.getWriter();    
    try{                            
        System.out.println("creating new KalmanFilter");
        KalmanFilter filter = new KalmanFilter();                       
        out = response.getWriter(); 
        out.print("filter created");                
    }catch(Exception ex){  
        ex.printStackTrace();
        System.out.println("Exception in doGet(): " + ex.getMessage());
        ex.printStackTrace(out);
    } 
}  
}

卡尔曼滤波器.java

import Jama.Matrix;

public class KalmanFilter {

protected Matrix X, X0;
protected Matrix F, Q;
//protected Matrix F, B, U, Q;
protected Matrix H, R;
protected Matrix P, P0;

private final double EPSILON = 0.001;

public KalmanFilter(){
    System.out.println("from constructor of KalmanFilter");
    createInitialMatrices();                
}

private void createInitialMatrices(){
    System.out.println("from KalmanFilter.createInitialMatrices()");

    double[][] pVals = {
            {1.0, 0.0},
            {0.0, 1.0}
        };

    double[][] qVals = {
            {EPSILON, EPSILON},
            {EPSILON, EPSILON}
        };

    double[][] hVals = {
            {1.0, 0.0},
            {0.0, 1.0},
            {1.0, 0.0},
            {0.0, 1.0}
        };

    double[][] xVals = {
            {0.0},
            {0.0},
        };

    System.out.println("creating P Q H X matrices in createInitialMatrices()");

    try{
        this.P = new Matrix(pVals);
        System.out.println("created P  matrix in createInitialMatrices()");
        this.Q = new Matrix(qVals);
        System.out.println("created Q  matrix in createInitialMatrices()");
        this.H = new Matrix(hVals);
        System.out.println("created H  matrix in createInitialMatrices()");
        this.X = new Matrix(xVals);
        System.out.println("created X  matrix in createInitialMatrices()");
        System.out.println("created P Q H X matrices in  createInitialMatrices()");
    }catch(Exception e){
        System.out.println("Exception from createInitialMatrices()"+ e.getMessage());
        e.printStackTrace();
    }
    System.out.println("returning from createInitialMatrices()");       
}               
}

【问题讨论】:

  • 你在哪里检查堆栈跟踪?您正在查看哪些 tomcat 日志文件?
  • 我正在查看位于日志目录中的 catalina.out 文件。我应该去别的地方吗?

标签: java tomcat servlets tomcat6


【解决方案1】:

如果您从 servlet 中删除了 try/catch 块,您可以更轻松地进行诊断。此代码抛出的唯一检查异常是IOException,doGet 允许您在不捕获它的情况下抛出它。

public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException{  
    System.out.println("creating new KalmanFilter");
    KalmanFilter filter = new KalmanFilter();                       
    out = response.getWriter(); 
    out.print("filter created");                
}  

这样,异常将显示在浏览器上,而不是消失在日志文件中。当然,这对用户来说不是很好,但对你的开发来说,它让生活更轻松。

【讨论】:

  • 感谢您的回答。我尝试了你建议的方式。在客户端发送 IOException。但是当我查看日志 (catalina.out) 后,我看到 > System.out.println("creating P Q H X matrices in createInitialMatrices()");其余代码未在 KalmanFilter 类中执行。我需要知道为什么会发生这种情况,以便我可以设计补救措施。甚至 KalmanFilter.java 中的 catch 块也没有显示发生任何异常。我真的很纳闷! :(
  • 哦,我发现了 ClassNotFoundException。 java.lang.ClassNotFoundException: Jama.Matrix at org.apache.catalina.loader.WebappClassLoader.loadClass(WebappClassLoader.java:1516) at org.apache.catalina.loader.WebappClassLoader.loadClass(WebappClassLoader.java:1361) at KalmanFilter。 createInitialMatrices(KalmanFilter.java:65) at KalmanFilter.(KalmanFilter.java:38) 我正在使用 Jama,它是一个 jar 文件,我将它放在保存 servlet 类文件的“类”目录中。我还将 jar 文件添加到我的类路径中。我做错了什么?我应该将 jar 文件保存在其他地方吗?
  • 好的,我解决了这个问题,将 jar 文件放在 Tomcat 的 lib 目录中。谢谢大家。
猜你喜欢
  • 1970-01-01
  • 2019-08-19
  • 2012-03-19
  • 1970-01-01
  • 2018-05-22
  • 1970-01-01
  • 2020-04-26
  • 2023-03-31
  • 2011-10-16
相关资源
最近更新 更多