【问题标题】:Variable 'snackbar' might not have been initialized变量“snackbar”可能尚未初始化
【发布时间】:2016-05-14 01:11:03
【问题描述】:

我收到这条错误消息说Variable "snackbar" might not have been initialized

以下是我的 MainActivity.java 代码的一部分:

public class NetworkChangeReceiver extends BroadcastReceiver {

@Override
public void onReceive(Context context, Intent intent) {

    NetworkInfo info = intent.getParcelableExtra(WifiManager.EXTRA_NETWORK_INFO);

    if (info != null && info.isConnected()) {
        final Snackbar snackbar = Snackbar.make(findViewById(android.R.id.content), "WiFi change detected; updating information...", Snackbar.LENGTH_LONG)
            .setAction("DISMISS", new View.OnClickListener() {
                @Override
                public void onClick(View v) {
                    snackbar.dismiss();
                }
            });
            snackbar.setActionTextColor(Color.BLUE);
            snackbar.show();

            getWifi();
    }
}
}

我已阅读接受的 Stack Overflow 答案 here,它建议我在 public class NetworkChangeReceiver extends BroadcastReceiver 之后立即初始化 snackbar。因此,我将代码更改为:

/* no changes here */
@Override
public void onReceive(Context context, Intent intent) {
    Snackbar snackbar = null;

    /* no changes here */
    if (...) {
        snackbar = Snackbar.make(...);
    }

    /* no changes here */
}

但这给了我一个错误Variable "snackbar" is accessed from within inner class, needs to be declared final 和一个警告Method invocation "snackbar.dismiss()" may produce "java.lang.NullPointerException"

关于如何解决这个问题的任何建议?谢谢!

【问题讨论】:

    标签: java android


    【解决方案1】:

    拆分你的链式方法调用:

    final Snackbar snackbar = Snackbar.make(findViewById(android.R.id.content), "WiFi change detected; updating information...", Snackbar.LENGTH_LONG);
    snackbar.setAction("DISMISS", new View.OnClickListener() {
        @Override
        public void onClick(View v) {
          snackbar.dismiss();
        }
      });
    

    这样,snackbar 肯定会在您创建 OnClickListener 之前分配。

    【讨论】:

    • 只是好奇,这是 Android Studio 中的错误还是我打算按照您建议的方式对其进行编码?
    • 这不是错误。这是因为匿名类的实现方式,只要你仔细研究一下,实际上就很清楚了。我实际上是在写一个详细的解释......将继续并在此处发布链接。
    • 感谢@Andy Turner,期待阅读您的文章 :)
    • 感谢@Andy Turner!那很有帮助!希望有这个问题的人也觉得你的回答很有用。
    【解决方案2】:

    作为一种解决方法

    Variable "snackbar" is accessed from within inner class, needs to be declared final

    您可以将该变量设为最终的单元素数组

    【讨论】:

    • 是的,但如果你真的知道自己在做什么,它就可以工作。但是,是的,你不应该那样做。
    • 即使你真的知道自己在做什么,它仍然是糟糕的代码。
    • 如果您认为这是一个很好的解决方案,那么您肯定不知道自己在做什么......
    猜你喜欢
    • 2012-03-25
    • 2015-07-04
    • 1970-01-01
    • 2013-11-24
    相关资源
    最近更新 更多