banansplitt™ Skrevet 30. august 2013 Del Skrevet 30. august 2013 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
jonny Skrevet 30. august 2013 Del Skrevet 30. august 2013 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
banansplitt™ Skrevet 30. august 2013 Forfatter Del Skrevet 30. august 2013 Ok. Hvilken exception ville det vært lurt å bruke her? Tittet gjennom lista og for meg så IllegalArgumentException ut som det rette valget? Lenke til kommentar
jonny Skrevet 30. august 2013 Del Skrevet 30. august 2013 (endret) ArithmeticException er vel en god kandidat. Den du nevner er vel tenkt brukt når programmeren gir inn et ugyldig argument til en funksjon, getSlope() har ingen argumenter. Endret 30. august 2013 av jonny Lenke til kommentar
GeirGrusom Skrevet 30. august 2013 Del Skrevet 30. august 2013 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
jonny Skrevet 30. august 2013 Del Skrevet 30. august 2013 (endret) 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 30. august 2013 av jonny Lenke til kommentar
banansplitt™ Skrevet 30. august 2013 Forfatter Del Skrevet 30. august 2013 (endret) 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 30. august 2013 av banansplitt™ Lenke til kommentar
jonny Skrevet 30. august 2013 Del Skrevet 30. august 2013 Du returnerer 0.0, som er feil svar. Exception-håndteringen bør skje der du bruker getSlope(), ikke i getSlope(). Lenke til kommentar
banansplitt™ Skrevet 30. august 2013 Forfatter Del Skrevet 30. august 2013 Ok, så jeg skal ikke returnere noe, kun skrive ut en feilmelding? public double getSlope() { return (p2.y - p1.y) / (p2.x - p1.x); } try { System.out.println(l1.getSlope()); } catch(ArithmeticException e) { System.out.println("Cannot divide by zero."); } Lenke til kommentar
jonny Skrevet 30. august 2013 Del Skrevet 30. august 2013 Hva du skal gjøre er jo avhengig av du skal bruke resultatet fra getSlope() til. getSlope() vil forøvrig kun kaste exception hvis p2.x og p1.x er integer-variabler. Lenke til kommentar
GeirGrusom Skrevet 30. august 2013 Del Skrevet 30. august 2013 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
Anbefalte innlegg
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 kontoLogg inn
Har du allerede en konto? Logg inn her.
Logg inn nå