在本文中,我们将为您详细介绍java.lang.ClassCastException的含义:someClass与someClass不兼容的相关知识,并且为您解答关于java.lang.classcan
在本文中,我们将为您详细介绍java.lang.ClassCastException的含义:someClass与someClass不兼容的相关知识,并且为您解答关于java.lang.class cannot be cast的疑问,此外,我们还会提供一些关于Android 之 java.lang.ClassCastException: *****cannot be cast to*******、angular – 为什么[class.someClass]和[ngClass]绑定与myObservable $|的工作方式不同异步?、ArrayMap java.lang.ClassCastException: java.lang.String cannot be cast to java.lang.Object[]、AsyncTask:ClassCastException:java.lang.Object []无法转换为java.lang.String []的有用信息。
本文目录一览:- java.lang.ClassCastException的含义:someClass与someClass不兼容(java.lang.class cannot be cast)
- Android 之 java.lang.ClassCastException: *****cannot be cast to*******
- angular – 为什么[class.someClass]和[ngClass]绑定与myObservable $|的工作方式不同异步?
- ArrayMap java.lang.ClassCastException: java.lang.String cannot be cast to java.lang.Object[]
- AsyncTask:ClassCastException:java.lang.Object []无法转换为java.lang.String []
java.lang.ClassCastException的含义:someClass与someClass不兼容(java.lang.class cannot be cast)
我在XPages应用程序中偶尔遇到异常:
java.lang.ClassCastException: someClass incompatible with someClass.
提到的两个类是相同的,它是用作会话bean的类。我无法用Google搜索涵盖我的问题的任何内容。通常的解释是设计元素的变化,而不是我的情况。
从那时起,XPage应用程序变得不可用(使用会话bean someClass的页面),直到重新启动http任务或重新保存faces-config.xml。
在某些情况下,这与其他异常有关:
com.ibm.jscript.InterpretException: Script interpreter error,line=x,col=y:
Java method 'method(signature containg someClass)'
on java class 'someOtherClass' not found
这种行为的背后是什么?
Android 之 java.lang.ClassCastException: *****cannot be cast to*******
1 问题
在写 BaseMultiItemQuickAdapter 适配器的时候,更具不同类型构建不同的实体对象,提示错误如下
2 原因
@Override
protected void convert(BaseViewHolder helper, MultiItemEntity item) {
switch (helper.getItemViewType()) {
case AppCleanHead.appCleanHeadType:
AppCleanHead headBean = (AppCleanHead)item;
case AppCleanHead.appCleanInfoType:
FluterApkInfoItem fluterApkInfoItem = (FluterApkInfoItem)item;
}
忘记了 case 下面写 break, 导致穿透构建对象失败,我真的被自己蠢哭了,下次一定要记得写了 case 一定要把 break 写上,然后再分析到底需不需要 break.
angular – 为什么[class.someClass]和[ngClass]绑定与myObservable $|的工作方式不同异步?
< li * ngFor =“让activeRooms $| async的房间”[class.active] =“room.name ===(currentRoomName $| async)”>
我发现,如果我使用[ngClass]代替它,它完美地工作:
< li * ngFor =“让activeRooms $| async的房间”[ngClass] =“{active:room.name ===(currentRoomName $| async)}”>
这是为什么?任何人都可以对此有所了解吗?
谢谢!
解决方法
>将Observable改为EventEmitter,它们的表现略有不同;您可以阅读here以获取更多信息.
>可以在角度ngzone之外的某处生成可观察事件;在这种情况下,您需要将其注入组件并通过以下方式更新您的属性:
zone.run(()=> this.prop = newValue);
这样,角度就会看到你不会看到的变化.您可以在此处阅读有关区域的更多信息:another link
ArrayMap java.lang.ClassCastException: java.lang.String cannot be cast to java.lang.Object[]
错误堆栈:
java.lang.ClassCastException: java.lang.String cannot be cast to java.lang.Object[]
at android.support.v4.util.SimpleArrayMap.allocArrays(SourceFile:183)
at android.support.v4.util.SimpleArrayMap.put(SourceFile:437)
错误原因:
由于SimpleArrayMap 里面使用了一个静态变量的缓存,mBaseCache,
static Object[] mBaseCache;
该变量默认有两个数据,第1个元素是一个object[],用于存放上次的缓存的mBaseCache
第二个元素是int[],用于存在hash。具体赋值代码可以看下面
synchronized (ArrayMap.class) {
if (mBaseCacheSize < CACHE_SIZE) {
array[0] = mBaseCache;
array[1] = hashes;
for (int i=(size<<1)-1; i>=2; i--) {
array[i] = null;
}
mBaseCache = array;
mBaseCacheSize++;
if (DEBUG) Log.d(TAG, "Storing 1x cache " + array
+ " now have " + mBaseCacheSize + " entries");
}
}
使用该数组的地方在:
SimpleArrayMap 的allocArrays 方法里
synchronized (ArrayMap.class) {
if (mBaseCache != null) {
final Object[] array = mBaseCache;
mArray = array;
mBaseCache = (Object[])array[0];
mHashes = (int[])array[1];
array[0] = array[1] = null;
mBaseCacheSize--;
if (DEBUG) Log.d(TAG, "Retrieving 1x cache " + mHashes
+ " now have " + mBaseCacheSize + " entries");
return;
}
}
下面这段代码是有风险的,如果mBaseCache 在多线程被修改了,就会把ClassCastException 异常。
mBaseCache = (Object[])array[0];
解决方法:
如果项目某个地方报这个错误,请把这个地方的ArrayMap替换成 HasMap. HasMap 多线程不会崩溃,虽然,他不是特别完好的支持。不需要把项目中所有的地方都替换掉,没有必要。单独线程,ArrayMap 完全没有问题。
错误复现:这个复现起来超级麻烦,我花了一周的时间,才找到复现的漏洞,分享给大家:
/**
* 复现该问题 用了四个线程
* java.lang.ClassCastException: java.lang.String cannot be cast to java.lang.Object[]
* at android.support.v4.util.SimpleArrayMap.allocArrays(SimpleArrayMap.java:157)
* at android.support.v4.util.SimpleArrayMap.put(SimpleArrayMap.java:399)
* at com.example.fragment.MainFragment$14.run(MainFragment.java:280)
* 1.首先 线程1 执行到put 方法的
* mArray[index<<1] = key;
* mArray[(index<<1)+1] = value;
* mSize++;
* return null;
* 最上面这个位置 目的是让这个数组不再是空的
*
* 2.执行线程2 也执行到
* mArray[index<<1] = key;
* mArray[(index<<1)+1] = value;
* mSize++;
* return null;
* 最上面这个位置 目的是让这个put 的东西,放在第0个位置,因为put里面会生成index,
* 让两个线程都放到index 是0 的位置
*
* 3.把线程1执行完,这样数据里面已经放进去一个数据了
*
* 4.执行线程3 到removeAt 方法的 freeArrays 的 mBaseCache = array; 之前
* public V removeAt(int index) {
* final Object old = mArray[(index << 1) + 1];
* if (mSize <= 1) {
* // Now empty.
* if (DEBUG) Log.d(TAG, "remove: shrink from " + mHashes.length + " to 0");
* freeArrays(mHashes, mArray, mSize);
*
* mBaseCache = array;----------- freeArrays
*
* 这个的目的是调用freeArray 方法,让当前的map释放当前的数组。这样就可以生成mBaseCache了
*
* 5.把线程2 执行完
* 这样就会把mBaseCache 赋值的数组,重新赋值
*
* 6.把线程3执行完
* ok,现在mBaseCache已经被污染了
*
* 7.执行线程4
*
*/
private void CMETestCastException() {
final ArrayMap testArrayMap = new ArrayMap();
final ArrayMap testArrayMap2 = new ArrayMap();
new Thread("线程1"){
@Override
public void run() {
super.run();
testArrayMap.put("2324","fffff");
}
}.start();
new Thread("线程2"){
@Override
public void run() {
super.run();
testArrayMap.put("test","string");
}
}.start();
new Thread("线程3"){
@Override
public void run() {
super.run();
testArrayMap.removeAt(0);
}
}.start();
new Thread("线程4"){
@Override
public void run() {
super.run();
testArrayMap2.put("aaa","string");
}
}.start();
}
复现这个问题的时候,关键是把mBaseCache 污染掉。这里四个线程的话,需要调试,调试步骤就是上面我注释的。
总结:
如果当前的map 会有多个线程访问,请使用HasMap. 该问题,google 并没有解决。在高版本上,直接扔CME ConcurrentModificationException.
AsyncTask:ClassCastException:java.lang.Object []无法转换为java.lang.String []
在我的应用程序中,我为gcm ccs(xmpp)运行这些代码,并且代码显示以下错误执行时发生错误doinbackground.excute()
这是代码:
sendTask = new AsyncTask<String, String, String>() { protected String doInBackground(String... title) { Bundle data = new Bundle(); data.putString("ACTION", action); data.putString("CLIENT_MESSAGE", "Hello GCM CCS XMPP!"); String id = Integer.toString(ccsMsgId.incrementAndGet()); try { Log.d("RegisterActivity", "messageid: " + id); gcm.send(SENDER_ID + "@gcm.googleapis.com", id, data); Log.d("RegisterActivity", "After gcm.send successful."); } catch (IOException e) { Log.d("RegisterActivity", "Exception: " + e); e.printStackTrace(); } return "Sent message."; } protected void onPostExecute(String result) { sendTask = null; // tosat about the success in return }};sendTask.execute(null, null, null);
答案1
小编典典您如何sendTask
申报?我想它是简单的AsyncTask sendTask;
,如果是这样,请将其更改为:
AsyncTask<String, String, String> sendTask;
此异常的原因与以下代码中发生的原因类似:
Object arr1[] = new Object[] {null,null,null};String arr2[] = (String[])arr1; // here java.lang.ClassCastException: [Ljava.lang.Object; cannot be cast to [Ljava.lang.String;
Java中的VarArgs是作为数组实现的,因此,当您AsyncTask<String, String,String>
将sendTask声明为as时,编译器将doInBackground
使用with进行调用newString[]{null,null,null}
,但是当您将AsyncTask
then 声明为then
时,则将doInBackground
使用with进行调用new Object[]{null,null,null}
。
由于类型擦除,编译器将添加隐藏的隐式强制类型从Object[]
到String[]
。这是为了允许以下代码正常工作:
AsyncTask sendTask = ...; Object[] arg = new String[]{null,null,null}; sendTask.execute(arg);
关于java.lang.ClassCastException的含义:someClass与someClass不兼容和java.lang.class cannot be cast的介绍现已完结,谢谢您的耐心阅读,如果想了解更多关于Android 之 java.lang.ClassCastException: *****cannot be cast to*******、angular – 为什么[class.someClass]和[ngClass]绑定与myObservable $|的工作方式不同异步?、ArrayMap java.lang.ClassCastException: java.lang.String cannot be cast to java.lang.Object[]、AsyncTask:ClassCastException:java.lang.Object []无法转换为java.lang.String []的相关知识,请在本站寻找。
本文标签: