2016-02-04 13 views
8

प्रारंभ नहीं किया गया हो सकता है मुझे यह त्रुटि संदेश यह कह रहा है कि 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(); 
    } 
} 
} 

मैं स्वीकार किए जाते हैं स्टैक ओवरफ़्लो जवाब 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" देता है।

इसे हल करने के तरीके पर कोई सुझाव? धन्यवाद!

उत्तर

8

अपने श्रृंखलित विधि विभाजित कॉल:

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 बनाने असाइन किया गया है।

+0

बस उत्सुक बना सकते हैं, इस Android स्टूडियो में एक बग है या मैं करने के लिए होती जिस तरह से आपने सुझाव दिया है उसे कोड करें? –

+0

यह एक बग नहीं है। यह अज्ञात वर्गों को लागू करने के तरीके के कारण होता है, जो एक बार आप थोड़ा सा पोक करने के बाद वास्तव में स्पष्ट होते हैं। मैं वास्तव में एक विस्तृत स्पष्टीकरण लिख रहा था ... जारी रहेगा और यहां एक लिंक पोस्ट करेगा। –

+0

धन्यवाद @ एंडी टर्नर, आपके लेख को पढ़ने के लिए तत्पर हैं :) –

-5

समाधान के लिए

को

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

आपको लगता है कि चर एक अंतिम एक तत्व सरणी

+6

यह काम करने के लिए यह भयानक डिजाइन है। –

+0

हां यह है, लेकिन यदि आप वास्तव में जानते हैं कि आप क्या कर रहे हैं, तो यह काम कर सकता है। लेकिन, हाँ, आपको ऐसा नहीं करना चाहिए। – Meegoo

+1

भले ही आप वास्तव में जानते हैं कि आप क्या कर रहे हैं, यह अभी भी भयानक कोड है। –

संबंधित मुद्दे