GVKun编程网logo

将Null-Object取消装箱成原始类型会导致NullPointerException,好吗?(取消对null指针的引用怎么改)

21

本文将为您提供关于将Null-Object取消装箱成原始类型会导致NullPointerException,好吗?的详细介绍,我们还将为您解释取消对null指针的引用怎么改的相关知识,同时,我们还将为

本文将为您提供关于将Null-Object取消装箱成原始类型会导致NullPointerException,好吗?的详细介绍,我们还将为您解释取消对null指针的引用怎么改的相关知识,同时,我们还将为您提供关于Android Studio:取消装箱“ xxx”可能会产生“ java.lang.NullPointerException”、android – 在onDestory()中停止/释放Mediaplayer会导致NullPointerException、android – 实现包含List的Parcelable接口的Object抛出NullPointerException、android – 照片捕获意图仅在Samsung手机上导致NullPointerException的实用信息。

本文目录一览:

将Null-Object取消装箱成原始类型会导致NullPointerException,好吗?(取消对null指针的引用怎么改)

将Null-Object取消装箱成原始类型会导致NullPointerException,好吗?(取消对null指针的引用怎么改)

NullPointerException由于该片段未装箱成原始类型,因此Long.longValue()被称为是,所以抛出了一个片段。

甚至很容易看出您是否有如下代码段:

long value = (Long) null;

但是在NullPointerException像这样的更复杂的情况下更难实现:

long propertyValue = (Long) obj.getProperty(propertyModel.getName());

那么Java编译器是否有可能因此而做出更舒适的Exception?我更喜欢这样IllegalArgumentException的消息,例如
“您正在尝试将null对象转换为原始类型,这无法完成!”

这会更合适吗?你怎么看?在运行时甚至可能吗?我们能确定这个演员吗?我还没有看过Java字节码。也许可以在解决方案中使用它。

可以回答这个问题 :我想知道是否有可能实现这种行为!

答案1

小编典典

根据Java语言规范,拆箱是通过调用Number.longValue()Number.intValue()等进行的。没有特殊的字节码魔术发生,这与您手动调用这些方法完全相同。因此,这NullPointerException是将a拆箱的自然结果null(实际上是JLS要求的)。

引发不同的异常将需要在每次拆箱转换期间检查null 两次
(一次以确定是否引发特殊异常,而在实际调用该方法时隐式地进行一次检查)。我想语言设计者认为它没有足够的用处。

Android Studio:取消装箱“ xxx”可能会产生“ java.lang.NullPointerException”

Android Studio:取消装箱“ xxx”可能会产生“ java.lang.NullPointerException”

我正在关注Android图书示例:

//Get the drink from the intent
int drinkIdd = (Integer)getIntent().getExtras().get(EXTRA_DRINKID);
Drink drink = Drink.drinks[drinkIdd];

该项目可以在Android Studio中运行,但在线上带有黄色警告:

int drinkIdd = (Integer)getIntent().getExtras().get(EXTRA_DRINKID);

与:

info: Unboxing of '(Integer)getIntent().getExtras().get(EXTRA_DRINKID)' may produce 'java.lang.NullPointerException'

根据我的理解,get(EXTRA_DRINKID)返回一个Object,然后(Integer)将其转换为int类型,以与满足int drinkIdd

  • 您能告诉我该信息的确切含义吗,对于初学者来说,您的回答将是值得的。
  • 我可以这样写上限吗?使用 () 将getIntent()。getExtras()。get()打包为一个整体,因为它最终返回了一个对象,然后将其转换为int。
    int drinkIdd = (Integer)(getIntent().getExtras().get(EXTRA_DRINKID));
    

android – 在onDestory()中停止/释放Mediaplayer会导致NullPointerException

android – 在onDestory()中停止/释放Mediaplayer会导致NullPointerException

我试图在onDestroy()中停止并释放MediaPlayer对象,但应用程序一直在崩溃.这是代码:

void StartSound(final String ReaderPath) {
    mediaplayer = MediaPlayer.create(test2.this,Uri.parse(ReaderPath));

    try {
        mediaplayer.start();
        mediaplayer.setonCompletionListener(new OnCompletionListener() {
            @Override
            public void onCompletion(MediaPlayer mp) {
                current++;
                try {
                    mp.reset();
                    mp.setDataSource(ReaderPath);
                    mp.prepare();

                } catch (Exception e) {
                    e.printstacktrace();
                }
                mp.start();

            }
        });

    } catch (Exception e) {

    }
}

