Virheilmoituksia ja niiden tulkintoja

Tähän dokumenttiin on aloitettu keräämään yleisesti vastaan tulevia virheilmoituksia. Ainakin aluksi tässä on vain syntaksivirheitä, eli vaikka ohjelma kääntyy, niin siinä voi olla loogisia virheitä ja niihin ei vielä puututa. Niitä metsästetään debuggerilla.

Jos saat virheilmoituksen, jota tässä dokumentissa ei ole, lisää virheilmoitus dokumentin loppuun. Mikäli vielä osaat matkia olemassa olevia esimerkkejä, lisää myös ohjelmaesimerkki tästä.

1. Jokin tärkeä merkki puuttuu syntaksin kannalta

1.1 Puolipiste puuttuu

Joskus puuttuva puolipiste on helppoa löytyy kuten alla. Mutta usein puuttuva puolipiste johtaa useisiin muihin virheisiin ja syy voi selvitä paljon myöhemmin kuin missä itse virhekohta on.

# Plugin1
/prg.cs(6,5): error CS1002: ; expected

1.2 Lainausmerkki puuttuu tai on väärässä paikassa

Lainausmerkin puuttuminen voi poikia melkoisen tukun virheilmoituksia, koska seuraavat lauseet jäävät silloin merkkkijonon sisään:

# Plugin2
/prg.cs(5,47): error CS1010: Newline in constant
/prg.cs(6,4): error CS1525: Unexpected symbol `}', expecting `)' or `,'
/prg.cs(6,5): error CS1002: ; expected

Huomaa että virheilmoitukset eivät tule aina sille riville, missä virhe todellisuudessa on vaan riville jossa tehty muutos voisi tehdä syntaksista oikeanlaisen. Eli edellä itse tulostuslause (WriteLine) on rivillä 5 ja ensimmäinen virheilmoitus liittyy sen rivin sarakkeeseen 47. Vastaavasti seuraava ilmoitus liittyy rivin 6 sarakkeeseen 4, eli siinä olevaan lohkon lopettavaan aaltosulkuun }. Näin siksi, että tuossa kohti vasta todetaan ettei syntaksin mukaan seuraava merkki saisi olla aaltosulku.

Tässä virheilmoitukset tarkoittavat että

  • merkkijonon sisälle olisi tulossa rivinvaihtomerkki (koska merkkijonoa ei ole suljettu, newline)
  • riville tarvittaisiin WriteLine-aliohjelman tarvitsema parametrien loppusulku ), nyt sitä ennen tulee vastaa lohkon loppusulku koska merkkijono ei ole "kiinni".
  • lause tarvitsisi puolipisteen aina loppuun (ei välttämättä samalle riville)

Lähes samat virheilmoitukset tulevat, mikäli lainausmerkki on väärässä paikassa ja osin samasta syystä.

# Plugin3
/prg.cs(6,4): error CS1525: Unexpected symbol `}', expecting `)' or `,'
/prg.cs(6,5): error CS1002: ; expected
  • koska loppusulku ja puolipiste jäävät lainausmerkkien sisään, niin kääntäjä ei niitä mistään löydä ja siksi ehdottaa joko sulkua ) tai pilkkua , jotta lauseesta saataisiin syntaksin mukainen
  • kuten edellä puolipiste jää näkemättä

Yksinkertaisen lainausmerkin (kirjain) tapauksessa virheilmoitukset ovat erilaisia:

# Plugin4
/prg.cs(5,20): error CS1012: Too many characters in character literal
/prg.cs(6,8): error CS1525: Unexpected symbol `System'
  • tässä tapauksessa ensimmäinen virheilmoitus on kuvaavin, eli merkkijonovakiossa saa olla vain yksi kirjain ja kun lainausmerkki puuttuu, niin seuraava merkki on sinne menevä puolipiste jne. -koska edellinen rivi on rikki, ei seuraavan rivin System-sanaa tunneta.

Mikäli lainausmerkit puuttuvat kokonaan, näyttää A muuttujan nimeltä kääntäjälle ja silloin tulee tästä valitus:

# Plugin5
/prg.cs(5,20): error CS0103: The name `A' does not exist in the current context

2. Muuttujan väärä käyttö

Mikäli valitetaan puuttuvasta muuttujasta, kannattaa katsoa onko nimet oikein kirjoitettu:

