स्विच केस स्टेटमेंट एरर: केस एक्सप्रेशन लगातार अभिव्यक्ति होना चाहिए


128

मेरा स्विच-केस स्टेटमेंट कल बिल्कुल ठीक काम करता है। लेकिन जब मैं आज सुबह पहले कोड चलाता हूं तो ग्रहण ने मुझे रंग लाल में केस स्टेटमेंट को रेखांकित करने में एक त्रुटि दी और कहते हैं: केस एक्सप्रेशंस निरंतर अभिव्यक्ति होना चाहिए, यह स्थिर है मुझे नहीं पता कि क्या हुआ। यहाँ मेरा कोड नीचे दिया गया है:

public void onClick(View src)
    {
        switch(src.getId()) {
        case R.id.playbtn:
            checkwificonnection();
            break;

        case R.id.stopbtn:
            Log.d(TAG, "onClick: stopping srvice");
            Playbutton.setImageResource(R.drawable.playbtn1);
            Playbutton.setVisibility(0); //visible
            Stopbutton.setVisibility(4); //invisible
            stopService(new Intent(RakistaRadio.this,myservice.class));
            clearstatusbar();
            timer.cancel();
            Title.setText(" ");
            Artist.setText(" ");
            break;

        case R.id.btnmenu:
            openOptionsMenu();
            break;
        }
    }

सभी R.id.int सभी लाल रंग में रेखांकित हैं।


क्या आप R.id.playbtnआदि की परिभाषा प्रदान कर सकते हैं ? क्या सब कुछ स्थिर और अंतिम है?
थॉमस

2
संभवतः आपने अपना लेआउट हटा दिया है या संशोधित कर लिया है और वे आईडी अब मौजूद नहीं हैं या ऐसा कुछ ...
विसेंट प्लाटा

क्लास Rआमतौर पर आईडीई / देव टूल द्वारा उत्पन्न होती है, इसलिए यह आमतौर पर उपयोग में Android के संस्करण के लिए सही है।
cHao

मेरे R.id. * सभी ठीक हैं और Android के सामान्य वर्ग में मौजूद हैं .. और यह मुख्य लेआउट में भी है।
हार्टलेसअंगेल

जवाबों:


274

एक नियमित Android परियोजना में, संसाधन R वर्ग में स्थिरांक इस तरह घोषित किए जाते हैं:

public static final int main=0x7f030004;

हालांकि, एक पुस्तकालय परियोजना में एडीटी 14 के रूप में, उन्हें इस तरह से घोषित किया जाएगा:

public static int main=0x7f030004;

दूसरे शब्दों में, एक पुस्तकालय परियोजना में स्थिरांक अंतिम नहीं हैं। इसलिए आपका कोड अब संकलित नहीं होगा।

इसके लिए समाधान सरल है: स्विच स्टेटमेंट को इफ-स्टेटमेंट स्टेटमेंट में परिवर्तित करें।

public void onClick(View src)
{
    int id = src.getId();
    if (id == R.id.playbtn){
        checkwificonnection();
    } else if (id == R.id.stopbtn){
        Log.d(TAG, "onClick: stopping srvice");
        Playbutton.setImageResource(R.drawable.playbtn1);
        Playbutton.setVisibility(0); //visible
        Stopbutton.setVisibility(4); //invisible
        stopService(new Intent(RakistaRadio.this,myservice.class));
        clearstatusbar();
        timer.cancel();
        Title.setText(" ");
        Artist.setText(" ");
    } else if (id == R.id.btnmenu){
        openOptionsMenu();
    }
}

http://tools.android.com/tips/non-constant-fields

आप निम्न का उपयोग करके किसी switchस्टेटमेंट को जल्दी से स्टेटमेंट में बदल सकते हैं if-else:

ग्रहण में
अपने कर्सर को switchकीवर्ड पर ले जाएँ और फिर Ctrl+ दबाएँ1

'स्विच' को 'if-else' में बदलें।

एंड्रॉइड स्टूडियो में
अपने कर्सर को switchकीवर्ड पर ले जाएं और फिर Alt+ दबाएंEnter

'स्विच' को 'यदि' से बदलें।


