Kirjautuminen

Haku

Tehtävät

Keskustelu: Ohjelmointikysymykset: Javalla kääntäminen

Sivun loppuun

jack [20.03.2007 16:19:45]

#

Kirjoitan ohjelman:

class HelloWorld {
    public static void main (String[] args) {
       System.out.println("Hello, world");
    }
}

sen jälkeen käännän sen Komentorivillä komennolla javac Hello.java.
Ei virheitä.
Sitten kirjoitan komennon java HelloWorld, saan vastaukseksi:
Exception in thread "main" java.lang.NoClassDefFoundError: HelloWorld
Voisiko joku kertoa mistä tämä johtuu ja miten pystyn kääntämään ohjelmia.
Minulla on jdk 1.6.0.

(Mod. Edit. Kooditagit ovat suotavat, vaikka lyhyt pätkä onkin.)

tn [20.03.2007 16:26:42]

#

Eikös tiedoston ja luokan nimen pidä olla sama? Nyt sinulla on tiedostona Hello ja luokkana HelloWorld.

msdos464 [20.03.2007 18:21:02]

#

mietin, että pitäisikö ekan rivin olla "public class HelloWorld", vai eikö tuo public ole pakollinen?

Blaze [20.03.2007 19:55:42]

#

No koodissa ei ainakaan ole mitään vikaa, sehän kääntyy. Myöskään luokan ja tiedoston nimi ei oo aivan pakko olla samat, vaikka se suositeltavaa onkin.

Vika on siis ajoympäristössä, jos pitäis lähteä veikkaamaan, niin CLASSPATH-ympäristömuuttuja ei oo kohallaan. CLASSPATH:han sisältää ne hakemistot, josta noita ajettavia luokkia haetaan, sieltä pitäis löytyä piste, joka tarkottaa sitä hakemistoa, jossa kulloinkin ollaan.

FooBat [21.03.2007 19:23:26]

#

msdos464 kirjoitti:

mietin, että pitäisikö ekan rivin olla "public class HelloWorld", vai eikö tuo public ole pakollinen?

Javassa on neljä näkyvyysluokkaa: private, protected, public ja 'default'. Jos mitään kolmesta edellisestä määreestä ei käytetä, käytetään oletusmäärettä, joka on pakettinäkyvyys eli vain saman paketin sisällä olevat luokat voi käyttää sitä. Protected eroaa tästä siten, että myös perityt luokat voivat käyttää sitä (protected ja private on sallittu luokkien yhteydessä vain luokkien sisäisillä luokilla.)

Näköjään public:iksi merkityt luokat pitää olla saman nimisessä tiedostossa kuin luokan nimi, mutta default tyyppiset eivät (Näin ainakin javac:in mukaan). Enpä ollut tätä ennen havainnutkaan.

msdos464 [22.03.2007 08:26:01]

#

FooBat kirjoitti:

Näköjään public:iksi merkityt luokat pitää olla saman nimisessä tiedostossa kuin luokan nimi, mutta default tyyppiset eivät (Näin ainakin javac:in mukaan). Enpä ollut tätä ennen havainnutkaan.

Enkä minä tiennyt :) Taas sitä oppi jotain uutta.

jack [22.03.2007 15:02:15]

#

Kiitos että muisutitte CLASSPATH muuttujasta. Sain ohjelman toimimaan komennolla java -cp . HelloWorld.

_Pete_ [24.03.2007 09:54:17]

#

FooBat kirjoitti:

Javassa on neljä näkyvyysluokkaa: private, protected, public ja 'default'. Jos mitään kolmesta edellisestä määreestä ei käytetä, käytetään oletusmäärettä, joka on pakettinäkyvyys eli vain saman paketin sisällä olevat luokat voi käyttää sitä. Protected eroaa tästä siten, että myös perityt luokat voivat käyttää sitä (protected ja private on sallittu luokkien yhteydessä vain luokkien sisäisillä luokilla.)

Näköjään public:iksi merkityt luokat pitää olla saman nimisessä tiedostossa kuin luokan nimi, mutta default tyyppiset eivät (Näin ainakin javac:in mukaan). Enpä ollut tätä ennen havainnutkaan.