# Plugin6
/prg.cs(6,50): error CS0103: The name `Eka' does not exist in the current context

Muuttuja voi olla myös unohtunut alustaa:

# Plugin7
/prg.cs(6,47): error CS0165: Use of unassigned local variable `luku'
  • muuttuja on esitelty, mutta sitä ei ole alustettu

Sma virhe voi tulla vaikka ohjelmoijan mielestä muuttuja olisikin alustettu. Seuraavassa ei voi tulla tilannetta, jossa luku olisi alustamatta, mutta kääntäjä ei voi olla varman ohjelman logiikasta ja siksi kääntäjän mielestä voi olla tilanne missä ei mennä yhteenkään if-lauseeseen ja siksi tulostetaan ilmoitus alustamattomasta muuttujasta.

# Plugin8
/prg.cs(9,47): error CS0165: Use of unassigned local variable `luku'

Tässä tapauksessa asiaa voi korjata kahdella ei tavalla. Joko käyttää else-lausetta tai alustaa muuttujalle arvon, jolloin toista ehtoa ei tarvita.

# Plugin9
# Plugin10

3. Ehtolauseet eivät muodosta aukotonta ketjua

Edellä oli jo esimerki tapauksesta, jossa ihmisen mielestä aukoton ehtolauseiden ketju ei ole sitä kääntäjän mielestä. vastaava tilanne voisi tulla funktion tapauksessa:

# Plugin11
/prg.cs(10,23): error CS0161: `HelloWorld.Suurempi(int, int)': not all code paths return a value
  • eli funktiossa on luvuttu palauttaa arvo (int) ja vaikka funktiossa on kaksi ehtolausetta, jotka täysin kumoavat toisensa, niin kääntäjä ei voi olla tästä varma ja siksi ilmoitus on että voi olla koodissa "polkuja" joita menemällä päästään tilanteeseen, jossa ei palauteta mitään arvoa.

Ratkaisuna voisi olla (kokeile) vaihtaa toinen ehto pois ja käyttää else osaa jolloin on varmaa että jompi kumpi haara suoritetaan. Toinen (usein funktion tilanteessa parempi) on jättää se ihmisen mielestä päinvastainen ehto kokonaan pois, ilman else-osaakin, koska jos ensimmäinenehto oli totta, on funktiosta poistuttu. Mikä ehto ei ollut totta (eli sen negaatio on totta), niin silloin se on ainoa jäljellä oleva vaihtoehto ilman testaamistakin ja voidaan suoraan tässä tapauksessa palauttaa b.

4. Suoritusjärjestykseen liittyvät virheet

Ehtolauseet tai muut voivat johtaa siihen, etä johonkin kohti ohjelmaa ei ole mahdollista päästä:

# Plugin12

Tämä palauttaa minulla “Suurempi on 5” eikä virheilmoitusta.

14 Jan 21
/prg.cs(14,9): warning CS0162: Unreachable code detected

Koska kaikki aikaisemmat koodipolut jo johtavat aliohjelmasta poistumiseen, niin ei ole mitään tapaa päästä riville return 0;.

5. Lajittelemattomat virheilmoitukset

  • lisää uusi ilmoitus tänne jos et löydä sille valmista paikkaa

6. Uusien virheilmoitusten lisääminen

  1. Mene kohtaan jonka yläpuolelle haluat ilmoituksen lisätä

  2. Siirry hiirellä vasemmalle kunnes tulee turkoosi palkki

  3. Klikkaa sitä ja valitse Add Paragraph Above

  4. Kirjoita virheilmoitus seuraavanlaisten rivien väliin (tämän voi tehdä ottamalla Style-välilehden ja sieltä alueen kokonaisten rivien maalauksen jälkeen Code block)

    ```
    ```
  1. Lisää esimerkkiohjelma (vapaaehtoinen):

    1. mene jonkin esimerkin kohdalla
    2. siirrä kursoria vasemmalla kunnes tulee turkoosi palkki
    3. klikkaa sitä ja valitse sieltä Copy paragraph
    4. mene lisäämäsi virheilmoitusrivin kohdalle
    5. klikkaa taas turkoosia palkkia ja ota menun alalaidasta kynän kuva
    6. valitse sitten menusta Paste ja tarpeen mukaan sisällön kopiointi joko ylä- (Above as content) tai alapuolelle (Below as Content).
    7. mene lisätyn esimerkin kohdalle
    8. avaa muokkausmenu (se turkoosi palkki)
    9. Ota edit ja muokkaa ohjelmaa niin että se antaa saman virheilmoituksen.

These are the current permissions for this document; please modify if needed. You can always modify these permissions from the manage page.