Kirjautuminen

Haku

Tehtävät

Keskustelu: Ohjelmointikysymykset: Java virhe: cannot find symbol

Sivun loppuun

lysergic [01.04.2010 11:14:31]

#

Moi,

Aloitin tänään javan opiskelun javala.cs.tut.fi-sivulla ja nyt olis tällänen tehtävä:

lainaus:

Toteuta annettuun luokkaan staattinen metodi onRekisteriNumero(String s), joka palauttaa true, jos annettu merkkijono on auton rekisterinumero ja false muutoin. Oikeellisuuden tarkistamiseksi riittää, että katsotaan, että:

- merkkijonon pituus on 7 JA
- merkkijonosta löytyy viivamerkki '-' indeksistä 3 (hyväksytään siis myös esim. 123-ABC)

Esimerkkejä oikeista: "ABC-123", "444-AAA"
Esimerkkejä väärästä: "313", "ABC+123"

Olen kirjoittanu tälläisen koodin:

package com.javala.exercise;

public class StaticMethodExercise {

 public static boolean onRekisteriNumero(String s){
  boolean tulos;
  string merkki=s.charAt(3);

  if (s.length()==7 & merkki.equals("-")) {
    tulos=true;
  }else{
    tulos=false;
  }
 return tulos;
 }
}

Tuo heittää nyt virhettä mitä en ymmärrä:

StaticMethodExercise.java: cannot find symbol
symbol  : class string
location: class com.javala.exercise.StaticMethodExercise
string merkki=s.charAt(3);
^
1 error

Missä vika? Miksei tuota stringiä voi luoda?

Isopaha [01.04.2010 11:25:33]

#

Mitä nyt itse huomasin, niin ensinnäkin tuo string-muuttujan määrittely on kirjoitettu väärin. Javassa isolla ja pienellä alkukirjaimella on ero, joten string on tässä tapauksessa kirjoitettava isolla alkukirjaimella. Toiseksi tuo s.charAt(3) palauttaa char-muotoisen arvon, joten luultavasti se koko string-tyypin käyttäminen on virhe.

lysergic [01.04.2010 11:47:00]

#

Ok, no oikeastaan sitä ei tarvitsekaan turhaan laittaa erikseen muuttujaan vaan jotenkin näin?

public static boolean onRekisteriNumero(String s){
  boolean tulos;

  if (s.length()==7 && s.charAt(3)==('-')) {
    tulos=true;
  }else{
    tulos=false;
  }
 return tulos;
 }

Jos charAt hakee isommasta indeksistä kuin 2, tuosta tulee virhe:

  java.lang.NullPointerException
	at com.javala.exercise.StaticMethodExercise.
onRekisteriNumero(StaticMethodExercise.java:67)
	at com.javala.exercise.StaticMethodExercise.
runExercise(StaticMethodExercise.java:53)
	at com.javala.exercise.
ExerciseMain.main(ExerciseMain.java:181)

s saattaa sisältää jotain näistä: "ABC-123", "444-AAA", "313", "ABC+123"

Metabolix [01.04.2010 12:01:11]

#

Sinun pitää ensin tarkistaa, että pituus on tarpeeksi suuri, ja vasta sitten hakea merkki. Jos funktiollesi syötetään teksti "ABC", se kaatuu juuri noin, koska yrität hakea olemattoman merkin.

Edit: Muokkasitkin viestisi. Nyt saat vielä entistä selvemmän ilmoituksen: et ole tarkistanut, onko s mahdollisesti null. Nyt ei varmasti ole kyse enää tietystä indeksistä, vaan mikä tahansa s.-alkuinen tuottaa virheen.

Edit2: Lue Javalan opetusosuudet! Niissä on kaikki tehtävissä tarvittava tieto, ja lisäksi kannattaa olettaa, että suunnilleen kaikkia asioita tarvitaan tehtävissä.

lysergic [01.04.2010 12:08:08]

#

EDIT: Kiitos!

Näin sain sen toimimaan:

public static boolean onRekisteriNumero(String s){
  boolean tulos=false;

  if (s !=null && s.length()==7 && s.charAt(3)==('-')){
    tulos=true;
  }

 return tulos;
}

EDIT2: ja kiitos Antti ;D

Antti Laaksonen [01.04.2010 12:19:42]

#

Poistin viestini, kun ongelma jo ratkesi...

Lisähaasteena voit vielä yrittää lyhentää metodia niin, että siinä ei ole muuttujaa eikä ehtolausetta.

lysergic [01.04.2010 12:50:29]

#

En keksinyt mitään tapaa ilman ehtolausetta. Voisitko kertoa miten tuo onnistuu?

Chiman [01.04.2010 13:02:28]

#

Tee niin että metodin sisältönä on vain sopiva return-rivi.

JussiR [01.04.2010 13:07:16]

#

Jep tuon kyllä ymmärsin, mutta miten saisin sen sisältämään true tai false ilman if-lausetta? Tuota en keksi.

