NPE while inflating layout (Attempt to invoke virt

2019-01-01 11:45发布

问题:

I keep getting a java.lang.NullPointerException when I try to use ScrollView in an activity.

The weird thing is that I\'ve used the exact same Scrollview setup in other activities. And all of a sudden I\'m getting errors. I\'ve tried cleaning the project and rebuilding.

And I\'ve tried the good old restart the program. I learned a lot about Null Pointer Exceptions today, but I haven\'t been able to figure out why I keep getting Rendering Problems.

This is the java.lang.NullPointerException that is thrown on the XML:

java.lang.NullPointerException
    at android.view.LayoutInflater.createViewFromTag(LayoutInflater.java:738)
    at android.view.BridgeInflater.createViewFromTag(BridgeInflater.java:149)
    at android.view.LayoutInflater.createViewFromTag(LayoutInflater.java:704)
    at android.view.LayoutInflater.rInflate_Original(LayoutInflater.java:835)
    at android.view.LayoutInflater_Delegate.rInflate(LayoutInflater_Delegate.java:70)
    at android.view.LayoutInflater.rInflate(LayoutInflater.java:811)
    at android.view.LayoutInflater.rInflateChildren(LayoutInflater.java:798)
    at android.view.LayoutInflater.rInflate_Original(LayoutInflater.java:838)
    at android.view.LayoutInflater_Delegate.rInflate(LayoutInflater_Delegate.java:70)
    at android.view.LayoutInflater.rInflate(LayoutInflater.java:811)
    at android.view.LayoutInflater.rInflateChildren(LayoutInflater.java:798)
    at android.view.LayoutInflater.rInflate_Original(LayoutInflater.java:838)
    at android.view.LayoutInflater_Delegate.rInflate(LayoutInflater_Delegate.java:70)
    at android.view.LayoutInflater.rInflate(LayoutInflater.java:811)
    at android.view.LayoutInflater.rInflateChildren(LayoutInflater.java:798)
    at android.view.LayoutInflater.inflate(LayoutInflater.java:515)
    at android.view.LayoutInflater.inflate(LayoutInflater.java:394)
    at com.android.layoutlib.bridge.impl.RenderSessionImpl.inflate(RenderSessionImpl.java:223)
    at com.android.layoutlib.bridge.Bridge.createSession(Bridge.java:426)
    at com.android.ide.common.rendering.LayoutLibrary.createSession(LayoutLibrary.java:350)
    at com.android.tools.idea.rendering.RenderTask$2.compute(RenderTask.java:510)
    at com.android.tools.idea.rendering.RenderTask$2.compute(RenderTask.java:498)
    at com.intellij.openapi.application.impl.ApplicationImpl.runReadAction(ApplicationImpl.java:888)
    at com.android.tools.idea.rendering.RenderTask.createRenderSession(RenderTask.java:498)
    at com.android.tools.idea.rendering.RenderTask.access$600(RenderTask.java:72)
    at com.android.tools.idea.rendering.RenderTask$3.call(RenderTask.java:610)
    at com.android.tools.idea.rendering.RenderTask$3.call(RenderTask.java:607)
    at com.android.tools.idea.rendering.RenderService.runRenderAction(RenderService.java:362)
    at com.android.tools.idea.rendering.RenderTask.render(RenderTask.java:607)
    at com.android.tools.idea.rendering.RenderTask.render(RenderTask.java:629)
    at org.jetbrains.android.uipreview.AndroidLayoutPreviewToolWindowManager.doRender(AndroidLayoutPreviewToolWindowManager.java:652)
    at org.jetbrains.android.uipreview.AndroidLayoutPreviewToolWindowManager.access$1700(AndroidLayoutPreviewToolWindowManager.java:80)
    at org.jetbrains.android.uipreview.AndroidLayoutPreviewToolWindowManager$7$1.run(AndroidLayoutPreviewToolWindowManager.java:594)
    at com.intellij.openapi.progress.impl.CoreProgressManager$2.run(CoreProgressManager.java:152)
    at com.intellij.openapi.progress.impl.CoreProgressManager.registerIndicatorAndRun(CoreProgressManager.java:452)
    at com.intellij.openapi.progress.impl.CoreProgressManager.executeProcessUnderProgress(CoreProgressManager.java:402)
    at com.intellij.openapi.progress.impl.ProgressManagerImpl.executeProcessUnderProgress(ProgressManagerImpl.java:54)
    at com.intellij.openapi.progress.impl.CoreProgressManager.runProcess(CoreProgressManager.java:137)
    at org.jetbrains.android.uipreview.AndroidLayoutPreviewToolWindowManager$7.run(AndroidLayoutPreviewToolWindowManager.java:589)
    at com.intellij.util.ui.update.MergingUpdateQueue.execute(MergingUpdateQueue.java:320)
    at com.intellij.util.ui.update.MergingUpdateQueue.execute(MergingUpdateQueue.java:310)
    at com.intellij.util.ui.update.MergingUpdateQueue$2.run(MergingUpdateQueue.java:254)
    at com.intellij.util.ui.update.MergingUpdateQueue.flush(MergingUpdateQueue.java:269)
    at com.intellij.util.ui.update.MergingUpdateQueue.flush(MergingUpdateQueue.java:227)
    at com.intellij.util.ui.update.MergingUpdateQueue.run(MergingUpdateQueue.java:217)
    at com.intellij.util.concurrency.QueueProcessor.runSafely(QueueProcessor.java:238)
    at com.intellij.util.Alarm$Request$1.run(Alarm.java:351)
    at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:511)
    at java.util.concurrent.FutureTask.run(FutureTask.java:266)
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142)
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617)
    at java.lang.Thread.run(Thread.java:745)

