java – Class. Getresource (classname) gave me NullPointerException
I have built a platform - independent library and I want to use it in J2SE and Android projects In this library, I have a version class that loads its version details from the list It works well on PC. I get a NullPointerException on Android. I can't find out the reason
This is my class:
public class Version { private static int APPCODE = 12354; private static int MAJOR; private static int MINOR; private static char RELEASE; private static int BUILD; private static int PROTOCOL; static { try { Class clazz = Version.class; String className = clazz.getSimpleName() + ".class"; String classPath = clazz.getResource(className).toString(); //NullPointerException if (classPath.startsWith("jar")) { String manifestPath = classPath.substring(0,classPath.lastIndexOf("!") + 1) + "/Meta-INF/MANIFEST.MF"; Manifest manifest = new Manifest(new URL(manifestPath).openStream()); Attributes attr = manifest.getMainAttributes(); //APPCODE = Integer.parseInt(attr.getValue("APPCODE")); MAJOR = Integer.parseInt(attr.getValue("MAJOR")); MINOR = Integer.parseInt(attr.getValue("MINOR")); RELEASE = attr.getValue("RELEASE").charAt(0); BUILD = Integer.parseInt(attr.getValue("BUILD")); PROTOCOL = Integer.parseInt(attr.getValue("PROTOCOL")); } else { System.err.println("Couldn't find manifest,reverting to test mode"); MAJOR = 0; MINOR = 0; RELEASE = 'n'; BUILD = 0; //APPCODE = 12354; } } catch (IOException e) { System.err.println("Failed to load manifest file. " + e); MAJOR = 0; MINOR = 0; RELEASE = '0'; BUILD = 0; //APPCODE = 12354; PROTOCOL = 0; } catch (NumberFormatException e) { System.err.println("Failed to load manifest file. " + e); MAJOR = 0; MINOR = 0; RELEASE = '0'; BUILD = 0; //APPCODE = 12354; PROTOCOL = 0; } } public static int getProtocol() { return PROTOCOL; } public static int getAppCode() { return APPCODE; } public static int getBuildNumber() { return BUILD; } public static int getMajor() { return MAJOR; } public static int getMinor() { return MINOR; } public static char getRelease() { return RELEASE; } }
(please forgive the system. Err. Println () lines, which are used for debugging on the PC)
Why does this work well on a PC but not on Android?
Full stack trace:
03-12 22:13:11.687: E/AndroidRuntime(11780): FATAL EXCEPTION: main 03-12 22:13:11.687: E/AndroidRuntime(11780): java.lang.ExceptionInInitializerError 03-12 22:13:11.687: E/AndroidRuntime(11780): at com.logandam.wififileshare.android.MainActivity.onCreate(MainActivity.java:24) 03-12 22:13:11.687: E/AndroidRuntime(11780): at android.app.Activity.performCreate(Activity.java:4465) 03-12 22:13:11.687: E/AndroidRuntime(11780): at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1052) 03-12 22:13:11.687: E/AndroidRuntime(11780): at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1932) 03-12 22:13:11.687: E/AndroidRuntime(11780): at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:1993) 03-12 22:13:11.687: E/AndroidRuntime(11780): at android.app.ActivityThread.access$600(ActivityThread.java:127) 03-12 22:13:11.687: E/AndroidRuntime(11780): at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1159) 03-12 22:13:11.687: E/AndroidRuntime(11780): at android.os.Handler.dispatchMessage(Handler.java:99) 03-12 22:13:11.687: E/AndroidRuntime(11780): at android.os.Looper.loop(Looper.java:137) 03-12 22:13:11.687: E/AndroidRuntime(11780): at android.app.ActivityThread.main(ActivityThread.java:4507) 03-12 22:13:11.687: E/AndroidRuntime(11780): at java.lang.reflect.Method.invokeNative(Native Method) 03-12 22:13:11.687: E/AndroidRuntime(11780): at java.lang.reflect.Method.invoke(Method.java:511) 03-12 22:13:11.687: E/AndroidRuntime(11780): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:790) 03-12 22:13:11.687: E/AndroidRuntime(11780): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:557) 03-12 22:13:11.687: E/AndroidRuntime(11780): at dalvik.system.NativeStart.main(Native Method) 03-12 22:13:11.687: E/AndroidRuntime(11780): Caused by: java.lang.NullPointerException 03-12 22:13:11.687: E/AndroidRuntime(11780): at com.logandam.wififileshare.net.Version.<clinit>(Version.java:30) 03-12 22:13:11.687: E/AndroidRuntime(11780): ... 15 more
Update: classname = version on PC and Android class. Using getname () instead of getsimplename () interrupt on PC still can't run on Android
Solution
I'm not 100% sure, but I don't think this mechanism is like that in a real JVM under Android (because Dalvik is not a JVM in essence) I think (I may be wrong here) that the jar no longer exists in the packaged APK, so your resource path may be wrong Your jar class will be converted to the DEX file format and added to the classes dex file. Therefore, you cannot resolve something like foo bar. Class because it does not exist in the classpath
Try to put the version information into a text (or other resource) file, add it to the jar and read it The resource file should be added correctly, and you should be able to read it using this mechanism