我们系统不知道谁写的代码有点为题,使用System.err,输出了很多(接近百万条)空引用异常:
[16:17:26.836]java.lang.NullPointerException
[16:17:26.908]java.lang.NullPointerException
[16:17:26.908]java.lang.NullPointerException
[16:17:26.908]java.lang.NullPointerException显然没有打堆栈,我估计使用System.err.println(exception)的结果,因为java.lang.Throwable的 toString()方法默认就是只有getClass().getName(),但是现在的问题时我们的代码分不到很多部门,我没有权限拿到所有代码,反编译后也看不出来什么东西。哪位有没有办法能够捕捉到堆栈,或者任何发现问题代码的线索???
重定向System.err是没有用的,有没有JVM指令什么的???非常感谢

解决方案 »

  1.   

    这个项目应该有LOG的吧,看看LOG再说
      

  2.   

    log就是下面的输出:
    [16:17:26.836]java.lang.NullPointerException
    [16:17:26.908]java.lang.NullPointerException
    [16:17:26.908]java.lang.NullPointerException
    [16:17:26.908]java.lang.NullPointerException 
      

  3.   

    运行平台是:centerOS x64+sun jdk 6.0+resion 3.0.21 professional
      

  4.   

    log有操作时间吗?  
    那只有把系统log功能增强一下,每个用户进入系统是知道的而且保存在全局范围内,所以把用户名打倒log中
      

  5.   

    来CSDN问问题,最好把项目架构说一下
    STRUTS项目配置文件:   <global-exceptions>
    <exception 
    key="errors.detail" 
    type="java.lang.Exception"
    path="/exceptions/exception.jsp"
    scope="request"
    handler="com.ibm.exception.ExceptionHandler"
    ></exception>
    </global-exceptions>
    你自己写一个处理器就行了:打印出异常的message。
      

  6.   

    ----------
    我需要问题在哪,然后找相关人员去修改,现在是日志在我这边,但是不知道是谁的问题,所以比较棘手。如果有堆栈就好办了,可是现在没有。---------------------------------------------我们有log4j,但是显然有很多的代码还是使用的System.out和System.err,问题是重定向了System.err也不能得到堆栈。
      

  7.   

    ------------------------
    使用的是struts 1.x,但是显然某人捕捉了此异常,并没有抛出,而且调用了System.err,所以才会有输出而没有堆栈。异常处理器不能捕捉到已经处理过而没有抛出的异常。
      

  8.   


    I call! 这个难了,JVM处理异常代码是透明的。况且JVM我也没研究过。不过异常那么多,应该是集合操作。你可以试验一下反射,将工程包下的类一概反向测试一遍----但是如果空指针有输入随机性,那你找神仙解决吧!
      

  9.   

    只能一个一个测试了
    LOG太不详细了根据前面的时间猜猜
      

  10.   

    不知道楼主是什么意思,在eclipse中这样快速定位异常发生的位置:
    在Eclipse中:菜单栏中的Run->Add Java Exception Breakpoint...->然后添加NullPointException.
    然后debug,程序就会在发生异常的地方停下来。
      

  11.   

    我再补充一下吧,我们日志标准是使用Log4j,但是由于历史原因某些人使用System.err,而resin采用了重定向,将System.out和System.err分别输出到文件中,上面的错误信息就是从resin重定向System.err的文件中摘出来的,显然我拿这个没办法,因为没有堆栈,同时这东西是连着输出的,一片一片的,是在不好定位。我再想的时候能不能在jvm处理NullPointerException的时候(就那瞬间)获取到JVM的对象堆栈,然后分析可能是哪个对象引起的,否者这样实在无法分析哪儿出来的。有没有哪位曾经遇到过这种问题???
      

  12.   



    我们的服务只能跑在centerOS上,因为依赖的中间层、数据库都只认服务器的IP,本机的IP是无法连接上的,而centerOS没有GUI,无法开eclipse.对于远程调试基本不可用,因为太快了,一下子就搞死了。有没有其它方法???或者命令行运行暂停??
      

  13.   

    异常都被抓住了,去不了JVM.这类问题最郁闷,打着安全的晃子不给你代码,却要你去FIX BUG,如果你确定是另外部门的代码产生的,就叫他们去FIX吧.
      

  14.   

    不知道你为什么要这么打异常。你可以这样打:
    try{

    }catch(Exception e){
    e.printStackTrace(System.err);
    }
    但是,好像即使不这样写,系统也能自动把堆栈打出来吧???
      

  15.   


    为什么这么写就不知道了,人多了,什么“*”都有,所以只能追求现在解决问题,我也希望推广不准使用System.err和System.out,但是大家也知道,这东西不是我们说推就能推的,很多时候都是一种无奈。
    另外:exception.printStackTrace() <==> exception.printStackTrace(System.err)
      

  16.   


    要不行,你将e.printStackTrace(System.err);中的System.err换成另外的文件流。看看能不能写到文件里。
      

  17.   

    你们的项目框架应该是不完善,应该能通过log发现问题,并容易找到出现问题的地方才行啊。
      

  18.   


    Eclipse的调试功能能够捕捉到catched和uncatched的异常,我想问下能不能用什么方法模拟这样的调试过程,我捕捉到异常但是又不挂起JVM同时还能够得到当前上下文的堆栈???有没有类似的工具?
      

  19.   

    空指针异常都是很不好的编写代码习惯造成的。不管拿到什么东西,都应检测一下是否为 null,除非确定不可能是 null 的。
      

  20.   

    [16:17:26.836]java.lang.NullPointerException
    [16:17:26.908]java.lang.NullPointerException
    [16:17:26.908]java.lang.NullPointerException
    [16:17:26.908]java.lang.NullPointerException
    光有这些东西,你让 CSDN 的人来帮你找问题在哪?
      

  21.   

    不管是什么错误,先让所有的开发人员把所有的 System.err.println(exception) 全部改掉
      

  22.   

    import java.io.OutputStream;
    import java.io.PrintStream;public class Test6 {
        
        static {
            System.setErr(new MyPrintStream(System.err));
        }
            
        public static void main(String[] args) {
            
            try {
                String s = null;
                System.out.println(s.length());
            }catch(Exception e) {
                System.err.println(e);
            }
        }
    }class MyPrintStream extends PrintStream {    public MyPrintStream(OutputStream out) {
            super(out);
        }    @Override
        public void println(Object x) {
            if(x instanceof Throwable) {
                Throwable t = (Throwable)x;
                StackTraceElement[] stes = t.getStackTrace();
                super.println(t + " " + stes[0].toString());
                return;
            }
            super.println(x);
        }
    }你可以写个 Servlet 的 init 中写上 System.setErr(new MyPrintStream(System.err));
    在服务启动执行
      

  23.   

    楼主,你这问题,有些难办了。
    我看了一下,你那个空指针记录的最前面都是时间点。
    你先吧Log4j的日志格式改成我们调试时候的那个格式。
    就是,即带时间点,又有代码的行号,系统效率最低的那种格式。
    然后,根据两种日志的时间点,大致先吧问题定位到某几个(3~5)类上面。
    然后,在根据实际的业务逻辑,进行排除。
    估计应该是线程同步没有处理好的缘故。
    精确定位的时候,可以通过添加切入点的方式来确定到某个方法当中。
    我也只能想到这么多了。
    总之,解决起来是比较麻烦的。
    (替别人擦屁股嘛,总是让人痛苦而又恶心滴)慢慢来吧。
      

  24.   

    楼主的项目既然是web的,出了这么多的空指针异常,页面还能正常显示吗,或者说页面上的功能还能实现吗
    要找错误的话,先一个一个页面的去测试,看看打异常时是跳转到了哪个页面时发生的。大概定位一下哪个功能模块出问题还有,不要光看你们自己log4j出的Log,看看web服务器的Log,或许会有更详细的错误提示
      

  25.   

    STRUTS项目配置文件:       <global-exceptions> 
        <exception 
      key="errors.detail" 
      type="java.lang.Exception" 
      path="/exceptions/exception.jsp" 
      scope="request" 
      handler="com.ibm.exception.ExceptionHandler" 
      >  </exception> 
        </global-exceptions> 
      你自己写一个处理器就行了:打印出异常的message。 
      

  26.   

    try
    {
      代码
    }catch(NullPointerException se)
    {
      进行处理
    }
      

  27.   

    使用JPF试试,它可以跟踪JVM内存状态的。
    不过对于比较大的项目,JPF恐怕也心有余而力不足了。