@Override
    protected void onPause() {
        if (mediaplayer != null && mediaplayer.isPlaying())
            mediaplayer.pause();
        super.onPause();

    }

    @Override
    protected void onStop() {
        if (mediaplayer != null && mediaplayer.isPlaying()) {
            mediaplayer.release();
            mediaplayer.stop();
        }
        super.onDestroy();

    }

logcat的:

08-21 22:52:26.512: E/AndroidRuntime(16410): java.lang.RuntimeException: Unable to destroy activity {com.example.test/com.example.test.test2}: java.lang.NullPointerException
08-21 22:52:26.512: E/AndroidRuntime(16410):    at android.app.ActivityThread.performDestroyActivity(ActivityThread.java:3235)
08-21 22:52:26.512: E/AndroidRuntime(16410):    at android.app.ActivityThread.handleDestroyActivity(ActivityThread.java:3253)
08-21 22:52:26.512: E/AndroidRuntime(16410):    at android.app.ActivityThread.access$1200(ActivityThread.java:132)
08-21 22:52:26.512: E/AndroidRuntime(16410):    at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1190)
08-21 22:52:26.512: E/AndroidRuntime(16410):    at android.os.Handler.dispatchMessage(Handler.java:99)
08-21 22:52:26.512: E/AndroidRuntime(16410):    at android.os.Looper.loop(Looper.java:137)
08-21 22:52:26.512: E/AndroidRuntime(16410):    at android.app.ActivityThread.main(ActivityThread.java:4575)
08-21 22:52:26.512: E/AndroidRuntime(16410):    at java.lang.reflect.Method.invokeNative(Native Method)
08-21 22:52:26.512: E/AndroidRuntime(16410):    at java.lang.reflect.Method.invoke(Method.java:511)
08-21 22:52:26.512: E/AndroidRuntime(16410):    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:786)
08-21 22:52:26.512: E/AndroidRuntime(16410):    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:553)
08-21 22:52:26.512: E/AndroidRuntime(16410):    at dalvik.system.NativeStart.main(Native Method)
08-21 22:52:26.512: E/AndroidRuntime(16410): Caused by: java.lang.NullPointerException
08-21 22:52:26.512: E/AndroidRuntime(16410):    at android.support.v4.app.FragmentManagerImpl.execPendingActions(FragmentManager.java:1406)
08-21 22:52:26.512: E/AndroidRuntime(16410):    at android.support.v4.app.FragmentManagerImpl.dispatchDestroy(FragmentManager.java:1876)
08-21 22:52:26.512: E/AndroidRuntime(16410):    at android.support.v4.app.FragmentActivity.onDestroy(FragmentActivity.java:316)
08-21 22:52:26.512: E/AndroidRuntime(16410):    at android.app.Activity.performDestroy(Activity.java:4629)
08-21 22:52:26.512: E/AndroidRuntime(16410):    at android.app.Instrumentation.callActivityOnDestroy(Instrumentation.java:1079)
08-21 22:52:26.512: E/AndroidRuntime(16410):    at android.app.ActivityThread.performDestroyActivity(ActivityThread.java:3222)
08-21 22:52:26.512: E/AndroidRuntime(16410):    ... 11 more

为什么是这样?

解决方法

你为什么要从onStop()方法调用super.onDestroy()?你应该调用super.onStop().或者是输入错误?

答案可能是您在调用release()后调用MediaPlayer上的stop().一旦调用release(),MediaPlayer就会失效并且不再可用.

android – 实现包含List的Parcelable接口的Object抛出NullPointerException

android – 实现包含List的Parcelable接口的Object抛出NullPointerException

我正在尝试使用Parcelable接口创建一个包含可对象列表的对象.我无法读回Parcel对象.

谁能指出我正确的方向?我在这里错过了什么?

MyParcelable对象:

public class MyParcelable implements Parcelable {

    private int myInt = 0;
    private List<MyListClass> arrList;

