在屏幕上画了几条线之后就出现:
07-11 22:44:19.907: W/System.err(487): java.lang.NullPointerException
07-11 22:44:19.907: W/System.err(487):  at com.sg.main.MainView.onDraw(MainView.java:95)
07-11 22:44:19.907: W/System.err(487):  at com.sg.main.MainView.run(MainView.java:74)
07-11 22:44:19.907: W/System.err(487):  at java.lang.Thread.run(Thread.java:1019)
07-11 22:44:20.068: E/Surface(487): Surface::lock failed, already locked
07-11 22:44:20.082: E/SurfaceHolder(487): Exception locking surface
07-11 22:44:20.082: E/SurfaceHolder(487): java.lang.IllegalArgumentException
07-11 22:44:20.082: E/SurfaceHolder(487):  at android.view.Surface.lockCanvasNative(Native Method)
07-11 22:44:20.082: E/SurfaceHolder(487):  at android.view.Surface.lockCanvas(Surface.java:314)
07-11 22:44:20.082: E/SurfaceHolder(487):  at android.view.SurfaceView$3.internalLockCanvas(SurfaceView.java:762)
07-11 22:44:20.082: E/SurfaceHolder(487):  at android.view.SurfaceView$3.lockCanvas(SurfaceView.java:741)
07-11 22:44:20.082: E/SurfaceHolder(487):  at com.sg.main.MainView.onDraw(MainView.java:89)
07-11 22:44:20.082: E/SurfaceHolder(487):  at com.sg.main.MainView.run(MainView.java:74)
07-11 22:44:20.082: E/SurfaceHolder(487):  at java.lang.Thread.run(Thread.java:1019)
07-11 23:11:38.210: E/Surface(636): Surface::lock failed, already locked
07-11 23:11:38.210: E/SurfaceHolder(636): Exception locking surface
public class MainView extends SurfaceView implements SurfaceHolder.Callback,
Runnable { private SurfaceHolder mHolder;
private boolean mLoop;
        private GraphFactory graphFactory;
private Graph curGraph;
private GUnit curUnit;
private List<Graph> graphList; public MainView(Context context) {
super(context);
mHolder = getHolder();
mHolder.addCallback(this);
setFocusable(true);
mLoop = true; // 循环画图
isEidt = false; graphList = new ArrayList<Graph>(); new Thread(this).start();
} @Override
public void run() {
while (mLoop) {
try {
Thread.sleep(100);
synchronized (mHolder) {
onDraw();
}
} catch (InterruptedException e) {
e.printStackTrace();
} catch (Exception e) {
e.printStackTrace();
}
} } public void onDraw() {
if (mHolder == null) {
return;
}
Canvas canvas = mHolder.lockCanvas();
if (canvas == null) {
return;
}
super.onDraw(canvas); canvas.drawColor(Color.WHITE); // 背景色
int color = Color.BLACK; // 画笔颜色
int width = 3; // 画笔宽度 GraphControl graphControl = new GraphControl(graphList, color, width); graphControl.drawObj(curGraph, canvas); // 绘制当前勾画的草图,调用各图形的画图函数
graphControl.drawObjList(canvas); // 绘制已有的图像对象列表 mHolder.unlockCanvasAndPost(canvas);
}

解决方案 »

  1.   

    MainView.java 第95行出错,楼主既然都发源码了就要完整的发上来,才能判断第95行到底是什么代码。
      

  2.   

    大概原因应该是这里出错:
    super.onDraw(canvas);原因是:super不存在,必须在public void onDraw()前面加上一行
    @Override加上“@Override”是代表着onDraw是MainView的事件之一,这样super就不会为空了,但加上“@Override”后,onDraw的代码必须符合MainView的onDraw应有的规则,否则会有错误提示。
      

  3.   


    public class MainView extends SurfaceView implements SurfaceHolder.Callback,
    Runnable {private SurfaceHolder mHolder;
    private boolean mLoop;
      private GraphFactory graphFactory;
    private Graph curGraph;
    private GUnit curUnit;
    private List<Graph> graphList;public MainView(Context context) {
    super(context);
    mHolder = getHolder();
    mHolder.addCallback(this);
    setFocusable(true);
    mLoop = true; // 循环画图
    isEidt = false;graphList = new ArrayList<Graph>();new Thread(this).start();
    }@Override
    public void run() {
    while (mLoop) {
    try {
    Thread.sleep(100);
    synchronized (mHolder) {
    onDraw();   //at com.sg.main.MainView.run是这个
    }
    } catch (InterruptedException e) {
    e.printStackTrace();
    } catch (Exception e) {
    e.printStackTrace();
    }
    }}public void onDraw() {
    if (mHolder == null) {
    return;
    }
    Canvas canvas = mHolder.lockCanvas(); //at com.sg.main.MainView.onDraw是这个
    if (canvas == null) {
    return;
    }
    super.onDraw(canvas);canvas.drawColor(Color.WHITE); // 背景色
    int color = Color.BLACK; // 画笔颜色
    int width = 3; // 画笔宽度GraphControl graphControl = new GraphControl(graphList, color, width);graphControl.drawObj(curGraph, canvas); // 绘制当前勾画的草图,调用各图形的画图函数
    graphControl.drawObjList(canvas); // 绘制已有的图像对象列表mHolder.unlockCanvasAndPost(canvas);
    }
      

  4.   

    完整的源码是从第一行开始的,包括package、import,这样才知道第95行是什么代码
      

  5.   


    把super.onDraw(canvas);注释了也不行
      

  6.   

    也就是说MainView.java文件里面的所有内容,在代码public class MainView 前面肯定还有其他代码的。大概的出错原因及解决办法请参考2楼中的回复