J2SE ve Android projelerinde kullanmak istediğim platform bağımsız bir kitaplık hazırladım. Bu kitaplık içinde, sürüm ayrıntılarını bildiriden yükleyen bir Version
sınıfına sahibim. PC'de bu iyi çalışıyor, Android'de bir NullPointerException
alıyorum ve nedenini anlayamıyorum. Class.getResource (className) bana veren NullPointerException
Bu
benim sınıftır: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;
}
}
(System.err.println()
satırları Lütfen bağışlayın, bu PC'de ayıklama içindir).
Bu neden bilgisayarda iyi çalışıyor, ancak Android'de çalışmıyor?
Tam yığın takibi:
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
Güncelleme: hem PC hem Android'de className
= Version.class
. PC'de getSimpleName()
yerine getName()
'u kullanmak ve hala Android'de çalışmaz. clazz.getResource(className)
className
tarafından belirtilen kaynağı anlamına gelen null
dönüyor yöntem çağrısı bulunamadığı çünkü
Yığın izleme? ... – Matt
o satır atılan satırda yorumladı ... – WarrenFaith
Sadece durumda durumda yığın izleme ekledi. Çok işe yaramıyor:/ – Logan