按钮可能产生空指针异常(Android Studio)

Posted

技术标签:

【中文标题】按钮可能产生空指针异常(Android Studio)【英文标题】:Button may produce null pointer exception (Android Studio) 【发布时间】:2016-07-12 06:52:03 【问题描述】:

android Studio 的新手,我认为我做得还不错,但昨晚遇到了一个错误,尽管我尽了最大努力在谷歌上搜索,但我似乎无法修复。我的一个活动上的按钮“可能会产生 java.lang.NullPointerException”,但每次按下它都会失败。这可能只是在错误的地方订购一行代码等简单的事情,但我对 Android Studio 太陌生了,我真的不知道我哪里出错了。

   public class searchPage extends AppCompatActivity 

    private GoogleApiClient client;


    @Override
    protected void onCreate(Bundle savedInstanceState) 
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_search_page);
    Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);
    setSupportActionBar(toolbar);

    Button goBackButton = (Button) findViewById(R.id.goBackButton);

    goBackButton.setOnClickListener(new View.OnClickListener() 
        @Override

        public void onClick(View v) 

            startActivity(new Intent(searchPage.this, MainActivity.class));
        
     );

这是 XML

 <Button
    android:layout_
    android:layout_
    android:text="New Button"
    android:id="@+id/goBackButton"
    android:layout_marginTop="88dp"
    android:layout_below="@+id/spinner4"
    android:layout_centerHorizontal="true"
    />

还有 Manifest 文件

 <?xml version="1.0" encoding="utf-8"?>
 <manifest xmlns:android="http://schemas.android.com/apk/res/android"
 package="com.example.onein.mobilefinalapp">

 <application
    android:allowBackup="true"
    android:icon="@mipmap/ic_launcher"
    android:label="@string/app_name"
    android:supportsRtl="true"
    android:theme="@style/AppTheme">
    <activity
        android:name=".MainActivity"
        android:label="@string/app_name"
        android:theme="@style/AppTheme.NoActionBar">
        <intent-filter>
            <action android:name="android.intent.action.MAIN" />

            <category android:name="android.intent.category.LAUNCHER" />
        </intent-filter>
    </activity>
    <activity
        android:name=".searchPage"
        android:label="@string/title_activity_search_page"
        android:theme="@style/AppTheme.NoActionBar" />

    <activity
        android:name=".MoviePage"
        android:label="@string/title_activity_movie_page"
        android:theme="@style/AppTheme.NoActionBar"></activity>

    <meta-data
        android:name="com.google.android.gms.version"
        android:value="@integer/google_play_services_version" />
 </application>

 </manifest>

这里是activity_search_page.xml

<android.support.design.widget.AppBarLayout
    android:layout_
    android:layout_
    android:theme="@style/AppTheme.AppBarOverlay">

    <android.support.v7.widget.Toolbar
        android:id="@+id/toolbar"
        android:layout_
        android:layout_
        android:background="?attr/colorPrimary"
        app:popupTheme="@style/AppTheme.PopupOverlay" />

  </android.support.design.widget.AppBarLayout>

 <include layout="@layout/content_search_page" />

 <android.support.design.widget.FloatingActionButton
    android:id="@+id/fab"
    android:layout_
    android:layout_
    android:layout_gravity="bottom|end"
    android:layout_margin="@dimen/fab_margin"
    android:src="@android:drawable/ic_dialog_email" />

</android.support.design.widget.CoordinatorLayout>

如果您需要任何其他信息,请告诉我。

非常感谢任何帮助!谢谢。

编辑 - 删除重复按钮,并添加到 activity_search_page.xml

【问题讨论】:

为什么你有两个相同 id goBackButton 的按钮? 异常堆栈跟踪会有帮助。 也分享activity_search_page.xml 您不能有两个具有相同 id 的按钮。请显示错误日志。 您还没有定义goBackButton 真正存在的位置吗?是在content_search_page 里面吗?如果是这样,请发布完整的XML 【参考方案1】:

方法调用 'setOnClickListener' 可能会产生更少的 'java.lang.NullPointerException'...

此检查分析方法控制和数据流,以报告始终为真或假的可能条件、其值被静态证明为常量的表达式以及可能导致可空性合同违规的情况。

这只是一个警告,因为如果在布局中找不到给定的 id,findViewById 将返回 null

如果您确定 id 在您正在使用的布局中,您可以放心地忽略它,或者您可以通过断言(也可能是 @Nullable 注释)忽略它。

View v = findViewById(R.id.someId);
assert v != null;
v.setOnClickListener(...);

【讨论】:

是的,我试过了。当我运行它并单击按钮时,我的应用程序仍然崩溃。只是说应用程序已停止工作 logcat 应该会告诉你原因,就像 Java 中的其他 NullPointerException 一样 谢谢,为我工作!虽然我有点困惑,但如果我在设置点击侦听器之前不使用“assert v!= null”语句,我会得到 NullPointerException 错误 OP 指出。 @cricket_007 你能提供更多的见解吗?我的印象是断言语句用于在尝试条件时打印错误,而不是控制流。我已将“assert v != null”更改为“if(v != null)”,以便在我的脑海中更有意义哈哈 这不是错误。这是一个警告。对断言语句的静态代码分析将在以下几行中说明变量不为空【参考方案2】:

正如@cricket007 正确指出的那样 这是一个警告,如果没有找到资源,则返回 null,这实际上会使应用程序崩溃。

解决这个问题的一些方法:

1) 使用命令

assert object_name != null

或者干脆做alt+enter,这是 android studio 的最佳建议之一。

2) 使用

if(object!=null)

3) 编辑:这是一种工作方法,但一种不好的做法,一个简单的 if 是首选。

使用trycatch 块(Java 处理错误的方式。)

try
    your entire code here;

catch(Exception e)
    what to do when exception happens

【讨论】:

我是 Stack 委员会的新手,所以请随时编辑答案以获得更好的效果,如果我添加代码要点,请告诉我,我是否已经实现了?谢谢。 根据我的经验,尝试捕获 nullpointerexception 是不好的做法 @cricket_007 我应该在编辑中删除它还是不推荐添加标签?堆栈溢出时这里如何处理? 这是你的帖子,但我只是指出一个简单的 if not null 检查是处理受控 nullpointerexception 的首选 Java 模式 按照您 cricket_007 的建议完成。谢谢你的建议,谢谢你,我学会了【参考方案3】:

首先,您的Button 需要在activity_search_page.xml 文件中,findViewById() 才能工作。

其次,我认为你想要后退按钮功能,在这种情况下

    去掉Button相关的代码 添加toolbar.setDisplayHomeAsUpEnabled(true);

    添加以下代码

    toolbar.setNavigationOnClickListener(new View.OnClickListener() 
          @Override
          public void onClick(View v) 
                startActivity(new Intent(searchPage.this, MainActivity.class));
          
    );
    

    可选,使用toolbar.setNavigationIcon(R.drawable.your_own_back_button_drawable_here); 来使用您自己的drawable。

This may help as well

【讨论】:

以上是关于按钮可能产生空指针异常(Android Studio)的主要内容,如果未能解决你的问题,请参考以下文章

Android-空指针异常反复崩溃

如何解决空指针异常和 ThreadException 中的错误android

rootView上的Android片段空指针异常[关闭]

Android GoogleMaps 空指针异常 lagitutde

java.lang.NullPointerException

由于在编辑器类中设置 onClick 侦听器时出现空指针异常,Android 应用程序崩溃