我有一个有渲染线程的小应用程序.所有这个线程都是在我们当前位置绘制我的对象.
我有一些代码:
public void render() { // ... rendering various objects if (mouseBall != null) mouseBall.draw() }
然后我还有一些鼠标处理程序,当用户单击鼠标时,它会创建鼠标键并将其设置为新球.然后用户可以拖动鼠标,球将跟随鼠标移动的位置.当用户释放球时,我有另一个设置mouseBall = null的鼠标事件.
问题是,我的渲染循环运行得足够快,随机时间条件(mouseBall!= null)将返回true,但在该点之后的那一瞬间,用户将放开鼠标,我将得到一个nullpointer在null对象上尝试.draw()的异常.
这样的问题的解决方案是什么?
问题在于你正在访问mouseBall
两次,一次是检查它是否是null
,另一次是在它上面调用一个函数.你可以使用像这样的临时代码来避免这个问题:
public void render() { // ... rendering various objects tmpBall = mouseBall; if (tmpBall != null) tmpBall.draw(); }
您必须同步if和draw语句,以确保它们作为一个原子序列运行.在java中,这将是这样做的:
public void render() { // ... rendering various objects synchronized(this) { if (mouseBall != null) mouseBall .draw(); } }