So, none of this is code that I wrote. So I dove into the stack trace and found this:

  java.lang.NullPointerException: Attempt to invoke virtual method \'boolean java.lang.String.equals(java.lang.Object)\' on a null object reference
        at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2325)
        at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2387)
        at android.app.ActivityThread.access$800(ActivityThread.java:151)
        at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1303)
        at android.os.Handler.dispatchMessage(Handler.java:102)
        at android.os.Looper.loop(Looper.java:135)
        at android.app.ActivityThread.main(ActivityThread.java:5254)
        at java.lang.reflect.Method.invoke(Native Method)
        at java.lang.reflect.Method.invoke(Method.java:372)
        at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:903)
        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:698)
        Caused by: java.lang.NullPointerException: Attempt to invoke virtual method \'boolean java.lang.String.equals(java.lang.Object)\' on a null object reference
              at android.view.LayoutInflater.createViewFromTag(LayoutInflater.java:715)
              at android.view.LayoutInflater.rInflate(LayoutInflater.java:806)
              at android.view.LayoutInflater.rInflate(LayoutInflater.java:809)
              at android.view.LayoutInflater.rInflate(LayoutInflater.java:809)
              at android.view.LayoutInflater.inflate(LayoutInflater.java:504)
              at android.view.LayoutInflater.inflate(LayoutInflater.java:414)
              at android.view.LayoutInflater.inflate(LayoutInflater.java:365)
              at com.android.internal.policy.impl.PhoneWindow.setContentView(PhoneWindow.java:378)
              at android.app.Activity.setContentView(Activity.java:2145)
              at com.mitchellpalermo.tutroubleshooting.ContactPage.onCreate(ContactPage.java:11)
              at android.app.Activity.performCreate(Activity.java:5990)
              at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1106)
              at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2278)
              at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2387) 
              at android.app.ActivityThread.access$800(ActivityThread.java:151) 
              at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1303) 
              at android.os.Handler.dispatchMessage(Handler.java:102) 
              at android.os.Looper.loop(Looper.java:135) 
              at android.app.ActivityThread.main(ActivityThread.java:5254) 
              at java.lang.reflect.Method.invoke(Native Method) 
              at java.lang.reflect.Method.invoke(Method.java:372) 
              at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:903) 
              at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:698)

Which points to line 11 on the Contact.java file. Which looks like this (I\'ve put indicators around line 11) :

  package com.mitchellpalermo.tutroubleshooting;

  import android.app.Activity;
  import android.os.Bundle;

  public class Contact extends Activity {

        @Override
        protected void onCreate(Bundle savedInstanceState) {
              super.onCreate(savedInstanceState);
              setContentView(R.layout.activity_contact); // line 11
        }
  }

I don\'t see a problem with line 11.

Now, I can\'t figure out what is wrong with my code. Between Rendering Problems and NullPointerExceptions, I can\'t figure out what is actually wrong with my code.

This is an example of XML in an activity in which the ScrollView doesn\'t throw any errors:

<ScrollView xmlns:android=\"http://schemas.android.com/apk/res/android\"
    xmlns:tools=\"http://schemas.android.com/tools\"
    android:layout_width=\"match_parent\"
    android:layout_height=\"fill_parent\"
    android:orientation=\"vertical\"
    tools:context=\"com.mitchellpalermo.tutroubleshooting.ComputerOrProjector\">

    <LinearLayout
        android:layout_width=\"match_parent\"
        android:layout_height=\"wrap_content\"
        android:layout_gravity=\"center\"
        android:orientation=\"vertical\">

        <TextView
            style=\"@style/HeaderStyle\"
            android:layout_width=\"wrap_content\"
            android:layout_height=\"wrap_content\"
            android:layout_gravity=\"center\"
            android:text=\"@string/solutions\"
            android:textStyle=\"bold\" />

        <!-- A CardView that contains a TextView -->
        <android.support.v7.widget.CardView xmlns:card_view=\"http://schemas.android.com/apk/res-auto\"
            android:layout_width=\"match_parent\"
            android:layout_height=\"wrap_content\"
            android:layout_gravity=\"center\"
            android:layout_margin=\"15dp\"
            card_view:cardBackgroundColor=\"#FFFFFF\"
            card_view:cardCornerRadius=\"4dp\"
            card_view:cardElevation=\"5dp\">

            <LinearLayout
                android:layout_width=\"match_parent\"
                android:layout_height=\"wrap_content\"
                android:orientation=\"vertical\">

                <TextView
                    style=\"@style/Solution\"
                    android:text=\"@string/pc_v_fifth\" />

                <View
                    android:layout_width=\"match_parent\"
                    android:layout_height=\"2dp\"
                    android:background=\"@android:color/darker_gray\" />

                <TextView
                    style=\"@style/Solution\"
                    android:text=\"@string/pc_v_first\" />

                <View
                    android:layout_width=\"match_parent\"
                    android:layout_height=\"2dp\"
                    android:background=\"@android:color/darker_gray\" />

                <TextView
                    style=\"@style/Solution\"
                    android:text=\"@string/pc_v_second\" />

                <View
                    android:layout_width=\"match_parent\"
                    android:layout_height=\"2dp\"
                    android:background=\"@android:color/darker_gray\" />

                <TextView
                    style=\"@style/Solution\"
                    android:text=\"@string/pc_v_third\" />

                <View
                    android:layout_width=\"match_parent\"
                    android:layout_height=\"2dp\"
                    android:background=\"@android:color/darker_gray\" />


                <TextView
                    style=\"@style/Solution\"
                    android:text=\"@string/pc_v_fourth\" />

                <View
                    android:layout_width=\"match_parent\"
                    android:layout_height=\"2dp\"
                    android:background=\"@android:color/darker_gray\" />

            </LinearLayout>
        </android.support.v7.widget.CardView>

        <LinearLayout
            android:layout_width=\"match_parent\"
            android:layout_height=\"wrap_content\"
            android:orientation=\"horizontal\">

            <Button
                style=\"@style/NextButton\"
                android:layout_width=\"wrap_content\"
                android:layout_height=\"wrap_content\"
                android:layout_gravity=\"center\"
                android:onClick=\"sendEmail\"
                android:text=\"@string/fixed\"
                android:textStyle=\"bold\" />

            <Button
                style=\"@style/NextButton\"
                android:layout_width=\"wrap_content\"
                android:layout_height=\"wrap_content\"
                android:layout_gravity=\"center\"
                android:onClick=\"notFixedButton\"
                android:text=\"@string/not_fixed\"
                android:textStyle=\"bold\" />

        </LinearLayout>

    </LinearLayout>

</ScrollView>

And here is the activity in which I receive errors:

<ScrollView xmlns:android=\"http://schemas.android.com/apk/res/android\"
    android:layout_width=\"fill_parent\"
    android:layout_height=\"wrap_content\"
    android:fillViewport=\"false\">


    <LinearLayout
        android:layout_width=\"match_parent\"
        android:layout_height=\"wrap_content\"
        android:orientation=\"vertical\">

        <TextView
            style=\"@style/HeaderStyle\"
            android:layout_width=\"wrap_content\"
            android:layout_height=\"wrap_content\"
            android:layout_gravity=\"center\"
            android:text=\"@string/still_not_fixed\" />

        <!-- A CardView that contains a TextView -->
        <android.support.v7.widget.CardView xmlns:card_view=\"http://schemas.android.com/apk/res-auto\"
            android:layout_width=\"match_parent\"
            android:layout_height=\"wrap_content\"
            android:layout_gravity=\"center\"
            android:layout_margin=\"15dp\"
            card_view:cardBackgroundColor=\"#FFFFFF\"
            card_view:cardCornerRadius=\"4dp\"
            card_view:cardElevation=\"5dp\">

            <TextView
                android:layout_width=\"match_parent\"
                android:layout_height=\"wrap_content\"
                android:text=\"@string/hector\" />

            <view
                android:layout_width=\"match_parent\"
                android:layout_height=\"2dp\"
                android:backgroundTint=\"@android:color/darker_gray\" />

            <TextView
                android:layout_width=\"match_parent\"
                android:layout_height=\"wrap_content\"
                android:text=\"@string/robert\" />

            <view
                android:layout_width=\"match_parent\"
                android:layout_height=\"2dp\"
                android:backgroundTint=\"@android:color/darker_gray\" />

            <TextView
                android:layout_width=\"match_parent\"
                android:layout_height=\"wrap_content\"
                android:text=\"@string/mitch\" />

        </android.support.v7.widget.CardView>

    </LinearLayout>

</ScrollView>

Any suggestions? And thank you so much in advance!

回答1:

Change <view to <View, because view is not about empty view. It\'s for custom view defined through class attr, like below:

<view
    android:layout_width=\"wrap_content\"
    android:layout_height=\"wrap_content\"
    class=\"com.your.package.YourCustomView\" />

And you got

Caused by: java.lang.NullPointerException: Attempt to invoke virtual method \'boolean java.lang.String.equals(java.lang.Object)\' on a null object reference

because of LayoutInflater tries to parse class attr:

LayoutInflater source code

//...
View createViewFromTag(View parent, String name, Context context, AttributeSet attrs,
        boolean ignoreThemeAttr) {
    if (name.equals(\"view\")) { // line 724
        name = attrs.getAttributeValue(null, \"class\"); // line 725
    }

    // Apply a theme wrapper, if allowed and one is specified.
    if (!ignoreThemeAttr) {
        final TypedArray ta = context.obtainStyledAttributes(attrs, ATTRS_THEME);
        final int themeResId = ta.getResourceId(0, 0);
        if (themeResId != 0) {
            context = new ContextThemeWrapper(context, themeResId);
        }
        ta.recycle();
    }

    if (name.equals(TAG_1995)) { // line 738
        // Let\'s party like it\'s 1995!
        return new BlinkLayout(context, attrs);
    }
//...
  • On line 724 it check that your tag is view and gets true
  • On line 725 it tries to get class through class attr and gets null
  • On line 738 it tries to check for blink tag and gets crash

Also, there is a curious thing, Android developers added Easter egg, you can try it:

<view
    android:layout_width=\"wrap_content\"
    android:layout_height=\"wrap_content\"
    class=\"blink\">
    <TextView
        android:layout_width=\"match_parent\"
        android:layout_height=\"wrap_content\"
        android:gravity=\"center\"
        android:text=\"Some text\" />
</view>


回答2:

After 2 days I solved this problem use View instead of view

<View
    android:layout_width=\"match_parent\"
    android:layout_height=\"1dp\"
    android:background=\"#faf4f4\"></View>