在课程后面我用来创建一个MediaPlayer对象和。这很好用
md.start();
但问题是Klocwork分析师说
NPE.COND:'md'的空指针解除引用,其中null来自条件:Java:PatientAlarm.java:Critical(1):Analyze:Local
发生在下面一行
abc001 -> abc001 ## stays name ##
efg.fqdn.com -> efg ## only 1st/short name ##
mnop-int -> mnop ## only 1st/short name ##
help-adm.fqdn -> help ## only 1st/short name ##
我不知道它的意思。在启动md之前,我检查它是否为空。
请指导我使我的代码更可靠以及如何解决此问题,
答案 0 :(得分:2)
你完全搞砸了面向对象编程的概念。
您定义了PatientAlarm
类来封装使用MediaPlayer
的所有逻辑。没关系。
但是你为什么要把所有方法都设为静态?为什么new PatientAlarm()
在这些方法中调用并创建了实例,甚至没有分配给某个使其成为垃圾收集目标的变量或字段?
这是你应该如何做的例子:
public class PatientAlarm {
private MediaPlayer md;
public PatientAlarm(Context context) {
md = MediaPlayer.create(context, R.raw.patient_alarm);
md.setLooping(true);
md.prepare();
}
public void start() {
if (!md.isPlaying()) {
md.start();
}
}
public void stop() {
if (md.isPlaying()) {
md.stop();
}
}
}
根据您的情况对其进行调整,并详细了解如何使用MediaPlayer
类。
答案 1 :(得分:0)
md.start();线?有两个...无论如何你的代码完全容易受到并发问题的影响,你可能会读到关于锁定以防止它的问题,但是在你进入高级的东西之前我会开始重构。创建一个新对象只是为了初始化类的静态成员可能是我见过的单例最丑陋的方法。如果你真的需要,使用静态方法为你做,至少不会是一个新的对象用于GC收集。但事实上,在你的例子中使用静态对象似乎首先是一个错过。尝试在没有静态字段或方法的情况下重写它,并且很可能您的代码将更简单,更可靠。