android-material-icons icon indicating copy to clipboard operation
android-material-icons copied to clipboard

NPE in Utils

Open ened opened this issue 9 years ago • 2 comments

Just received a crash report on Android 4.1.2:

Fatal Exception: java.lang.RuntimeException: Unable to start activity ComponentInfo{com.company.app/com.company.app.activity.HomeActivity_}: android.view.InflateException: Binary XML file line #71: Error inflating class com.malinskiy.materialicons.widget.IconButton
       at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2067)
       at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2092)
       at android.app.ActivityThread.access$600(ActivityThread.java:133)
       at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1203)
       at android.os.Handler.dispatchMessage(Handler.java:99)
       at android.os.Looper.loop(Looper.java:137)
       at android.app.ActivityThread.main(ActivityThread.java:4794)
       at java.lang.reflect.Method.invokeNative(Method.java)
       at java.lang.reflect.Method.invoke(Method.java:511)
       at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:789)
       at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:556)
       at dalvik.system.NativeStart.main(NativeStart.java)
Caused by android.view.InflateException: Binary XML file line #71: Error inflating class com.malinskiy.materialicons.widget.IconButton
       at android.view.LayoutInflater.createView(LayoutInflater.java:613)
       at android.view.LayoutInflater.createViewFromTag(LayoutInflater.java:687)
       at android.view.LayoutInflater.rInflate(LayoutInflater.java:746)
       at android.view.LayoutInflater.rInflate(LayoutInflater.java:749)
       at android.view.LayoutInflater.inflate(LayoutInflater.java:489)
       at android.view.LayoutInflater.inflate(LayoutInflater.java:396)
       at android.view.LayoutInflater.inflate(LayoutInflater.java:352)
       at android.support.v7.app.AppCompatDelegateImplV7.setContentView(AppCompatDelegateImplV7.java:276)
       at android.support.v7.app.AppCompatActivity.setContentView(AppCompatActivity.java:136)
       at com.company.app.activity.HomeActivity_.setContentView(HomeActivity_.java:51)
       at com.company.app.activity.HomeActivity_.onCreate(HomeActivity_.java:42)
       at android.app.Activity.performCreate(Activity.java:5008)
       at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1079)
       at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2031)
       at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2092)
       at android.app.ActivityThread.access$600(ActivityThread.java:133)
       at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1203)
       at android.os.Handler.dispatchMessage(Handler.java:99)
       at android.os.Looper.loop(Looper.java:137)
       at android.app.ActivityThread.main(ActivityThread.java:4794)
       at java.lang.reflect.Method.invokeNative(Method.java)
       at java.lang.reflect.Method.invoke(Method.java:511)
       at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:789)
       at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:556)
       at dalvik.system.NativeStart.main(NativeStart.java)
Caused by java.lang.reflect.InvocationTargetException
       at java.lang.reflect.Constructor.constructNative(Constructor.java)
       at java.lang.reflect.Constructor.newInstance(Constructor.java:417)
       at android.view.LayoutInflater.createView(LayoutInflater.java:587)
       at android.view.LayoutInflater.createViewFromTag(LayoutInflater.java:687)
       at android.view.LayoutInflater.rInflate(LayoutInflater.java:746)
       at android.view.LayoutInflater.rInflate(LayoutInflater.java:749)
       at android.view.LayoutInflater.inflate(LayoutInflater.java:489)
       at android.view.LayoutInflater.inflate(LayoutInflater.java:396)
       at android.view.LayoutInflater.inflate(LayoutInflater.java:352)
       at android.support.v7.app.AppCompatDelegateImplV7.setContentView(AppCompatDelegateImplV7.java:276)
       at android.support.v7.app.AppCompatActivity.setContentView(AppCompatActivity.java:136)
       at com.company.app.activity.HomeActivity_.setContentView(HomeActivity_.java:51)
       at com.company.app.activity.HomeActivity_.onCreate(HomeActivity_.java:42)
       at android.app.Activity.performCreate(Activity.java:5008)
       at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1079)
       at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2031)
       at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2092)
       at android.app.ActivityThread.access$600(ActivityThread.java:133)
       at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1203)
       at android.os.Handler.dispatchMessage(Handler.java:99)
       at android.os.Looper.loop(Looper.java:137)
       at android.app.ActivityThread.main(ActivityThread.java:4794)
       at java.lang.reflect.Method.invokeNative(Method.java)
       at java.lang.reflect.Method.invoke(Method.java:511)
       at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:789)
       at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:556)
       at dalvik.system.NativeStart.main(NativeStart.java)
Caused by java.lang.NullPointerException
       at com.malinskiy.materialicons.Utils.resourceToFile(Utils.java:52)
       at com.malinskiy.materialicons.Iconify.getTypeface(Iconify.java:66)
       at com.malinskiy.materialicons.Iconify.addIcons(Iconify.java:32)
       at com.malinskiy.materialicons.widget.IconButton.init(IconButton.java:38)
       at com.malinskiy.materialicons.widget.IconButton.<init>(IconButton.java:20)
       at java.lang.reflect.Constructor.constructNative(Constructor.java)
       at java.lang.reflect.Constructor.newInstance(Constructor.java:417)
       at android.view.LayoutInflater.createView(LayoutInflater.java:587)
       at android.view.LayoutInflater.createViewFromTag(LayoutInflater.java:687)
       at android.view.LayoutInflater.rInflate(LayoutInflater.java:746)
       at android.view.LayoutInflater.rInflate(LayoutInflater.java:749)
       at android.view.LayoutInflater.inflate(LayoutInflater.java:489)
       at android.view.LayoutInflater.inflate(LayoutInflater.java:396)
       at android.view.LayoutInflater.inflate(LayoutInflater.java:352)
       at android.support.v7.app.AppCompatDelegateImplV7.setContentView(AppCompatDelegateImplV7.java:276)
       at android.support.v7.app.AppCompatActivity.setContentView(AppCompatActivity.java:136)
       at com.company.app.activity.HomeActivity_.setContentView(HomeActivity_.java:51)
       at com.company.app.activity.HomeActivity_.onCreate(HomeActivity_.java:42)
       at android.app.Activity.performCreate(Activity.java:5008)
       at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1079)
       at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2031)
       at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2092)
       at android.app.ActivityThread.access$600(ActivityThread.java:133)
       at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1203)
       at android.os.Handler.dispatchMessage(Handler.java:99)
       at android.os.Looper.loop(Looper.java:137)
       at android.app.ActivityThread.main(ActivityThread.java:4794)
       at java.lang.reflect.Method.invokeNative(Method.java)
       at java.lang.reflect.Method.invoke(Method.java:511)
       at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:789)
       at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:556)
       at dalvik.system.NativeStart.main(NativeStart.java)

Seemed to happen on a device called pap5300duo.

Utils#resourceToFile should probably check getResourceAsStreams result.

ened avatar Jun 04 '16 06:06 ened

@ened and what do you want the behavior to be in this case? if it's null then the font file is not available which means the user will not see any icons. Any ideas why this happens besides crappy firmware?

Malinskiy avatar Jun 04 '16 12:06 Malinskiy

In case of IO errors, the Iconify class already handles it via a null pointer, so the same should happen here (instead of an Crash).

Yet, detailed error logging of the exception would be great (Log.e)

public static final Typeface getTypeface(Context context) {
    if (typeface == null) {
        try {
            typeface = Typeface.createFromFile(Utils.resourceToFile(context, TTF_FILE));
        } catch (IOException e) {
            return null;
        }
    }
    return typeface;
}

ened avatar Jun 05 '16 09:06 ened