Pereiti prie turinio

JAVA Problemos (Naujokui)


Rekomenduojami pranešimai

Sveiki, neseniai užsikabinau už JAVOS ir pradėjau savo malonumui paprastus kodus rašyti. Kaip visada, susidūriau su compiler error, bet šį kartą nerandu klaidos, nors tu ką.

 

/*
Programa, parenkanti tau uzduoti pagal savaites diena

Variantai gali buti pildomi
*/

import java.io.*;

public class MoodApp {

public static void main (String[] args) {

String pirm = "pirmadienis";
String ant = "antradienis";
String trec = "treciadienis";
String ketv = "ketvirtadienis";
String penkt = "penktadienis";
String sest = "sestadienis";
String sekm = "sekmadienis";




String diena;
String nuotaik;



BufferedReader reader;

reader = new BufferedReader(new InputStreamReader(System.in));

System.out.print("Ivesk savaites diena (mazosiomis raidemis:");



try{
diena = reader.readLine();


if (diena == pirm) {
   nuotaik = "Linksmas";
} else if (diena == ant) {
nuotaik = "Liudnas";
}else if (diena == trec) {
nuotaik = "Dziaugsmingas";
   }else if (diena == ketv) {
nuotaik = "Pikts";
}else if (diena == penkt) {
nuotaik = "Girtas";
}else if (diena == sest) {
nuotaik = "Pakyletas";
}else if (diena == sekm) {
nuotaik = "WWW";
}



System.out.println("Siandienos nuotaika -  " + nuotaik);

}

catch (IOException ioe){

System.out.println("Klaida");

}



}

}

 

Compiliuojant išmeta klaidą "MoodApp.java:58: error: variable nuotaik might not have been initialized

System.out.println("Siandienos nuotaika - " + nuotaik);".

 

Kaip suprantu, klaida dėl variable nuotaik, bet niekaip nerandu priežasties. Kas turite laiko, atsakykite, būčiau dėkingas:)

 

(Ir nekreipkite dėmesio į keistą sintaksės formą, mokausi tik :D)

Redagavo Straideris
Nuoroda į pranešimą
Dalintis kituose puslapiuose

Tai tavo if'ai nepraeina, dėl to "nuotaik" yra neinicializuotas ir gauni error'ą.

 

Tarkim po diena = read... parašyk nuotaik = "Nerasta savaitės diena";

 

Ir geriau nenaudok == , o pvz if (diena.equalsIgnoreCase(ant) {}

 

Ir dar geriau switch naudok :)

Redagavo dice
Nuoroda į pranešimą
Dalintis kituose puslapiuose

Supratau, bet problema vėl kita (čia turbūt, nes kiti String pirm ant ir t.t... nepraeina) - dabar nesvarbu ką įvedi į input, rašo nerasta savaitės diena

 

EDIT: Veikia su equalsignorecase, kažkodėl su == mesdavo tik nerasta savaitės diena

 

Vistiek nepagavau, kodėl reikėjo nuotaiką prieš if parašyti kaip "nerasta savaitės diena". Čia taip išeina, kad prieš if nuotaik lygi "nerasta savait diena", o if keičia jo reikšmę?:/

 

Ai ir dar, koks skirtumas tarp IgnoreCase ir be jo?

Redagavo Straideris
Nuoroda į pranešimą
Dalintis kituose puslapiuose

Tai išsivesk diena ir pažiūrėk ką gausi. Ir šiaip naudok equals ;)

 

Pasiskaityk http://stackoverflow.com/questions/767372/java-string-equals-versus

 

Supratau, bet problema vėl kita (čia turbūt, nes kiti String pirm ant ir t.t... nepraeina) - dabar nesvarbu ką įvedi į input, rašo nerasta savaitės diena

 

EDIT: Veikia su equalsignorecase, kažkodėl su == mesdavo tik nerasta savaitės diena

 

Vistiek nepagavau, kodėl reikėjo nuotaiką prieš if parašyti kaip "nerasta savaitės diena". Čia taip išeina, kad prieš if nuotaik lygi "nerasta savait diena", o if keičia jo reikšmę?:/

 

Ai ir dar, koks skirtumas tarp IgnoreCase ir be jo?

 

Pasiskaityk link'ą, kur prieš tai parašiau. Negalima lyginti su ==, reikia su equals, ar equalsignorecase (nekreipia skirtumo į didžiasias, mažasias raides).

 

Esmė buvo, kad tu nebuvai inicializavęs nuotaik kintamojo ir tavo if'ai nerasdavo TRUE reikšmės ir tuomet bandydavai išvesti kintamajį, kurio neinicializavai ir todėl klaidą gaudavai.

 

p.s. Jei rašai per if'us, tai pabaigoj pridėk else { nuotaik = "Nerasta diena. "}, tuomet nereiks viršuj inicializuoti kintamojo.

Redagavo dice
Nuoroda į pranešimą
Dalintis kituose puslapiuose

Papraščiau tariant, jis buvo tuščias, dėlto?:)

 

Nežinau, kas tau yra tuščias, bet jis buvo neinicializuotas.

Nes klasės viršuj apsibrėžei:

String nuotaik; O jei būtum parašęs String nuotaik = ""; tuomet jį būtum inicializavęs su tuščia reikšme ir viskas būtų veikę.

Nuoroda į pranešimą
Dalintis kituose puslapiuose

Nežinau, kas tau yra tuščias, bet jis buvo neinicializuotas.

Nes klasės viršuj apsibrėžei:

String nuotaik; O jei būtum parašęs String nuotaik = ""; tuomet jį būtum inicializavęs su tuščia reikšme ir viskas būtų veikę.

 

Na ir turėjau omeny String nuotaik;, kad tuščias. Nekalbu dar programavimo terminais;)

Nuoroda į pranešimą
Dalintis kituose puslapiuose

Na ir turėjau omeny String nuotaik;, kad tuščias. Nekalbu dar programavimo terminais;)

 

Nežinau ar problema dar aktuali, bet kad būtų aiškiau ir kitą kartą nekiltų klausimų, tai reiktų žinoti jog metodo (šiuo atveju "main") viduje aprašyti kintamieji turi būti inicializuoti (kintamajam priskirta reikšmė) prieš juos panaudojant. Iš pirmo žvilgsnio galbūt atrodo, kad tavo kintamajam "nuotaik" if bloke priskiriama reikšmė ir tada ji išspausdinama konsolėje. Tačiau atidžiau pažiūrėjus matosi, kad įvedus neegzistuojančią savaitės dieną tavo kintamasis "nuotaik" nebus inicializuojamas (nebus priskirta jokia reikšmė) ir nebus ką spausdinti konsolėje. Aišku tu gali sakyt, kad visą laiką ivedinėsi egzistuojančią savaitės dieną, bet šitoj vietoj kompilaitorius yra pakankamai gudrus, kad numatytų jog gali būti tokia situacija kai kintamasis gali būti neinicializuotas, todėl problemą reikia išspręsti kompiliavimo metu, kad programa nenulūžtų vėliau veikimo metu. Yra keletas paprastų sprendimo būdų.

 

Pirmas variantas. "if" (ir "else if") sąlygų grandinės pabaigoje pridėk sąlyga "else", kur kintamajam "nuotaik" priskirsi kokią nors default'inę reikšmę, jei bus įvesta neegzistuojanti diena.

 

Antras variantas. Aprašęs kintąmąjį iškart inicializuok jį. Geriausiai priskirtk kintamajam reikšmę "null". Nors konkrečios reikšmės kintamasis ir neįgauna, bet jis jau yra inicializuotas. Šiuo atveju įvedus neegzistuojančią savaitės dieną konsolėje matysi "Siandienos nuotaika - null"; Tavo programa duotuoju atveju veiks, tačiau jei vėliau sugalvosi kintamajam "nuotaik" panaudoti kokį nors String klasės metodą (pvz.: nuotaik.toUpperCase()) gausi NullPointerException. Todėl geriausias variantas būtų apjungti pirmąjį ir antrąjį variantus.

 

Trečias variantas. Kaip jau minėjau metodo viduje aprašyti kintamieji turi būti inicializuojami prieš juos panaudojant, tačiau kintamuosius aprašius klasėje jie inicializuojami automatiškai (visiem objektam įskaitant String priskiriama reikšmė "null"). Taigi iškėlęs kintamąjį iš metodo į klasę gausi analogišką variantą kaip aprašyta antrajame variante. Šį variantą taip pat geriausia apjungti su pirmuoju variantu. Šio varianto privalumas tas, kad kintamąjį iškėlęs į klasės lygį, galėsi tą kintamąjį panaudot ateityje galbūt atsirasenčiuose kituose šios klasės metoduose.

Nuoroda į pranešimą
Dalintis kituose puslapiuose

Prisijunkite prie diskusijos

Jūs galite rašyti dabar, o registruotis vėliau. Jeigu turite paskyrą, prisijunkite dabar, kad rašytumėte iš savo paskyros.

Svečias
Parašykite atsakymą...

×   Įdėta kaip raiškusis tekstas.   Atkurti formatavimą

  Only 75 emoji are allowed.

×   Nuorodos turinys įdėtas automatiškai.   Rodyti kaip įprastą nuorodą

×   Jūsų anksčiau įrašytas turinys buvo atkurtas.   Išvalyti redaktorių

×   You cannot paste images directly. Upload or insert images from URL.

Įkraunama...
  • Dabar naršo   0 narių

    Nei vienas registruotas narys šiuo metu nežiūri šio puslapio.

  • Prisijunk prie bendruomenės dabar!

    Uždarbis.lt nariai domisi verslo, IT ir asmeninio tobulėjimo temomis, kartu sprendžia problemas, dalinasi žiniomis ir idėjomis, sutinka būsimus verslo partnerius ir dalyvauja gyvuose susitikimuose.

    Užsiregistruok dabar ir galėsi:

    ✔️ Dalyvauti diskusijose;

    ✔️ Kurti naujas temas;

    ✔️ Rašyti atsakymus;

    ✔️ Vertinti kitų žmonių pranešimus;

    ✔️ Susisiekti su bet kuriuo nariu asmeniškai;

    ✔️ Naudotis tamsia dizaino versija;

    ir dar daugiau.

    Registracija trunka ~30 sek. ir yra visiškai nemokama.

  • Naujausios temos

  • Karštos temos

×
×
  • Pasirinkite naujai kuriamo turinio tipą...