    public List<MyListClass> getArrList() {
        return arrList;
    }

    public void setArrList(List<MyListClass> arrList) {
        this.arrList = arrList;
    }

    public int getMyInt() {
        return myInt;
    }

    public void setMyInt(int myInt) {
        this.myInt = myInt;
    }

    MyParcelable() {
        // initialization
        arrList = new ArrayList<MyListClass>();
    }

    public MyParcelable(Parcel in) {
        myInt = in.readInt();
        in.readTypedList(arrList, MyListClass.CREATOR);
    }

    @Override
    public int describeContents() {
        return 0;
    }

    @Override
    public void writetoParcel(Parcel outParcel, int flags) {
        outParcel.writeInt(myInt);
        outParcel.writeTypedList(arrList);
    }

    public static final Parcelable.Creator<MyParcelable> CREATOR =
            new Parcelable.Creator<MyParcelable>() {

        @Override
        public MyParcelable createFromParcel(Parcel in) {
            return new MyParcelable(in);
        }

        @Override
        public MyParcelable[] newArray(int size) {
            return new MyParcelable[size];
        }
    };
}

MyListClass对象:

  public class MyListClass implements Parcelable{

    private int test;

    public MyListClass()
    {}

    public MyListClass(Parcel read){
        test = read.readInt();
    }

    public int gettest() {
        return test;
    }

    public void setTest(int test) {
        this.test = test;
    }

    public static final Parcelable.Creator<MyListClass> CREATOR = 
        new Parcelable.Creator<MyListClass>() {

            @Override
            public MyListClass createFromParcel(Parcel source) {
                return new MyListClass(source);
            }

            @Override
            public MyListClass[] newArray(int size) {
                return new MyListClass[size];
            }
        };

    @Override
    public int describeContents() {
        return 0;
    }

    @Override
    public void writetoParcel(Parcel arg0, int arg1) {
        arg0.writeInt(test);
    }
}

解决方法:

问题是,当MyParcelable对象的创建者调用从中重构对象的Parcel的私有构造函数时,ArrayList仍然未初始化,因此为null.

现在,方法调用readTypedList()尝试将Parcels内容写入您指定的ArrayList,该ArrayList抛出NullPointerEception,因为它尚未初始化.

解决方案是在调用该方法之前初始化ArrayList.

public MyParcelable(Parcel in) {
    myInt = in.readInt();
    arrList = new ArrayList<MyListClass>();
    in.readTypedList(arrList, MyListClass.CREATOR);
}

android – 照片捕获意图仅在Samsung手机上导致NullPointerException

android – 照片捕获意图仅在Samsung手机上导致NullPointerException

照片捕获意图仅在Samsung手机上导致NullPointerException.

下面的实现.

final Button capture = (Button)findViewById(R.id.capture_button);
capture.setonClickListener(new OnClickListener() {

    @Override
    public void onClick(View v) {
        // Todo Auto-generated method stub
        Intent cameraIntent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
        startActivityForResult(cameraIntent,CAMERA_PIC_REQUEST);

    }
});


protected void onActivityResult(int requestCode,int resultCode,Intent data) {  
    if (requestCode == CAMERA_PIC_REQUEST) {  

        Bitmap thumbnail = (Bitmap)data.getExtras().get("data");
        ImageView image = (ImageView)findViewById(R.id.photoResultView);
        image.setimageBitmap(thumbnail);
    }
}

解决方法

我发现一个修复(不是我的工作),使其适用于三星设备.有解释的博客可以找到 here.

但是,在非三星手机上使用此修复会返回错误的图像,因此我将使用

if(imageURI != null) {
    // do it the normal way
else {
    // do it the "Samsung" way
}

我们今天的关于将Null-Object取消装箱成原始类型会导致NullPointerException,好吗?取消对null指针的引用怎么改的分享已经告一段落,感谢您的关注,如果您想了解更多关于Android Studio:取消装箱“ xxx”可能会产生“ java.lang.NullPointerException”、android – 在onDestory()中停止/释放Mediaplayer会导致NullPointerException、android – 实现包含List的Parcelable接口的Object抛出NullPointerException、android – 照片捕获意图仅在Samsung手机上导致NullPointerException的相关信息,请在本站查询。

本文标签: