Java奇怪的行为:程序取消但不抛出异常

时间:2013-12-06 09:30:17

标签: java

我的应用程序(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,混合模式)

3 个答案:

答案 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的气味)