Gå til innhold

Anbefalte innlegg

Det er et sett med oppgaver der man skal opprette en klasse og jeg har kommet til denne oppgaven:

 

 

10. Add the following method to your Line class:

public double getSlope()

Returns the slope of this Line. The slope of a line between points (x1, y1) and (x2, y2) is equal to (y2 – y1) / (x2 – x1). If x2 equals x1 the denominator is zero and the slope is undefined, so you may throw an exception in this case.

 

Hvorfor skal man bruke exception her framfor bare en enkel if-spørring som sjekker om "påstanden" stemmer for deretter å bare skrive ut en enkel feilmelding?

 

Skal nevnes at jeg ikke har satt meg inn i exceptions enda, men etter litt lesing forstår jeg fortsatt ikke hvorfor det skal brukes exception.

Lenke til kommentar
Videoannonse
Annonse

Hva skal metoden returnere etter at du skriver ut feilmeldingen? Det finnes ikke noe riktig svar når x1 = x2... i utgangspunktet bør det muligens ikke forekomme at x1 = x2? I så fall er det et unntak fra "normalen", og programmereren må håndtere dette spesielt, da er det ryddig å bruke exceptions.

Lenke til kommentar

Skal nevnes at jeg ikke har satt meg inn i exceptions enda, men etter litt lesing forstår jeg fortsatt ikke hvorfor det skal brukes exception.

Hensikten med exceptions er å stanse en applikasjon når det oppstår en feil som koden ikke er istand til å redde seg selv ifra. Eksempelvis her hvor en får division by zero. Det er ikke noen korrekt må å løse problemet på for getSlope() og dermed må den feile.

 

I dette tilfelle ville jeg sagt det er en IllegalStateException.

Lenke til kommentar

For meg blir det litt rart å bruke IllegalStateException, jeg ser ikke at Line har forskjellige "states". Hensikten med exceptions som GeirGrusom nevner dekker ikke alt, exceptions kan også brukes for å håndtere unntak som dette, det er helt sikkert fullt mulig for programmereren å håndtere at linjen er loddrett på en fornuftig måte, uten å stanse applikasjonen.

 

Forøvrig er jeg usikker på om Java genererer en exception ved deling på 0.0 (flyttall), mulig resultatet blir +/-infinity, eller NaN hvis teller også er 0.0. Dermed er det kanskje ikke nødvendig å bruke exceptions her, brukeren av getSlope() kan heller sjekke resultatet. Hva som er mest ryddig kan sikkert diskuteres.

Endret av jonny
Lenke til kommentar

Ok. Gikk for ArithmeticException da det var den Java genererte.

 

Ser det er mange måter å håndtere exception på, gjør jeg det riktig her?

	public double getSlope() {
		try {
			return (p2.y - p1.y) / (p2.x - p1.x);
		} catch(ArithmeticException e) {
			System.out.println("Cannot divide by zero.");
			return 0.0;
		}
	} 
Endret av banansplitt™
Lenke til kommentar

Du returnerer 0.0, som er feil svar. Exception-håndteringen bør skje der du bruker getSlope(), ikke i getSlope().

Helt greit at den kaster exception på innsiden. Koden på utsiden bør heller sørge for at getSlope() ikke blir kalt dersom objektets state er ugyldig.

 

 

public double getSlope() throws IllegalStateException {
    double slopeWidth = p2.x - p1.x;
    if(Math.Abs(slopeWidth) < Double.Epsilon)
         throw new IllegalStateException("Cannot determine slope of an infinitaly steep line.");
    return (p2.y - p1.y) / slopeWidth;
}
Lenke til kommentar

Opprett en konto eller logg inn for å kommentere

Du må være et medlem for å kunne skrive en kommentar

Opprett konto

Det er enkelt å melde seg inn for å starte en ny konto!

Start en konto

Logg inn

Har du allerede en konto? Logg inn her.

Logg inn nå
  • Hvem er aktive   0 medlemmer

    • Ingen innloggede medlemmer aktive
×
×
  • Opprett ny...