Class.getClassLoader()的一个小陷阱:)

本文探讨了在Java中使用getClassLoader()方法时可能遇到的问题,特别是当类由引导加载器加载时返回null的情况,以及如何避免由此引发的空指针异常。
昨天我的code总在Integer.class.getClassLoader().getResource("*********");这一句抛出空指针异常,定位为getClassLoader()返回null,查了一下jdk的文档,原来这里还有一个陷阱:
jdk中关于getClassLoader()的描述:
/**
     * Returns the class loader for the class.  Some implementations may use
     * null to represent the bootstrap class loader. This method will return
     * null in such implementations if this class was loaded by the bootstrap
     * class loader.
     *
     * <p> If a security manager is present, and the caller's class loader is
     * not null and the caller's class loader is not the same as or an ancestor of
     * the class loader for the class whose class loader is requested, then
     * this method calls the security manager's <code>checkPermission</code>
     * method with a <code>RuntimePermission("getClassLoader")</code>
     * permission to ensure it's ok to access the class loader for the class.
     *
     * <p>If this object
     * represents a primitive type or void, null is returned.
.....

这里jdk告诉我们:如果一个类是通过bootstrap 载入的,那我们通过这个类去获得classloader的话,有些jdk的实现是会返回一个null的,比如说我用 new Object().getClass().getClassLoader()的话,会返回一个null,这样的话上面的代码就会出现NullPointer异常.所以保险起见我们最好还是使用我们自己写的类来获取classloader,这样一来就不会有问题Smile。哎,jdk呀,你怎么能这样~~~~~~~~~~~~~~~~~~
Unable to instantiate appComponentFactory java.lang.ClassNotFoundException: Didn't find class "androidx.core.app.CoreComponentFactory" on path: DexPathList[[],nativeLibraryDirectories=[/data/app/~~J258SDO7Api5tHdW19guAg==/com.dfl.threedhmi-lTSolR3TYLnFiIHscCPuqg==/lib/arm64, /data/app/~~J258SDO7Api5tHdW19guAg==/com.dfl.threedhmi-lTSolR3TYLnFiIHscCPuqg==/base.apk!/lib/arm64-v8a, /system/lib64, /system/system_ext/lib64]] at dalvik.system.BaseDexClassLoader.findClass(BaseDexClassLoader.java:207) at java.lang.ClassLoader.loadClass(ClassLoader.java:379) at java.lang.ClassLoader.loadClass(ClassLoader.java:312) at android.app.LoadedApk.createAppFactory(LoadedApk.java:260) at android.app.LoadedApk.createOrUpdateClassLoaderLocked(LoadedApk.java:902) at android.app.LoadedApk.getClassLoader(LoadedApk.java:982) at android.app.LoadedApk.getResources(LoadedApk.java:1214) at android.app.ContextImpl.createAppContext(ContextImpl.java:2777) at android.app.ContextImpl.createAppContext(ContextImpl.java:2769) at android.app.ActivityThread.handleBindApplication(ActivityThread.java:6602) at android.app.ActivityThread.access$1300(ActivityThread.java:237) at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1913) at android.os.Handler.dispatchMessage(Handler.java:106) at android.os.Looper.loop(Looper.java:223) at android.app.ActivityThread.main(ActivityThread.java:7664) at java.lang.reflect.Method.invoke(Native Method) at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:592) at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:964)
最新发布
09-04
Exception java.lang.RuntimeException: at android.app.ActivityThread.performLaunchActivity (ActivityThread.java:3888) at android.app.ActivityThread.handleLaunchActivity (ActivityThread.java:4028) at android.app.servertransaction.LaunchActivityItem.execute (LaunchActivityItem.java:103) at android.app.servertransaction.TransactionExecutor.executeCallbacks (TransactionExecutor.java:139) at android.app.servertransaction.TransactionExecutor.execute (TransactionExecutor.java:96) at android.app.ActivityThread$H.handleMessage (ActivityThread.java:2535) at android.os.Handler.dispatchMessage (Handler.java:106) at android.os.Looper.loopOnce (Looper.java:205) at android.os.Looper.loop (Looper.java:294) at android.app.ActivityThread.main (ActivityThread.java:8385) at java.lang.reflect.Method.invoke at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run (RuntimeInit.java:640) at com.android.internal.os.ZygoteInit.main (ZygoteInit.java:982) Caused by android.os.BadParcelableException: at android.os.Parcel.readValue (Parcel.java:4772) at android.os.Parcel.readValue (Parcel.java:4420) at android.os.Parcel.readSparseArrayInternal (Parcel.java:5501) at android.os.Parcel.readValue (Parcel.java:4727) at android.os.Parcel.readValue (Parcel.java:4412) at android.os.Parcel.-$$Nest$mreadValue (Unknown Source) at android.os.Parcel$LazyValue.apply (Parcel.java:4510) at android.os.Parcel$LazyValue.apply (Parcel.java:4469) at android.os.BaseBundle.unwrapLazyValueFromMapLocked (BaseBundle.java:415) at android.os.BaseBundle.getValueAt (BaseBundle.java:401) at android.os.BaseBundle.getValue (BaseBundle.java:381) at android.os.BaseBundle.getValue (BaseBundle.java:364) at android.os.BaseBundle.getValue (BaseBundle.java:357) at android.os.Bundle.getSparseParcelableArray (Bundle.java:1108) at androidx.fragment.app.FragmentStateManager.restoreState (FragmentStateManager.java:408) at androidx.fragment.app.FragmentManager.restoreSaveStateInternal (FragmentManager.java:2512) at androidx.fragment.app.FragmentManager.attachController (FragmentManager.java:2665) at androidx.fragment.app.FragmentController.attachHost (FragmentController.java:117) at androidx.fragment.app.FragmentActivity.lambda$init$3 (FragmentActivity.java:140) at androidx.activity.contextaware.ContextAwareHelper.dispatchOnContextAvailable (ContextAwareHelper.java:99) at androidx.activity.ComponentActivity.onCreate (ComponentActivity.java:362) at androidx.fragment.app.FragmentActivity.onCreate (FragmentActivity.java:217) at com.tplink.apps.architecture.BaseMvvmActivity.onCreate (BaseMvvmActivity.kt:351) at android.app.Activity.performCreate (Activity.java:8646) at android.app.Activity.performCreate (Activity.java:8624) at android.app.Instrumentation.callActivityOnCreate (Instrumentation.java:1458) at android.app.ActivityThread.performLaunchActivity (ActivityThread.java:3869) 崩溃分析
07-02
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值