zoukankan      html  css  js  c++  java
  • android.os.Parcel.readByteArray NullPointerException

    报错信息:

    E/AndroidRuntime( 1626): java.lang.NullPointerException
    E/AndroidRuntime( 1626):     at android.os.Parcel.readByteArray(Parcel.java:1649)
    E/AndroidRuntime( 1626):     at xxxx.b.a(ContactInfo.java:47)
    E/AndroidRuntime( 1626):     a  xxxxxx.b.createFromParcel(ContactInfo.java:40)
    E/AndroidRuntime( 1626):     at android.os.Parcel.readParcelable(Parcel.java:2111)
    E/AndroidRuntime( 1626):     at android.os.Parcel.readValue(Parcel.java:2020)
    E/AndroidRuntime( 1626):     at android.os.Parcel.readListInternal(Parcel.java:2362)
    E/AndroidRuntime( 1626):     at android.os.Parcel.readList(Parcel.java:1585)
    E/AndroidRuntime( 1626):     at xxx.util.m.b(ParcelableUtils.java:54)
    E/AndroidRuntime( 1626):     atxxxxxx.xxx.onClick(MainActivity.java:646)
    E/AndroidRuntime( 1626):     at android.view.View.performClick(View.java:4444)
    E/AndroidRuntime( 1626):     at android.view.View$PerformClick.run(View.java:18445)
    E/AndroidRuntime( 1626):     at android.os.Handler.handleCallback(Handler.java:733)
    E/AndroidRuntime( 1626):     at android.os.Handler.dispatchMessage(Handler.java:95)
    E/AndroidRuntime( 1626):     at android.os.Looper.loop(Looper.java:136)
    E/AndroidRuntime( 1626):     at android.app.ActivityThread.main(ActivityThread.java:5135)
    E/AndroidRuntime( 1626):     at java.lang.reflect.Method.invokeNative(Native Method)
    E/AndroidRuntime( 1626):     at java.lang.reflect.Method.invoke(Method.java:515)
    E/AndroidRuntime( 1626):     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:795)
    E/AndroidRuntime( 1626):     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:611)
    E/AndroidRuntime( 1626):     at dalvik.system.NativeStart.main(Native Method)
    W/ActivityManager(  789):   Force finishing activity xxxxx/.MainActivity

    问题说明

    当我在通过Parcel传递byte[]时出现了这个错误

    public class ContactInfo implements Parcelable {
    
        private String mName;//联系人名称
        private String mNumber;// 联系人号码
    //    private static byte[] bmBytes;//联系人头像
        private Bitmap bitmap;//头像bitmap
    
        @Override
        public int describeContents() {
            return 0;
        }
    
        @Override
        public void writeToParcel(Parcel dest, int flags) {
            dest.writeString(mName);
            dest.writeString(mNumber);
            byte[] bytes=getBytesFromBitmap(bitmap);
            dest.writeByteArray(bytes);
       }
        // 用来创建自定义的Parcelable的对象
        public static final Creator<ContactInfo> CREATOR = new Creator<ContactInfo>() {
            public ContactInfo createFromParcel(Parcel parcel) {
                ContactInfo info = new ContactInfo();
                String name = parcel.readString();
                info.setmName(name);
                String number = parcel.readString();
                info.setmNumber(number);
                byte[] bytes;
                parcel.readByteArray(bytes);
                info.setBitmap(getBitmapFromBytes(bytes));
                return info;
            }
    
            public ContactInfo[] newArray(int size) {
                return new ContactInfo[size];
            }
        };
        public static Bitmap getBitmapFromBytes(byte[] bytes) {
            return BitmapFactory.decodeByteArray(bytes, 0, bytes.length);
        }
    
        private byte[] getBytesFromBitmap(Bitmap bitmap) {
            ByteArrayOutputStream bytesOS = new ByteArrayOutputStream();
            //this.bitmap.compress(Bitmap.CompressFormat.PNG, 0, bytesOS);
            bitmap.compress(Bitmap.CompressFormat.PNG, 0, bytesOS);
            return bytesOS.toByteArray();
        }
    
        public void setBitmap(Bitmap bitmap) {
            this.bitmap = bitmap;
        }
    
        public Bitmap getBitmap() {
            return bitmap;
        }
    
        public String getmName() {
            return mName;
        }
    
        public void setmName(String mName) {
            this.mName = mName;
        }
    
        public String getmNumber() {
            return mNumber;
        }
    
        public void setmNumber(String mNumber) {
            this.mNumber = mNumber;
        }
    
    }

    解决

    需要修改为在写入时使用:

    byte[] bytes=getBytesFromBitmap(bitmap);
    dest.writeInt(bytes.length);
    dest.writeByteArray(bytes);

    在读取时使用:

    byte[] bytes=new byte[parcel.readInt()];
    parcel.readByteArray(bytes);
  • 相关阅读:
    ERROR 2003 (HY000): Can't connect to MySQL server on 'localhost' (10061)
    查看windows和linux下端口是否被占用
    linux系统的默认用户
    修改mysql、oracle、sqlserver默认端口
    linux(centos)下密码有效期和密码复杂度设置
    linux下设置账户锁定阈值:登录失败n次,多长时间后解锁重新登录
    linux账户的锁定和解锁、禁用账号
    执行./install.sh时报错-bash: ./install.sh: /bin/bash^M: 坏的解释器: 没有那个文件或目录
    突然虚拟机无法联网解决办法,且报错Failed to start LSB: Bring up/down
    kubernetes集群环境搭建(7)
  • 原文地址:https://www.cnblogs.com/amiko/p/7906224.html
Copyright © 2011-2022 走看看