Itseasiassa tuo default ei liity access control:in (http://java.sun.com/docs/books/jls/third_edition/html/names.html#6.6) vaan package:een. Eli jos luokan packagea ei ole määritelty, se kuuluu default packageen.

Access control:n avulla voidaan luokka määritellä joko public, protected tai private niin kuin sanoit. Tuolta Java:n specification sivuilta voi asiasta lukea lisää...

FooBat [24.03.2007 14:46:09]

#

_Pete_ kirjoitti:

FooBat kirjoitti:

Javassa on neljä näkyvyysluokkaa: private, protected, public ja 'default'. Jos mitään kolmesta edellisestä määreestä ei käytetä, käytetään oletusmäärettä, joka on pakettinäkyvyys eli vain saman paketin sisällä olevat luokat voi käyttää sitä. Protected eroaa tästä siten, että myös perityt luokat voivat käyttää sitä (protected ja private on sallittu luokkien yhteydessä vain luokkien sisäisillä luokilla.)

Näköjään public:iksi merkityt luokat pitää olla saman nimisessä tiedostossa kuin luokan nimi, mutta default tyyppiset eivät (Näin ainakin javac:in mukaan). Enpä ollut tätä ennen havainnutkaan.

Itseasiassa tuo default ei liity access control:in (http://java.sun.com/docs/books/jls/third_edition/html/names.html#6.6) vaan package:een. Eli jos luokan packagea ei ole määritelty, se kuuluu default packageen.

Access control:n avulla voidaan luokka määritellä joko public, protected tai private niin kuin sanoit. Tuolta Java:n specification sivuilta voi asiasta lukea lisää...

Eikös tuo 6.6.1 puhu juuri default accessista. Vai onko sisälukutaidossani jotain vikaa? Omien kokemusten perusteella se myös toimii näin.

6.6.1 kirjoitti:

Otherwise, we say there is default access, which is permitted only when the access occurs from within the package in which the type is declared.

Samoin

6.6.1 kirjoitti:

If a top level class or interface type is not declared public, then it may be accessed only from within the package in which it is declared.

Mainittakoon nyt vielä, että default tarkoittaa siis suomeksi oletusta eli on kyllä olemassa oletus paketti, mutta on myös oletus näkyvyysluokka.

moptim [24.03.2007 18:39:50]

#

Mistä javac-ohjelman saa? Itelläni on joku "hämärä" javacc, ei ole wörkkinyt. Pitää yrittää uusiksi... ...eikä toiminut.

Blaze [24.03.2007 18:53:52]

#

http://java.sun.com/javase/downloads/index.jsp

moptim [24.03.2007 19:51:21]

#

Kiitti.

_Pete_ [25.03.2007 08:21:57]

#

FooBat kirjoitti:

6.6.1 kirjoitti:

If a top level class or interface type is not declared public, then it may be accessed only from within the package in which it is declared.

Mainittakoon nyt vielä, että default tarkoittaa siis suomeksi oletusta eli on kyllä olemassa oletus paketti, mutta on myös oletus näkyvyysluokka.

Niin eli 6.6.1 näkyvyysluokka on tuossa tapauksessa protected. Näkyvyys luokkia on siis kolme, public, protected ja private ja jos sitä ei ole tuossa tapauksessa ollenkaan määritelty, näkyvyysluokka on protected.

FooBat [25.03.2007 21:20:46]

#

_Pete_ kirjoitti:

FooBat kirjoitti:

6.6.1 kirjoitti:

If a top level class or interface type is not declared public, then it may be accessed only from within the package in which it is declared.

Mainittakoon nyt vielä, että default tarkoittaa siis suomeksi oletusta eli on kyllä olemassa oletus paketti, mutta on myös oletus näkyvyysluokka.

Niin eli 6.6.1 näkyvyysluokka on tuossa tapauksessa protected. Näkyvyys luokkia on siis kolme, public, protected ja private ja jos sitä ei ole tuossa tapauksessa ollenkaan määritelty, näkyvyysluokka on protected.

Ei vaan default. Tyhjä ei ole sama kuin protected. Tyhjäksi määriteltyä jäsenmuuttujaa ei voi käyttää peritystä luokasta, mutta protected tyyppistä voi. Pääluokan tapauksessa ei periaatteessa olisi väliä käytetäänkö default vai protected tyyppiä, koska protected tyyppistä ei pystyisi kuitenkaan perimään paketin ulkopuolelta (niinpä protected on kielletty pääluokilta sekaannusten välttämiseksi). Voidaan ehkä ajatella, että tuo pääluokalla toimisi siis protectedin tavoin, mutta mielestäni on selkeämpää hyväksyä, että se on suoraan sitä neljättä tyyppiä eli jäsenmuuttujilta tuttua default tyyppiä joka on suoraan pakettinäkyvyys.

_Pete_ [26.03.2007 07:10:27]

#

FooBat kirjoitti:

Voidaan ehkä ajatella, että tuo pääluokalla toimisi siis protectedin tavoin, mutta mielestäni on selkeämpää hyväksyä, että se on suoraan sitä neljättä tyyppiä eli jäsenmuuttujilta tuttua default tyyppiä joka on suoraan pakettinäkyvyys.

Kappas vaan, olin aikaisemmin siinä luulossa, että jos access controlia ei ole määritelty se on sama kuin protected. No kaikkea sitä oppii, tässä onkin tuo paremmin esiteltynä:

http://java.sun.com/docs/books/tutorial/java/javaOO/accesscontrol.html


Sivun alkuun

Vastaus

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

Tietoa sivustosta