Java 字符串中的NullPointerException令人困惑

Java 字符串中的NullPointerException令人困惑,java,nullpointerexception,Java,Nullpointerexception,我遇到了一个异常,它不会停止我的程序,而且似乎不会引起任何问题,但我想知道是什么导致了它 在这里,我将SText.Text分配给“”+RR是一个不断添加到下面getWheelState()的int: SText ST = new SText("",Mainfont,Color.orange,10,300); Window.addEntity(ST);//Adds ST to a list of things to draw. int R = 0;

我遇到了一个异常,它不会停止我的程序,而且似乎不会引起任何问题,但我想知道是什么导致了它

在这里,我将
SText.Text
分配给
“”+R
R是一个不断添加到下面
getWheelState()
的int:

    SText ST = new SText("",Mainfont,Color.orange,10,300);
        Window.addEntity(ST);//Adds ST to a list of things to draw.
        int R = 0;
        while(true)
        {
            int C = SIn.getWheelState(); //static method that calls (Some MouseWheelEvent).getWheelRotation()
            ST.Text = ""+R; //Changing Text here
            if(R+C != R)
            {
                R += C;
            }
        }
如果有用的话,我认为R的值应该是无关的,它是鼠标滚轮滚动的总刻度。对你积极,对你消极:

public class SInput extends MouseAdapter implements MouseListener, MouseWheelListener, KeyListener
{
    protected int MouseScrolled = 0;

    public void mouseWheelMoved(MouseWheelEvent e)
    {
        MouseScrolled += e.getWheelRotation();
    }
    public int HandleWheel()
    {
        int temp = MouseScrolled;
        MouseScrolled = 0;
        return temp;
    }
}
无论如何,这里是我到目前为止追踪到的方法:

public class SText extends SEntity
{
    public String Text; public Color Col; public Font Fnt;
    public SText(String text,Font f,Color cl,int a,int b)
    {
        Fnt = f;
        Text = text;
        Col = cl;
        x = a;
        y = b;
    }
    public void draw(Graphics g)
    {
            try
            {
                g.drawString(Text,x,y); // Line in question
            }
            catch(NullPointerException e)
            {
                if(Text != null && g != null)
                    throw e; //Exception gets thrown anyways
            }
    }

}
以下是堆栈跟踪:

Exception in thread "AWT-EventQueue-0" java.lang.NullPointerException
at java.lang.String.length(String.java:623)
at sun.font.GlyphList.setFromString(GlyphList.java:241)
at sun.java2d.pipe.GlyphListPipe.drawString(GlyphListPipe.java:71)
at sun.java2d.SunGraphics2D.drawString(SunGraphics2D.java:2829)
at SebsGameEngine.SText.draw(SText.java:29)
at SebsGameEngine.SPanel.paintComponent(SPanel.java:37)
at javax.swing.JComponent.paint(JComponent.java:1054)
at javax.swing.JComponent.paintChildren(JComponent.java:887)
at javax.swing.JComponent.paint(JComponent.java:1063)
at javax.swing.JComponent.paintChildren(JComponent.java:887)
at javax.swing.JComponent.paint(JComponent.java:1063)
at javax.swing.JLayeredPane.paint(JLayeredPane.java:585)
at javax.swing.JComponent.paintChildren(JComponent.java:887)
at javax.swing.JComponent.paintToOffscreen(JComponent.java:5228)
at javax.swing.BufferStrategyPaintManager.paint(BufferStrategyPaintManager.java:295)
at javax.swing.RepaintManager.paint(RepaintManager.java:1236)
at javax.swing.JComponent.paint(JComponent.java:1040)
at java.awt.GraphicsCallback$PaintCallback.run(GraphicsCallback.java:39)
at sun.awt.SunGraphicsCallback.runOneComponent(SunGraphicsCallback.java:78)
at sun.awt.SunGraphicsCallback.runComponents(SunGraphicsCallback.java:115)
at java.awt.Container.paint(Container.java:1967)
at java.awt.Window.paint(Window.java:3877)
at javax.swing.RepaintManager$3.run(RepaintManager.java:807)
at javax.swing.RepaintManager$3.run(RepaintManager.java:784)
at java.security.AccessController.doPrivileged(Native Method)
at java.security.ProtectionDomain$1.doIntersectionPrivilege(ProtectionDomain.java:76)
at javax.swing.RepaintManager.paintDirtyRegions(RepaintManager.java:784)
at javax.swing.RepaintManager.paintDirtyRegions(RepaintManager.java:757)
at javax.swing.RepaintManager.prePaintDirtyRegions(RepaintManager.java:706)
at javax.swing.RepaintManager.access$1000(RepaintManager.java:62)
at javax.swing.RepaintManager$ProcessingRunnable.run(RepaintManager.java:1647)
at java.awt.event.InvocationEvent.dispatch(InvocationEvent.java:251)
at java.awt.EventQueue.dispatchEventImpl(EventQueue.java:733)
at java.awt.EventQueue.access$200(EventQueue.java:103)
at java.awt.EventQueue$3.run(EventQueue.java:694)
at java.awt.EventQueue$3.run(EventQueue.java:692)
at java.security.AccessController.doPrivileged(Native Method)
at java.security.ProtectionDomain$1.doIntersectionPrivilege(ProtectionDomain.java:76)
at java.awt.EventQueue.dispatchEvent(EventQueue.java:703)
at java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:242)
at java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:161)
at java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:150)
at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:146)
at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:138)
at java.awt.EventDispatchThread.run(EventDispatchThread.java:91)
如果它有帮助的话,它似乎只有在我处理鼠标滚轮输入时才会发生


但这仍然让我困惑。如果不是
g
Text
,还有什么可以是
null

要了解文本为null的原因,您应该向我们显示实例化SText类的代码段,因为您使用从SText类生成对象的代码段中设置的文本和文本值初始化SText。请把你的密码放在这里。当然Text或g是空的,因为我们在SebsGameEngine.SText.draw(SText.java:29)上有,并且它在draw方法中显示空指针存在

您正在捕获异常并抛出一个新异常,从而丢失原始堆栈跟踪。最好将其改为
抛出e
您不应该捕获
NullPointerException
,这是一种不好的做法,在您的情况下没有任何理由。为了更快地获得更好的帮助,请发布一个@VishalK,它不是一个为null的
字符串。NPE在
String.length
中。我猜这个字符串是使用包私有构造函数
String(char[],boolean)
创建的。这是我找到的将
null
输入到
value
字段的唯一方法。我使用的是JDK1.7.025,在
String.length
中得到了相同的行号。但是,我不能说这个构造函数是如何调用的。如果您可以附加JDK源代码,并可能在这个构造函数中删除一个断点,那么查看调用它的位置将非常有趣。谢谢,我将把它添加到我的问题中。好的。现在我确定g是空的。请告诉我你是如何初始化g的。亲爱的塞巴斯蒂安,请告诉我你为什么在catch块中使用if?它有什么好处?如果文本!=空和g=null,则从不抛出异常。这让我感到困惑:它确实被抛出。我从
Jpanel
中重写
paintComponent(Graphics g)
得到
g
,我从中为每个添加的
实体调用
draw(g)
。我只是简单地将Spanel添加到Jframe中,让它处理g。