मैं अपने स्विच-केस स्टेटमेंट को और बदल देता हूँ-अगर स्टेटमेंट .. यह सिर्फ मुझे आश्चर्य हो रहा है कि मैं एक नया एंड्रॉइड प्रोजेक्ट बनाऊं और स्विच-केस स्टेटमेंट का उपयोग करूं और ठीक काम
करूं

1
यह हो सकता है कि आपकी पहली परियोजना एक पुस्तकालय परियोजना का उपयोग कर रही है और आपकी नई परियोजना नहीं है।
बेनिटो बर्टोली

मुझे समझ में नहीं आया कि सॉरी im वास्तव में यहाँ एक शुरुआत है .. क्या आप समझा सकते हैं
हार्टलेस आर्केल

7
कम से कम ग्रहण आपको स्विच को यदि / और स्वचालित रूप से परिवर्तित कर देगा। स्विच कीवर्ड पर क्लिक करें। इसके बाद ctrl-1
डैरेन काटो

1
संकलनकर्ता को संकलित समय पर अभिव्यक्ति की आवश्यकता होती है। finalकीवर्ड के बिना , एक चर को रनटाइम पर बदला जा सकता है।
बेनिटो बर्टोली

52

प्रोजेक्ट में "इस् लाइब्रेरी" को अनचेक करना मेरे लिए काम करता है।


2
अपने प्रोजेक्ट के नाम पर राइट क्लिक करें। इसके बाद प्रॉपर्टीज -> एंड्रॉइड पर क्लिक करें। पॉपअप के निचले दाईं ओर एक खंड "लाइब्रेरी" है। इसके तहत, यदि "लाइब्रेरी" विकल्प की जांच की जाती है, तो इसे अनचेक करें यदि आप नहीं चाहते कि आपकी परियोजना एक पुस्तकालय परियोजना हो। फिर साफ करें और पुनर्निर्माण करें। यदि आप चाहते हैं कि यह एक पुस्तकालय परियोजना हो, तो आपको अपने स्विच को यदि कहीं और कहा गया है तो सशर्त में बदलना होगा।
VikingGlen

5
एक कारण है कि क्यों एक पुस्तकालय परियोजना "लाइब्रेरी" के साथ चिह्नित है। यह समस्या का एक उचित समाधान नहीं है - यह आपके एंड्रॉइड प्रोजेक्ट ढांचे को तोड़ देगा, जो नियमित ऐप की तरह व्यवहार करने के लिए पुस्तकालयों का होना चाहिए।
ADTC

13

समाधान इस प्रकार किया जा सकता है:

  1. बस मान को असाइन करें पूर्णांक
  2. फाइनल करने के लिए चर बनाओ

उदाहरण:

public static final int cameraRequestCode = 999;

आशा है कि यह आपकी मदद करेगा।


8

R.id। *, चूंकि ADT 14 को अंतिम स्थिर इंट के रूप में अधिक घोषित नहीं किया गया है, इसलिए आप स्विच केस निर्माण में उपयोग नहीं कर सकते। यदि आप इसके बजाय अन्य खंड का उपयोग कर सकते हैं।


हाँ, मैंने पढ़ा है कि tools.android.com पर, मैंने एक नई परियोजना बनाने की भी कोशिश की और ऊपर दिए गए कोड का उपयोग किया और यह ठीक काम करता है .. वह कैसे है?
हार्टलेसअंगेल

1
tools.android.com/recent/buildchangesinrevision14 "लाइब्रेरी प्रोजेक्ट रिवाम्प " अनुभाग देखें
ब्लैकबेल्ट

6
उन्होंने यह बदलाव क्यों किया इसका कोई मतलब नहीं है।
एंड्रयू एस

8

इस समस्या का सरल समाधान है:

स्विच पर क्लिक करें और फिर CTL + 1 दबाएँ , यह आपके स्विच को if-else ब्लॉक स्टेटमेंट में बदल देगा, और आपकी समस्या का समाधान करेगा


7

कैसे एक और के बजाय अच्छा स्विच रखने के लिए इस अन्य समाधान के बारे में:

private enum LayoutElement {
    NONE(-1),
    PLAY_BUTTON(R.id.playbtn),
    STOP_BUTTON(R.id.stopbtn),
    MENU_BUTTON(R.id.btnmenu);

    private static class _ {
        static SparseArray<LayoutElement> elements = new SparseArray<LayoutElement>();
    }

