25. juni 2003 - 14:04Der er
30 kommentarer og 1 løsning
Fange Integer.parseInt exception
Hejsa, Er det pænt at fange en fejl på følgende måde? try{ totalOms+=Integer.parseInt(oms.getOms());} catch(Exception e){System.out.println("År mangler omsaetning: "+e); }
Hvad vil så være mest korrekt at gøre i mit tilfælde? jeg kan jo ikke bare undlade try catchen... jeg får i hvert fald en nullpointer exception. Den kommer vel fordi den ikke kan sige += hvis et tal ikke kan parses til en int?
nej, du kan ikke undlade at gribe den, hvis du vil fortage noget ud fra den exception. Det bedste er at sige catch( NumberFormatException e ) istedet for bare Exception e
selvom det er en RuntimeException skal den da gribes alligevel hvis det er relevant.
man kunne dog evt. indkapsle det i en metode: totalOms+=handleConvertion(oms.getOms(),"År mangler omsætning"); totalBudget+=handleConvertion(oms.getBudget(),"År mangler budget");
Det er helt fint at fange alle de exceptions du ønsker og gøre noget fornuftigt ved dem istedet for blot at lade programmet dø.
Du kan fange exceptions udfra deres navn. enten fordefinerede navne som NullPointerException eller navne du selv laver ved selv at extende klassen Exception som nedenfor.
static int maxIndex = 9; static int[] eksempelArray = new int[maxIndex+1];
static int findVerdi ( int index ) throws TalletErForStort, Exception { if ( index > maxIndex ) throw new TalletErForStort() ; if ( index < 0 ) throw new Exception(); return eksempelArray[ index ]; }
public static void main ( String[] args ) { for ( int i=0; i<=maxIndex; i++ ) eksempelArray[i] = 100 + i;
try { System.out.println( "med index = 25" ); System.out.println( findVerdi(25) ); } catch ( TalletErForStort e ) { System.out.print( "for stort index\n" ); e.printStackTrace(); } catch ( Exception e ) { System.out.println( "det gok galt. Jeg aner ikke hvorfor." ); }
try { System.out.println( "med index = -5" ); System.out.println( findVerdi(-5) ); } catch ( TalletErForStort e ) { System.out.println( "for stort index\n" ); e.printStackTrace(); } catch ( Exception e ) { System.out.println( "det gok galt. Jeg aner ikke hvorfor." ); }
try { System.out.println( "med index = 7" ); System.out.println( findVerdi(7) ); } catch ( TalletErForStort e ) { System.out.println( "for stort index\n" ); e.printStackTrace(); } catch ( Exception e ) { System.out.println( "det gok galt. Jeg aner ikke hvorfor." ); } }
trp79 >> static er ikke nødvendigt, men da metoden ikke har brug for andre data end dem den får fra metode kaldet, gør static det muligt at benytte metoden fra andre klasser, uden først at skulle instantiere et nyt objekt af din klasse.
--> Arne Ja det var da en forrygende ide. Hvis jeg nu laver en boolean metode, der returnerer true eller false alt afhængig af om det strengen kan parses eller ej.
Jeg synes bare jeg har hørt at det er dårlig skik at fange fejl med en exception - men det gælder måske kun hvis de ikke er nærmere defineret som ved catch(Exception e) ?
En hel anden ting... er det ikke lidt underligt at man ikke har lavet parseInt sådan at den returnerer null hvis strengen ikke kan parses? eller er der en logisk forklaring på det?
public class NumTest { public static void main(String[] args) { test("123"); test("abc"); } public static void test(String s) { try { int v = Integer.parseInt(s); System.out.println(s + " is a number"); } catch (NumberFormatException e) { System.out.println(s + " is not a number"); } } }
En helt anden ting >> der er ihvertfald en 'religiøs' forklaring :-))
Mange (og også jeg) ser det som direkte forkert når et programmeringssprog prøver at gætte hvad brugeren ønsker. sålænge et program er ekstremt kort gør det ikke noget. I javascript kan du fx gange en streng med et tal, og sproget vil så gætte sig til at den streng nok kan konverteres til en numerisk værdi der kan ganges. og gøre det uden af fortælle dig noget om gætteriet. alert( "25" * 75 ); // virker fint i javascript. men hvad med: alert( "2" + "2" ); // mener programmøren "22" eller tallet 4 ? // javascript gætter på "22" Det gætteri giver fejl nu og da. Og eftrerhånden som de programmer der skrives bliver større bliver den slags 'hjælp' mere og mere farlig. og programmet bliver sværerere at debugge fordi der ikke nødvendigvis kommer en fejlmelding der hvor du lavede fejl. men istedet lang senere hvor den fejl har en konsekvens programmet ikke kan gætte sig udenom.
At returnere nul ved parseint af en ugyldig streng ville også være et sådant gæt. "mon ikke han kan bruge et nul istedet".
riversen> du skrev "NumberFormatException er dog en RuntimeException så den skal ikke gribes". du korrigerede det dog også mens jeg var ved at skrive min første kommentar
Okey, mit program virker med catch(Exception e) men ikke med catch(NumberFormatException e) kan det så skyldes at jeg har en anden fejl? jeg synes at det er lidt underligt.
Ja, det ville nok have været lidt mere smart hvis jeg arbejdede med int hele vejen igennem når der var tale om tal.... men ja, det vil tage adskillige timer at ændre det i de ca. 4000 linier kode jeg har nu....
den kommer også med nullpointer exceptionen når jeg bruger catch(exception e). Men når jeg bruge catch(exception e) genererer programmet et html dokument som det skal, men når jeg bruger catch(numberfor....) så genererer den ikke html dokumentet. :-/
--> Arne Du har så evig ret :o) Det er jo forrygende, tak for hjælpen.
Jeg ved ikke om folk har lyst til at smide et svar, nu har jeg da både lært noget om exceptions og noget om simple datatyper (at de ikke kan returnere null....)
Med hensyn til hvad man skal catche og ikke catche, så er der forskellige opfattelser af dette, men efter min mening bruges der alt for meget tid på at diskuetere dette og for lidt tid på at diskutere på hvilket niveau i programmet man skal catche. Det er helt afgørende både for at få nogle brugbare fejlbeskeder ud og for at kunne recovere fornuftigt.
Ok, det tyder ikke på at fsconsult og riversen vil have del i pointene så de går til dig arne.
I må have tak for hjælpen, mvh Torben
Synes godt om
Ny brugerNybegynder
Din løsning...
Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.