Aloittelijan ongelma Javassa

Tervehdys kaikille,

Saan oheisen koodin käännettyä, mutta ajettaessa valmista ohjelmaa saan Y/N kysymyksen jälkeen virheen

"Exception in thread “main” java.lang.NullPointerException at TicketPriceWithDiscount.main(java1002.java:16)

Koodi on tässä:

import java.util.Scanner;

class TicketPriceWithDiscount {

public static void main(String args[]) {

Scanner myScanner = new Scanner(System.in);
int age;
double price = 0.00;
char reply;

System.out.print("How old are you? ");
age = myScanner.nextInt();

System.out.print(“Have a coupon? (Y/N) “);
reply = myScanner.findInLine(”.”).charAt(0);

if (age >= 12 && age < 65) {
price = 9.25;
}
if ( age < 12 || age >=65) {
price = 5.25;
}

if (reply == ‘Y’ || reply == ‘y’) {

price -= 2.00;
}
if (reply != ‘Y’ && reply != ‘y’ &&
reply!=‘N’ && reply!=‘n’) {

System.out.println(“Huh?”);
}

System.out.print(“Please pay $”);
System.out.print(price);
System.out.print(". ");
System.out.println(“Enjoy the show!”);
}
}
== ei koodia

Kimmo

Hih, mitään en Javasta tiedä, mutta kurkistelin vähän oppaita ja sain tuon toimimaan virheittä, jos tämä:

reply = myScanner.findInLine(".").charAt(0);

…korvataan tällä:

reply = myScanner.next().charAt(0);

Ymmärrän, ettei tuo ole sama asia, mutta nähtävästi tuo edellinen rivi aiheuttaa nollapointterivirheen syystä tai toisesta.

Ok, kiitoksia paljon avusta.

Semmoinen kysymys tuli vielä mieleen tästä ongelmasta, että onko Javassa noin yleensä mitenkä hyvä yhteensopivuus taaksepäin? Tuo listaus on 2007 julkaistusta kirjasta, olisiko iällä tekemistä asian kanssa?

Kimmo

Ohjelman saa sellaisenaan ajamaan suorituksen ilman poikkeuksien laukaisemista antamalla kaksi arvoa ensimmäisessä kysymyksessä, mutta silloin reply:n arvoksi tulee välilyönti, eikä jälkimmäistä kysytä ollenkaan.

Kääntäjä ilmoittaa depricated-varoitusherjoilla, mikäli käyttää vanhoja käytäntöjä.

Ainakin kahdesti Javan historiassa on käyttöliittymän tekemisen tapa vaihtunut. Jälkimmäinen lienee tapahtuneen viime vuosituhannella.

Sen jälkeen en tiedä, mutten ole nykyisin koskenutkaan Javaan(, vaikka ihan hyvä kulkupeli se taitaa ollakin ;D ).

java TicketPriceWithDiscount
How old are you? 12 y
Have a coupon? (Y/N)
Huh?
Please pay $9.25. Enjoy the show!

Eli ei siis toimi suoraan haluamallasi tavalla.

Toimineen myös tällä tavalla pienimmillä muutoksilla:

import java.util.Scanner;

class TicketPriceWithDiscount {

public static void main(String args[]) {

Scanner myScanner = new Scanner(System.in);
int age;
double price = 0.00;
char reply;

System.out.print("How old are you? ");
age = myScanner.nextInt();

System.out.print("Have a coupon? (Y/N) ");
myScanner=new Scanner(System.in);  // Toisin sanoen vain tämä rivi lisättiin...
reply = myScanner.findInLine(".").charAt(0);

if (age >= 12 && age < 65) {
price = 9.25;
}
if ( age < 12 || age >=65) {
price = 5.25;
}

if (reply == 'Y' || reply == 'y') {

price -= 2.00;
}
if (reply != 'Y' && reply != 'y' &&
    reply!='N' && reply!='n') {

System.out.println("Huh?");
}

System.out.print("Please pay $");
System.out.print(price);
System.out.print(". ");
System.out.println("Enjoy the show!");
}
}
[/quote]

Tervehdys kaikille,

Onko Javassa jonkinlaista rajoitusta sille, mitenkä pitkiä listoja tai arraytä pystyy tekemään?

Kimmo

[quote=“kkoistinen74, post:6, topic:1600”]Tervehdys kaikille,

Onko Javassa jonkinlaista rajoitusta sille, mitenkä pitkiä listoja tai arraytä pystyy tekemään?

Kimmo[/quote]

Muistaakseni joskus katsoin, että enintään niin monta alkiota kuin int:n suurin arvo on. Joka on siis 2^31-1. Mutta jos tuo tulee vastaan, niin sitten lienee muistiakin mennyt aika mukavasti.