Je vergeet er even bij te zeggen dat dat
per statement is, anders heb je er nog niets aan. Toegegeven, exceptions hoor je meestal te vangen, en nou is een IllegalArgumentException toevallig een RuntimeException die je niet per se hoeft af te vangen, maar het is echt een ramp om de hele tijd try/catch statements te
moeten schrijven, terwijl het enige wat je wilt is dat ie gewoon klapt in je debugger. Daarom ben ik ook voor asserts, en exceptions alleen in de daadwerkelijk uitzonderlijke gevallen.
Ook wil ik even reageren op de mensen die iets zeggen over dat Exceptions een negatief effect hebben op performance, omdat er veel dubbelgecheckt wordt enzo.
Nou nee, het is meer het stack unwinding wat een exception relatief duur maakt

Performance is sowieso niet iets waar een compiled code interpreter als de JVM voor bedoeld is, hoewel je natuurlijk best nog wat aan je code kunt twieken om het beter te laten performen, zul je met native code (lees assembly of machinetaal) altijd betere performance halen. Helaas kost het kloppen van de code dan wel wat extra uurtjes, zeker als je meerdere hardware platforms wilt ondersteunen.
Beetje raar om de vergelijking met asm te trekken en alle native 3rd generation talen maar achterwege te laten. En voor asm gaat dat wat je zegt idd wel op, maar het is echt onzin om te stellen dat in java productiever gewerkt kan worden dan in een native taal. Persoonlijk ben ik in C++ 10x zo productief dan in java, wat vooral te maken heeft met deterministic finalization, operator overloading, templates en het simpele feit dat er niet echt een verschil zit tussen primitieven en objecten (je kunt ze beide zowel op de stack als op de heap aanmaken)
En ik heb persoonlijk het vermoeden dat de simpele try catch structuur zoals ik hierboven beschrijf door de compiler nog wel geoptimaliseerd wordt.
Er valt weinig aan te optimaliseren, het is meer een runtime iets.
Zoijar schreef op 03 juni 2004 @ 11:27:
Bij 'verwijderingen' of 'opruimen' moet je altijd lief zijn. Simpelweg omdat het nogal wat problemen kan geven als een destructor exceptions gooit. Het maakt het ook makkelijker om gewoon altijd iets te verwijderen aan het einde, dan hoef je niet steeds van die checks in te bouwen overal.
bv. dit:
C++:
1
2
3
4
5
6
7
8
9
10
11
12
| void foo() {
Connection a, b;
try {
a.open();
b.open();
} catch (...) {
a.close();
b.close();
throw;
}
} |
Maakt het wat makkelijker dan dat je eerst weer moet gaan kijken of a en b wel closed kunnen worden.
Die close is trouwens typisch iets wat ik in de destructor zou doen van Connection, waardoor die hele try/catch overbodig wordt. Maar ik begrijp dat je op die manier niet je punt kan maken