我的应用程序(vlcj基础音乐播放器)中有一种非常奇怪的行为。我使用 ConcurrentHashMap 来缓存有关艺术家的信息。
如果我在HashMap上调用 get ,程序似乎停止,但不会抛出任何异常。 “a”已打印出来,但“b”从未打印过。
在一个单独的线程中,我运行了死锁检查,但没有检测到死锁,我非常确定我不在另一个线程中使用Cache。
public void newMedia(MediaPlayer mediaPlayer) {
MusicListItem item = this.playListModel.getActiveItem();
System.out.println("a");
// cachedArtists = ConcurrentHashMap<String, Artist>
Artist artist = this.cachedArtists.get(item.getArtist());
System.out.println("b");
}
我找到了JVM-Bug吗?
这是我的JVM : java版“1.7.0_40” Java(TM)SE运行时环境(版本1.7.0_40-b43) Java HotSpot(TM)64位服务器VM(内置24.0-b56,混合模式)
答案 0 :(得分:1)
我在这里看到三件可能出错的事情,你可能想检查一下它们是否真的发生了(我没有足够的背景知道):
cachedArtists
可能是null
item
可能是null
(playListModel中没有活动项目)item.getArtist()
可能会出错(例外或System.exit()
)这些案例中的大多数涉及抛出异常,因此您可能会看到堆栈跟踪,但也许这会在callstack的某处被吞噬 - 再次,我没有上下文要讲。最好按照Chris的建议,通过自己将违规行包装到try...catch
块中并手动打印任何异常的堆栈跟踪来解决。
答案 1 :(得分:0)
就像Chris说的那样,我在代码中放了一个try catch块,实际上我得到了一个JavaClassCastEXception:
java.lang.ClassCastException:com.google.gson.internal.LinkedTreeMap无法强制转换为de.roth.jsona.artist.Artist
答案 2 :(得分:0)
如果程序挂起(没有终止),我猜是item.getArtist()
块。通过
System.out.println("a");
Artist key = item.getArtist();
System.out.println("b");
Artist artist = this.cachedArtists.get(key);
System.out.println("c");
(通过艺术家(?)闻到Munchhausen模式btw的气味)