我在android中有一个简单的活动程序.基本上这个类只是扩展Activity.但是当我启动它时,我在我的类的构造函数中得到一个ClassCastException.我甚至没有定义构造函数,所以它必须在超类的构造函数中是Activity.
不幸的是,调试器没有提供有关它正在尝试强制转换的类的任何详细信息.
这是堆栈跟踪:
Thread [<1> main] (Suspended (exception RuntimeException))
ActivityThread$PackageInfo.makeApplication(boolean, Instrumentation) line: 649
ActivityThread.handleBindApplication(ActivityThread$AppBindData) line: 4232
ActivityThread.access$3000(ActivityThread, ActivityThread$AppBindData) line: 125
ActivityThread$H.handleMessage(Message) line: 2071
ActivityThread$H(Handler).dispatchMessage(Message) line: 99
Looper.loop() line: 123
ActivityThread.main(String[]) line: 4627
Method.invokeNative(Object, Object[], Class, Class[], Class, int, boolean) line: not available [native method]
Method.invoke(Object, Object...) line: 521
ZygoteInit$MethodAndArgsCaller.run() line: 868
ZygoteInit.main(String[]) line: 626
NativeStart.main(String[]) line: not available [native method]
Run Code Online (Sandbox Code Playgroud)
当我查看runtimeexception时,我得到:
detailMessage "Unable to instantiate application com.test.MyApp: java.lang.ClassCastException: com.test.MyApp" (id=830067694464)
唯一的代码是
package com.test;
import android.app.Activity;
public class MyApp extends Activity …Run Code Online (Sandbox Code Playgroud) List<MyClass> myclassList = (List<MyClass>) rs.get();
TreeSet<MyClass> myclassSet = new TreeSet<MyClass>(myclassList);
Run Code Online (Sandbox Code Playgroud)
我不明白为什么这段代码生成这个:
java.lang.ClassCastException: MyClass cannot be cast to java.lang.Comparable
Run Code Online (Sandbox Code Playgroud)
MyClass没有实现Comparable.我只想使用Set来过滤List的唯一元素,因为我的List包含不必要的重复项.
我打电话给一个getElements返回的方法Iterable<Element>.
我这样做了:
List<Element> elements = (List<Element>) getElements();
Run Code Online (Sandbox Code Playgroud)
这会生成错误:
java.lang.ClassCastException: com.utesy.Element$3
cannot be cast to java.util.List
Run Code Online (Sandbox Code Playgroud)
我以为List是一种Iterable?
在我们的一个数据结构的反序列化过程中(使用默认机制(没有自定义writeObject/readObject)),会出现一个ImmutableMap $ SerializedForm实例(来自google的Guava库).
这样的实例不应该从guava的客户端看到,因为SerializedForm的实例被替换为readResolve(参见com.google.common.collect.Immutable类中的"writeReplace").
因此反序列化失败,并显示以下消息:
java.lang.ClassCastException: cannot assign instance of com.google.common.collect.ImmutableMap$SerializedForm
to field .. of type java.util.Map in instance of com.blah.C
Run Code Online (Sandbox Code Playgroud)
这是正确的,因为ImmutableMap $ SerializedForm不是java.util.Map的子类型,但它应该被替换.出了什么问题?
我们在com.blah.C类中没有自定义的writeObject/readObject.我们在父对象(包含com.blah.C)中有自定义序列化代码.
更新,这是堆栈跟踪的顶部:
java.lang.ClassCastException: cannot assign instance of com.google.common.collect.ImmutableSet$SerializedForm to field com.blah.ast.Automaton.bodyNodes of type java.util.Set in instance of com.blah.ast.Automaton
at java.io.ObjectStreamClass$FieldReflector.setObjFieldValues(ObjectStreamClass.java:2039)
at java.io.ObjectStreamClass.setObjFieldValues(ObjectStreamClass.java:1212)
at java.io.ObjectInputStream.defaultReadFields(ObjectInputStream.java:1952)
at java.io.ObjectInputStream.readSerialData(ObjectInputStream.java:1870)
at java.io.ObjectInputStream.readOrdinaryObject(ObjectInputStream.java:1752)
at java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1328)
at java.io.ObjectInputStream.readObject(ObjectInputStream.java:350)
at java.util.ArrayList.readObject(ArrayList.java:593)
at sun.reflect.GeneratedMethodAccessor9.invoke(Unknown Source)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
at java.lang.reflect.Method.invoke(Method.java:597)
at java.io.ObjectStreamClass.invokeReadObject(ObjectStreamClass.java:974)
at java.io.ObjectInputStream.readSerialData(ObjectInputStream.java:1848)
at java.io.ObjectInputStream.readOrdinaryObject(ObjectInputStream.java:1752)
at java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1328)
at java.io.ObjectInputStream.defaultReadFields(ObjectInputStream.java:1946)
at java.io.ObjectInputStream.defaultReadObject(ObjectInputStream.java:479)
at com.blah.ast.AstNode.readObject(AstNode.java:189)
at …Run Code Online (Sandbox Code Playgroud) 有一个java.lang.ClassCastException当我试图让安装的应用程序图标.
这是我的代码.
public Bitmap getAppIcon(String path) {
PackageInfo pi = pm.getPackageArchiveInfo(path, 0);
pi.applicationInfo.sourceDir = path;
pi.applicationInfo.publicSourceDir = path;
Drawable icon = pi.applicationInfo.loadIcon(pm);
Bitmap APKicon = ((BitmapDrawable) icon).getBitmap();
return APKicon;
}
Run Code Online (Sandbox Code Playgroud)
在哪里,pm是
PackageManager pm = getPackageManager();
Run Code Online (Sandbox Code Playgroud)
并且显示的错误LogCat是
Caused by: java.lang.ClassCastException: android.graphics.drawable.NinePatchDrawable cannot be cast to android.graphics.drawable.BitmapDrawable
Run Code Online (Sandbox Code Playgroud)
希望有人可以帮助我.
我们目前正在将应用程序从Java 7迁移到Java 8.在修复了一些编译问题之后,我偶然发现了类似于以下问题的问题:ClassCast错误:Java 7与Java 8.
总而言之,这是一个显示问题的示例代码:
public class Test {
public static void main(String[] args) {
System.out.println(String.valueOf(getVal("xxx"))); // 7: prints the result, 8: Exception
}
@SuppressWarnings("unchecked")
public static <T> T getVal(String param) {
// do some computation based on param...
return (T) result; // actual return type only depends on param so the caller knows what to expect
}
}
Run Code Online (Sandbox Code Playgroud)
我们的想法是,我们会强调调用者知道预期的类型,这将避免他明确的演员(我不认为这是一个好主意......).在很多情况下,调用者只是期望一个,Object所以根本就没有隐式转换.
如上面的问题中所述,该String.valueOf示例在Java 7中运行良好,因为没有类型推断,因此Object被假设.现在在Java 8中,编译器选择最具体的类型(此处char[]),这会导致ClastCastException运行时.
问题是我们有大约350次调用此getVal …
我正在使用使用 Java 11 构建的微服务,该服务具有在 Java 8 中构建的依赖项。依赖项中有 rest-clients,并且有一种方法可以执行此操作:
public <T> ResponseEntity<my.company.Wrapper<T>> getForList(String url, HttpHeaders headers) {
try {
return template.exchange(url, GET, new HttpEntity<>(headers), new ParameterizedTypeReference<Wrapper<T>>() { });
} catch (RestClientException restEx) {
logger.error("RestClientException!, restEx: {}", restEx);
throw restEx;
}
}
Run Code Online (Sandbox Code Playgroud)
休息调用刚刚成功,
response -> <200,Wrapper [ elements = [{id=dbfc2557-1738-45e4-8ecd-235d35158957, .....
然后,在微服务(使用 Java 11)中,当它使用 java Stream 时有一点:
var found = enttsResponse.stream()
.map(MyCompanyResponse::getId)
.collect( toList() );
Run Code Online (Sandbox Code Playgroud)
异常消息是:
java.lang.ClassCastException: class java.util.LinkedHashMap cannot be cast to class com.mycompany.commons.v2.entitlement.MyCompanyResponse (java.util.LinkedHashMap is in module java.base of loader …Run Code Online (Sandbox Code Playgroud) 我有这个代码:
val profile: UserProfile = userApi.profile()
@GET("users/profile")
suspend fun profile(): UserProfile
Run Code Online (Sandbox Code Playgroud)
当我运行 userApi.profile() 时,我收到此错误:
java.lang.ClassCastException: java.lang.Class cannot be cast to java.lang.reflect.ParameterizedType
Run Code Online (Sandbox Code Playgroud)
详细信息:我更新了 gradle、一些库、kotlin 版本和 android studio。该代码在更新之前曾经有效。后端方面没有任何变化。
更新:看起来所有 api 调用都会发生这种情况,而不仅仅是这个。
retrofitVersion = 2.9.0
kotlinVersion = 1.8.10
gradle = 8.0
Run Code Online (Sandbox Code Playgroud) android classcastexception android-gradle-plugin retrofit2 android-r8
我想AlertDialog用3个按钮写一个.如果不满足某个条件,我希望禁用中间的中性按钮.
码
int playerint = settings.getPlayerInt();
int monsterint = settings.getMonsterInt();
AlertDialog.Builder alertbox = new AlertDialog.Builder(this);
alertbox.setMessage("You have Encountered a Monster");
alertbox.setPositiveButton("Fight!",
new DialogInterface.OnClickListener() {
// do something when the button is clicked
public void onClick(DialogInterface arg0, int arg1) {
createMonster();
fight();
}
});
alertbox.setNeutralButton("Try to Outwit",
new DialogInterface.OnClickListener() {
// do something when the button is clicked
public void onClick(DialogInterface arg0, int arg1) {
// This should not be static
// createTrivia();
trivia();
}
});
// Return to …Run Code Online (Sandbox Code Playgroud) 更新 - 使问题更清楚.
在通过反射调用方法时获取ClassCastException的可能原因是什么?
在尝试通过反射调用方法时,我将以下stacktrace作为我的应用程序的一部分.
java.lang.IllegalArgumentException: java.lang.ClassCastException@21fea1fv
at sun.reflect.GeneratedMethodAccessor332.invoke(Unknown Source)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
at java.lang.reflect.Method.invoke(Method.java:597)
at com.....
(remaining is my method stack trace)
Run Code Online (Sandbox Code Playgroud)
我尝试了一个示例类,并将不同类型的各种参数传递给它,但我总是得到一个这个例外.
java.lang.IllegalArgumentException: argument type mismatch
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
at java.lang.reflect.Method.invoke(Method.java:597)
Run Code Online (Sandbox Code Playgroud)
更新 - 这是我为尝试重新创建异常而编写的示例代码
用于创建代理类的接口
package my.tests;
public interface ReflectionsInterface {
public abstract void doSomething();
}
Run Code Online (Sandbox Code Playgroud)
这是测试类
package my.tests;
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;
public class Reflections implements ReflectionsInterface {
public static void main(String[] args) {
Reflections reflections = new Reflections();
ReflectionsInterface reflectionsProxy = …Run Code Online (Sandbox Code Playgroud) java ×7
android ×4
java-8 ×2
android-r8 ×1
bitmap ×1
generics ×1
guava ×1
iterable ×1
java-11 ×1
list ×1
nine-patch ×1
overloading ×1
reflection ×1
retrofit2 ×1
startup ×1