Java 简单if语句似乎没有执行部分代码
当我按下按钮时,下面的代码被调用。如果Java 简单if语句似乎没有执行部分代码,java,android,if-statement,Java,Android,If Statement,当我按下按钮时,下面的代码被调用。如果currentImageButton为空,并且它的Drawable为空(这将是它第一次被调用),则只需将消息打印到控制台即可。否则,将画布的背景设置为可绘制文件夹中的图像。我知道这种情况有时是真的,因为在第一次按下按钮后,“currentImageButton确实有一个图形缓存” ImageButton imageButton = (ImageButton) view; if (currentImageBut
currentImageButton
为空,并且它的Drawable
为空(这将是它第一次被调用),则只需将消息打印到控制台即可。否则,将画布的背景设置为可绘制文件夹中的图像。我知道这种情况有时是真的,因为在第一次按下按钮后,“currentImageButton确实有一个图形缓存”
ImageButton imageButton = (ImageButton) view;
if (currentImageButton != null && currentImageButton.getDrawable() != null) {
Drawable myDrawable = getResources().getDrawable(R.drawable.start_checklist_pressed);
Bitmap anImage = ((BitmapDrawable) myDrawable).getBitmap();
canvas.drawBitmap(anImage);
System.out.println("currentImageButton DOES have a drawing cache");
} else {
System.out.println("currentImageButton has no drawing cache");
}
currentImageButton = imageButton;
但是,当条件为true时,画布的背景永远不会设置。奇怪的是,我知道这些代码行是有效的,因为当我把最后一行放在第一行下面时,一切都完美地工作了,尽管这一行似乎与背景是否设置完全无关。此代码适用于:
ImageButton imageButton = (ImageButton) view;
currentImageButton = imageButton;
if (currentImageButton != null && currentImageButton.getDrawable() != null) {
Drawable myDrawable = getResources().getDrawable(R.drawable.start_checklist_pressed);
Bitmap anImage = ((BitmapDrawable) myDrawable).getBitmap();
canvas.drawBitmap(anImage);
System.out.println("currentImageButton DOES have a drawing cache");
} else {
System.out.println("currentImageButton has no drawing cache");
}
这是怎么回事
编辑
还有一件奇怪的事。如果我将条件更改为或:
if (currentImageButton != null || currentImageButton.getDrawable() != null)
我在这一行得到一个空指针异常。在检查null时,如何可能引发null指针异常
java.lang.NullPointerException
at com.brettrosen.atls.fragments.PrearrivalPlan$6.onClick(PrearrivalPlan.java:416)
at android.view.View.performClick(View.java:4192)
at android.view.View$PerformClick.run(View.java:17327)
at android.os.Handler.handleCallback(Handler.java:725)
at android.os.Handler.dispatchMessage(Handler.java:92)
at android.os.Looper.loop(Looper.java:137)
at android.app.ActivityThread.main(ActivityThread.java:5019)
at java.lang.reflect.Method.invokeNative(Native Method)
at java.lang.reflect.Method.invoke(Method.java:511)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:793)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:560)
at dalvik.system.NativeStart.main(Native Method)
EDIT2
currentImageButton作为全局变量声明如下:
public ImageButton currentImageButton;
EDIT3
我当前的实现。第一次单击按钮时,它无法正常工作。第二次单击时,它通过了条件,但画布的背景仍未设置
Drawable d = imageButton.getDrawable();
if (d != null) {
Drawable myDrawable = getResources().getDrawable(R.drawable.start_checklist_pressed);
Bitmap anImage = ((BitmapDrawable) myDrawable).getBitmap();
canvas.drawBitmap(anImage);
System.out.println("worked");
} else {
System.out.println("didnt work");
}
我在这里看到的问题是,您的
currentImageButton
可能正在使用一些垃圾引用进行初始化,因此不等于null的值将变为有效值,然后调用您的currentImageButton.getDrawable()
,这将导致内部调用中出现NPE。在有效的代码中,在if条件之前有currentImageButton=imageButton
我相信这应该能解决问题
public ImageButton currentImageButton=null;
我在这里看到的问题是,您的
currentImageButton
可能正在使用一些垃圾引用进行初始化,因此不等于null的值将变为有效值,然后调用您的currentImageButton.getDrawable()
,这将导致内部调用中出现NPE。在有效的代码中,在if条件之前有currentImageButton=imageButton
我相信这应该能解决问题
public ImageButton currentImageButton=null;
|
必须对这两条语句求值,看看它们是否都是真的。因此,如果currentImageButton
为null
,它仍然需要检查currentImageButton.getDrawable()
是否为null
,并且。。。NPE.您应该共享stacktrace,让任何人告诉您为什么会得到空点您不显示currentImageButton
声明的位置,但是在使用之前设置值与在使用之后设置值不能期望做相同的事情。在第一个版本中,您使用的是它之前可能具有的任何值。PrearrivalPlan.java中第416行的内容是什么?一个完整的stacktrace在这里调试会很方便。(您没有在这里包括stacktrace的一部分引起的)执行以下操作:public ImageButton currentImageButton=null<代码>| |必须计算这两个语句,以查看它们是否都是真的。因此,如果currentImageButton
为null
,它仍然需要检查currentImageButton.getDrawable()
是否为null
,并且。。。NPE.您应该共享stacktrace,让任何人告诉您为什么会得到空点您不显示currentImageButton
声明的位置,但是在使用之前设置值与在使用之后设置值不能期望做相同的事情。在第一个版本中,您使用的是它之前可能具有的任何值。PrearrivalPlan.java中第416行的内容是什么?一个完整的stacktrace在这里调试会很方便。(您没有在这里包括stacktrace的一部分引起的)执行以下操作:public ImageButton currentImageButton=null;我试图使用更好的实现,并将if语句更改为Drawable d=imageButton.getDrawable()代码>if(((BitmapDrawable)d).getBitmap()!=null){
,但这会抛出一个NPE。我不明白检查null是如何抛出一个NPE的?@Brejuro:拥有完整的堆栈跟踪将非常方便。此外,也许你应该修改你的问题,为任何人提供更多细节,以便复制你的问题。@Brejuro如果图像按钮上没有可绘制的设置,请调用ImageButtonn、 getDrawable()
将返回null。因此,d.getBitmap()
中的变量d
引用的是`null,您在那里得到了NPE。我正在尝试使用更好的实现,我将if语句更改为Drawable d=imageButton.getDrawable();
if((BitmapDrawable)d)。GetBitBitmap()!=null){
,但这会抛出一个NPE。我不明白检查null是如何抛出一个NPE的?@Brejuro:拥有完整的堆栈跟踪将非常方便。此外,也许你应该修改你的问题,为任何人提供更多细节,以便复制你的问题。@Brejuro如果图像按钮上没有可绘制的设置,请调用ImageButtonn、 getDrawable()
将返回null。因此,在d.getBitmap()
中,变量d
引用的是`null,您在那里得到了NPE。