Android 关于类重写toString的坑
背景:厂商反馈通过外调sdk播放器回调获取到的void onPlayMusic(Music music)中的music对象为null。
得知这个问题之后添加了log通过demo测试,发现客户端和服务端都可以获取到music中的属性。无法复现此问题。继续跟厂商沟通对方使用如下方式显示log。
Log.d(“TAG”, " — mPlayStateListener — onPlayMusic = " + music);
抓取log输出结果:
KaoLaManager: — mPlayStateListener — onPlayMusic = null
通过分析代码流程服务端传过去的确实是一个不为null的对象。那为什么客户端接受显示为null。
解决:最后在Music类中发现有人重写了toString的方法
//重写了toString方法,并且只显示其中一个重要属性
public String toString() {
return this.audioName;
}
由于这个属性存在null的情况,打印log的时候直接使用music,默认调用了toString的方法。获取到的这个属性刚好是null,导致让别人误以为music对象是null的情况。
总结:这么写toString的直接祭天吧!
一般重写的方式:
@Override
public String toString() {
return "Music{" +
"audioName=" + audioName +
", audioId='" + audioId + '\'' +
'}';
}
哪怕你只用其中一个属性,也要用Music{显示的内容}这种方式(类名{属性})。
心累…吃一堑长一智!