java类的第1行出现异常

java类的第1行出现异常,java,exception,Java,Exception,我有一个奇怪的例外: 11:35:16,822 ERROR [jsp:154] java.lang.NullPointerException at org.mine.portal.security.portlet.web.MyRenderRequestWrapper.getUserPrincipal(MyRenderRequestWrapper.java:16) at org.mine.portal.security.portlet.web.MyRenderRequestWrap

我有一个奇怪的例外:

11:35:16,822 ERROR [jsp:154] java.lang.NullPointerException at org.mine.portal.security.portlet.web.MyRenderRequestWrapper.getUserPrincipal(MyRenderRequestWrapper.java:16) at org.mine.portal.security.portlet.web.MyRenderRequestWrapper.getUserPrincipal(MyRenderRequestWrapper.java:1) 11:35:16822错误[jsp:154]java.lang.NullPointerException 位于org.mine.portal.security.portlet.web.MyRenderRequestWrapper.getUserPrincipal(MyRenderRequestWrapper.java:16) 位于org.mine.portal.security.portlet.web.MyRenderRequestWrapper.getUserPrincipal(MyRenderRequestWrapper.java:1) 这很奇怪,因为它在第1行传递,而异常的另一行是:

1. package org.mine.portal.security.portlet.web; 2. 3. import javax.portlet.RenderRequest; 4. import javax.portlet.filter.RenderRequestWrapper; 5. 6. import org.springframework.security.core.Authentication; 7. import org.springframework.security.core.context.SecurityContextHolder; 8. 9. public class MyRequestWrapper extends RenderRequestWrapper { 10. 11. public PortalRenderRequestWrapper(RenderRequest request) { 12. super(request); 13. } 14. 15. @Override 16. public Authentication getUserPrincipal() { 17. return SecurityContextHolder.getContext().getAuthentication(); 18. } 1.包org.mine.portal.security.portlet.web; 2. 3.导入javax.portlet.RenderRequest; 4.导入javax.portlet.filter.RenderRequestWrapper; 5. 6.导入org.springframework.security.core.Authentication; 7.导入org.springframework.security.core.context.SecurityContextHolder; 8. 9公共类MyRequestWrapper扩展了RenderRequestWrapper{ 10 11.公共PortalRenderRequestWrapper(RenderRequest请求){ 12.超级(请求); 13. } 14 15.@覆盖 16.公共身份验证getUserPrincipal(){ 17.返回SecurityContextHolder.getContext().getAuthentication(); 18. }
有人知道它可以是什么吗?

正如您从这部分
[jsp:154]中看到的那样
它来自JSP,您可能正在使用包装器以某种方式呈现该JSP。

任何在第1行报告错误的内容通常是因为错误在别处,但无法准确报告。这通常是因为错误在代码之外,因此没有可转换回的源代码行


第16行看起来怎么样?

这很可能是由于用户未登录造成的:

getUserPrincipal

public java.security.PrincipalgetUserPrincipal()

返回一个java.security.Principal对象,该对象包含当前经过身份验证的用户的名称。如果该用户尚未经过身份验证,则该方法返回null

返回: 包含发出此请求的用户名称的java.security.Principal;如果用户未经过身份验证,则为null


当您使用泛型或具有共同变量返回类型(我怀疑这里是后者)时,编译器会生成一个额外的方法来支持向后兼容性和继承

在JVM级别,返回类型是方法签名的一部分(即使不是Java)

假设你有这个密码

public class A {
    public Number method() { return 1L; }
}

public class B extends A {
    public Double method() { return 2.0; }
}
在JVM中,
Number method()
不会被
Double method()
覆盖,因为签名不同,所以javac编译器会添加一个字节码中的方法,如

public class B extends A {
    public transient Number method() { return (Number)<Double>method(); } // calls the first method
    public Double method() { return 2.0; }
}
公共类B扩展了{
public transient Number method(){return(Number)method();}//调用第一个方法
公共双精度方法(){return 2.0;}
}

这个生成的方法没有源代码,通常放在源文件的第1行。(我不知道为什么这个方法有与瞬态字段相同的修饰符)

发布第16行
MyRenderRequestWrapper.java:16
我认为最好是从类的顶部一直打印到第16行,这似乎是个问题。我写的第16行是第16行。您可能已将会话配置为在重新部署时失效,此时您将看到类似的行为。我不知道我很确定,但它可能值得一看。我的IDE允许我在重新部署期间保留或使会话无效。我不认为它区分Portlet或整个应用程序。mmm no是其他的…因为现在我在重新部署的方法中放入System.out,它抛出NoClassDefFoundError。。。。。。。。。。。