EDIT: Mulla oli toisella selaimella toisella tunnuksella sisällä. Enpä muista miksi tuon (lysergic) olin tehnyt :D Siitä on varmaan aikaa

Metabolix [01.04.2010 13:12:19]

#

Haha, näin ne tuplatunnusten tekijät jäävät kiinni. :D

Muuta ensin metodia niin, ettet käytä erillistä muuttujaa. (Lue oppaista, miten return tekee.) Lue sitten uudestaan ehtolauseista: mitä if-lauseessa kuuluu olla sulkujen välissä? Lopuksi yhdistä nämä asiat.

Voit käyttää mietiskelysi apuna tätä funktiota, jossa yhden rivin ratkaisu lienee ilmeinen:

public static boolean funktio(boolean ehto) {
  boolean apu;
  if (ehto) { // if (ehto == true)
    apu = true;
  } else {
    apu = false;
  }
  return apu;
}

JussiR [01.04.2010 13:19:16]

#

public static boolean funktio(boolean ehto) {
  return ehto;
}

En vaan keksi tuohon mun omaan..

Metabolix [01.04.2010 13:32:57]

#

Tee aivan sama muutos.

Noin lyhyessä pätkässä ei ole kovin monta vaihtoehtoa; olisit tässä ajassa vaikka kokeillut kaikki läpi. :)

JussiR [01.04.2010 13:34:59]

#

Mitä ihmettä? :D Eihän se voi toimia.

Täysin sama olisi

public static boolean onRekisteriNumero(String s){
  return s;
}

Ja vähän järkevämpi

public static boolean onRekisteriNumero(String s){
 return == (s !=null && s.length()==7 && s.charAt(3)==('-'));
}

Mutta ei kumpikaan voi toimia. Mitä siis tarkoitit?

EDIT: Yksi =-merkki lisää.

Metabolix [01.04.2010 13:36:51]

#

Mikä on omassa koodissasi ehto? Täysin sama on se, että palautat suoraan kyseisen ehdon (ts. ehdon tarkistamisesta syntyvän totuusarvon, jos nyt teknisesti puhutaan).

Tuossa =-merkissä ainakaan ei ole mitään järkeä. Ei tämä ole mikään Basic. Ethän edelliseenkään kirjoittanut "return = tulos".

JussiR [01.04.2010 13:40:45]

#

Tuo on tiedossa. Mulla ei vaan ole mitään hajua miten saan tuon totuusarvon ilman if-lausetta, kuten tuossa yritin sanoa jonkun aikaa sitten.

Metabolix [01.04.2010 13:41:38]

#

Et vastannut perustavanlaatuiseen apukysymykseeni. "Mitä if-lauseessa kuuluu olla sulkujen välissä?" Tämä varmaan selviää oppaasta, ja aiempi koodinikin johdattelee aika tehokkaasti. Kun vastaat tähän ja ajattelet hetken, keksit toivottavasti yhteyden tuon esittämäni ehto-parametrin ja oman if-lauseesi ehtona olevan lausekkeen välillä.

Edit: Lisää johdattelevia kysymyksiä, ettei tarvitse samasta vääntää:
Millainen arvo tulee lausekkeesta (1 + 1)?
Millainen arvo tulee lausekkeesta (1 == 1)?
Millainen arvo tulee lausekkeesta (a == b && c == d)?
Millainen arvo if-lauseen ehtona kuuluu olla?
Millainen arvo funktiosi kuuluu palauttaa?

JussiR [01.04.2010 13:51:43]

#

Olen varma että, jos laittaisit valmiin koodin, oppisin sen siitäkin.

Mutta tuo:

return == (s !=null && s.length()==7 && s.charAt(3)==('-'));

on ilmeisesti aika lähellä oikeaa?

Metabolix [01.04.2010 13:54:02]

#

No selvä.

return s != null && s.length() == 7 && s.charAt(3) == '-';

Olen kuitenkin varma, että sinulle olisi enemmän hyötyä noiden muutaman varsin yksinkertaisen kysymyksen ratkaisemisesta. Lausekkeet ja tietotyypit ovat aivan välttämättömiä ymmärtää, jos on tarkoitus oikeasti ohjelmoida jotain.

Muuten, eikö funktion pitäisi tarkistaa myös, että ensimmäiset merkit ovat kirjaimia ja viimeiset numeroita?

JussiR [01.04.2010 14:30:04]

#

Kiitos!

Kyllähän sen kannattaisi tarkistaa tuokin, mutta ohjeessa ei pyydetä niin. Voisihan tuota vielä parantaa noin harjoituksen vuoksi.

Mutta voihan rekisteri olla nykyään melkein millanen vaan, kun on noita erikoisrekkareita.


Sivun alkuun

Vastaus

Aihe on jo aika vanha, joten et voi enää vastata siihen.

Tietoa sivustosta