    LayoutElement(int id) {
        _.elements.put(id, this);
    }

    public static LayoutElement from(View view) {
        return _.elements.get(view.getId(), NONE);
    }

}

तो आपके कोड में आप यह कर सकते हैं:

public void onClick(View src) {
    switch(LayoutElement.from(src)) {
    case PLAY_BUTTTON:
        checkwificonnection();
        break;

    case STOP_BUTTON:
        Log.d(TAG, "onClick: stopping srvice");
        Playbutton.setImageResource(R.drawable.playbtn1);
        Playbutton.setVisibility(0); //visible
        Stopbutton.setVisibility(4); //invisible
        stopService(new Intent(RakistaRadio.this,myservice.class));
        clearstatusbar();
        timer.cancel();
        Title.setText(" ");
        Artist.setText(" ");
        break;

    case MENU_BUTTON:
        openOptionsMenu();
        break;
    }
}

Enums स्थिर हैं इसलिए इसका बहुत सीमित प्रभाव पड़ेगा। चिंता की एकमात्र खिड़की में दोहरी लुकिंग शामिल होगी (पहले आंतरिक स्पार्सअरे पर और बाद में स्विच टेबल पर)

उस ने कहा, इस एनुम का उपयोग आइटम्स को धाराप्रवाह तरीके से लाने के लिए भी किया जा सकता है, अगर जरूरत हो तो आईडी का संदर्भ रखकर ... लेकिन यह कुछ और समय के लिए एक कहानी है।


एंड्रॉइड में उनकी मेमोरी ब्लोट के कारण एनमोज़ को हतोत्साहित किया जाता है; और यही प्रमुख कारण है कि वे एओएसपी में कभी उपयोग नहीं किए जाते हैं - और यही कारण है कि आप हर जगह चींटियों को देखते हैं।
ADTC


3

जब मैं अपनी कक्षा में घोषित चर के साथ किसी फ़ंक्शन में स्विच का उपयोग कर रहा था, तो यह मुझे यह त्रुटि दे रहा था:

private void ShowCalendar(final Activity context, Point p, int type) 
{
    switch (type) {
        case type_cat:
            break;

        case type_region:
            break;

        case type_city:
            break;

        default:
            //sth
            break;
    }
}

समस्या तब हल हुई जब मैंने finalकक्षा की शुरुआत में चर को घोषित किया:

final int type_cat=1, type_region=2, type_city=3;

1
enumintइस मामले में एक बेहतर विकल्प है । विधि का कॉलर अमान्य प्रकार के साथ फ़ंक्शन को कॉल करने में सक्षम नहीं होगा।
१०:१३

अगर मैं ints का उपयोग करता हूं तो मेरे पास विशिष्ट int प्रकार हैं तो ठीक है। हालाँकि मैं enum के साथ एक उदाहरण जानना चाहूंगा: D
aimiliano

i have specific int types so its ok if i use intsवास्तव में समझ में नहीं आता है। Enum उदाहरण के बारे में: docs.oracle.com/javase/tutorial/java/javaOO/enum.html
nhahtdh

मेरा मतलब है कि फंक्शन में आने वाले इंट वैरिएबल टाइप हमेशा इन 3 प्रकारों में से एक होंगे, इसलिए यह
एनुम

i mean that the incoming int variable type in the function will always be one of these 3 types so it won't break anythingयह तुम्हारी धारणा है। कोई अन्य व्यक्ति मनमाने ढंग से संख्या के साथ फ़ंक्शन को गलत तरीके से कह सकता है। इसके साथ enum, आपको यह मानने की आवश्यकता नहीं है कि यह भाषा द्वारा लागू किया गया है।
न्हाथ्ठ

2

मैं इसका उल्लेख करना चाहूंगा, मैं उसी स्थिति में आया था जब मैंने अपनी परियोजना में एक पुस्तकालय जोड़ने की कोशिश की थी। अचानक सभी स्विच स्टेटमेंट में त्रुटियाँ दिखाई देने लगीं!

अब मैंने लाइब्रेरी को हटाने की कोशिश की जिसे मैंने जोड़ा, तब भी यह काम नहीं किया। कैसे कभी " जब मैंने परियोजना को साफ किया " तो सभी त्रुटियां दूर हो गईं!

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.