【问题标题】:error while casting a synchronized LinkedList投射同步的 LinkedList 时出错
【发布时间】:2013-08-26 23:02:48
【问题描述】:

我有一个简单的代码:

private List<String> requests = Collections.synchronizedList(new LinkedList<String>());

synchronized (requests) {
    ((LinkedList<String>)requests).addLast(message);
}

在运行时我收到此错误:

FATAL EXCEPTION: main
java.lang.IllegalStateException: Could not execute method of the activity
    at android.view.View$1.onClick(View.java:2144)
    at android.view.View.performClick(View.java:2485)
    at android.view.View$PerformClick.run(View.java:9080)
    at android.os.Handler.handleCallback(Handler.java:587)
    at android.os.Handler.dispatchMessage(Handler.java:92)
    at android.os.Looper.loop(Looper.java:123)
    at android.app.ActivityThread.main(ActivityThread.java:3683)
    at java.lang.reflect.Method.invokeNative(Native Method)
    at java.lang.reflect.Method.invoke(Method.java:507)
    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:839)
    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:597)
    at dalvik.system.NativeStart.main(Native Method)
Caused by: java.lang.reflect.InvocationTargetException
    at java.lang.reflect.Method.invokeNative(Native Method)
    at java.lang.reflect.Method.invoke(Method.java:507)
    at android.view.View$1.onClick(View.java:2139)
    ... 11 more
Caused by: java.lang.ClassCastException: java.util.Collections$SynchronizedList
    at com.countryst.nabard.turnbased.client.networking.ClientNetworking.login(ClientNetworking.java:72)
    at com.countryst.nabard.turnbased.client.MainActivity.loginToServer(MainActivity.java:87)
    at com.countryst.nabard.turnbased.client.MainActivity.onButtonClicked(MainActivity.java:217)
    ... 14 more

这是一个 android 程序的一部分,我的纯 java 代码中有类似的代码并且工作正常。

【问题讨论】:

  • ClientNetworking.java 的第 72 行在哪里?
  • 这一行:((LinkedList)requests).addLast(message); T.J. 的解决方案对我有用

标签: java android linked-list synchronized


【解决方案1】:

synchronizedList 没有记录它会返回一些可以被强制转换回底层列表的东西,只是它返回了一些实现了同步的List&lt;E&gt; 的东西。

如果您需要使用特定于LinkedList 的方法,请保留对原始列表的引用:

private LinkedList<String> requestsLinkedList = new LinkedList<String>();
private List<String> requests = Collections.synchronizedList(requestsLinkedList);

然后像这样同步:

synchronized (requests) {
    requestsLinkedList.addLast(message);
}

但在这种情况下,您不需要这样做,因为LinkedList#addLast 等价于List#add

【讨论】:

    猜你喜欢
    • 2017-03-17
    • 2014-09-01
    • 1970-01-01
    • 2016-03-11
    • 2017-12-29
    • 2019-01-03
    • 1970-01-01
    • 2021-05-28
    • 1970-01-01
    相关资源
    最近更新 更多