有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

绘制圆时出现java InvalidClassException。为什么?

这是我第一次在安卓上画东西。我遵循了一个关于开发人员的教程。安卓com:

http://developer.安卓.com/training/custom-views/custom-drawing.html

显然,我应该创建一个自定义视图并覆盖onDraw,然后我就可以开始在Canvas参数上绘图了!所以我创建了这样一个视图:

public class CanvasView extends View {
    private Canvas canvas;

    public Canvas getCanvas() {
        return canvas;
    }

    public CanvasView (Context c) {
        super(c);
    }

    @Override
    protected void onDraw (Canvas c) {
        canvas = c;
        Paint p = new Paint();
        p.setColor (Color.BLACK);
        c.drawCircle (50, 50, 25, p);
    }
}

正如你所见,我有一个方法来获取画布对象。这是因为我希望能够从其他代码(不在这个类中)向视图添加内容。我觉得我的代码有道理。我只想画一个黑圈

当我运行应用程序时,它立即崩溃,出现InvalidClassException

java.io.InvalidClassException: dfa; Incompatible class (SUID): dfa: static final long serialVersionUID =8874316054258000122L; but expected dfa: static final long serialVersionUID =0L;
        at java.io.ObjectInputStream.verifyAndInit(ObjectInputStream.java:2383)
        at java.io.ObjectInputStream.readNewClassDesc(ObjectInputStream.java:1665)
        at java.io.ObjectInputStream.readClassDesc(ObjectInputStream.java:683)
        at java.io.ObjectInputStream.readNewObject(ObjectInputStream.java:1806)
        at java.io.ObjectInputStream.readNonPrimitiveContent(ObjectInputStream.java:787)
        at java.io.ObjectInputStream.readObject(ObjectInputStream.java:2006)
        at java.io.ObjectInputStream.readObject(ObjectInputStream.java:1963)
        at com.google.安卓.apps.plus.service.EsService.c(PG:5140)
        at com.google.安卓.apps.plus.service.EsService.b(PG:5064)
        at com.google.安卓.apps.plus.service.EsService.a(PG:2522)
        at com.google.安卓.apps.plus.service.EsService.c(PG:2613)
        at com.google.安卓.apps.plus.service.PackageAddedReceiver.onReceive(PG:37)
        at 安卓.app.ActivityThread.handleReceiver(ActivityThread.java:2488)
        at 安卓.app.ActivityThread.access$1500(ActivityThread.java:150)
        at 安卓.app.ActivityThread$H.handleMessage(ActivityThread.java:1374)
        at 安卓.os.Handler.dispatchMessage(Handler.java:99)
        at 安卓.os.Looper.loop(Looper.java:213)
        at 安卓.app.ActivityThread.main(ActivityThread.java:5225)
        at java.lang.reflect.Method.invokeNative(Native Method)
        at java.lang.reflect.Method.invoke(Method.java:525)
        at com.安卓.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:741)
        at com.安卓.internal.os.ZygoteInit.main(ZygoteInit.java:557)
        at dalvik.system.NativeStart.main(Native Method)

我搜索了有关NTInvalidClassException的问题,但没有找到类似的问题。它们都是关于反序列化的东西。我在调用堆栈中找到了与序列化相关的单词serialVersionUID,但我的代码对序列化没有任何作用

我想这可能是因为Canvas字段。如果这真的是个问题,有没有其他方法可以在UI上绘制东西,但不使用可绘制的资源文件?如果这不是问题,那么问题是什么?我不知道为什么InvalidClassException与绘画有关


共 (1) 个答案

  1. # 1 楼答案

    serialVersionUID似乎是自动生成为8874316054258000122L的,因为它没有在代码中明确定义,这不是预期的结果

    尝试手动将serialVersionUID设置为0L,正如dfa所预期的那样:

    private static final long serialVersionUID = 0L;