Java >> Java tutorial >  >> Tag >> throw

Kan konstruktører smide undtagelser i Java?

Ja, konstruktører kan kaste undtagelser. Normalt betyder det, at det nye objekt umiddelbart er berettiget til affaldsindsamling (selvom det måske ikke bliver afhentet i et stykke tid, selvfølgelig). Det er dog muligt for det "halvkonstruerede" objekt at blive ved, hvis det er gjort sig selv synligt tidligere i konstruktøren (f.eks. ved at tildele et statisk felt eller tilføje sig selv til en samling).

En ting at være forsigtig med at smide undtagelser i konstruktøren:fordi kalderen (normalt) ikke har nogen mulighed for at bruge det nye objekt, skal konstruktøren være forsigtig med at undgå at erhverve uadministrerede ressourcer (filhåndtag osv.) og derefter kaste en undtagelse uden at slippe dem. For eksempel, hvis konstruktøren forsøger at åbne en FileInputStream og en FileOutputStream , og den første lykkes, men den anden mislykkes, bør du prøve at lukke den første stream. Dette bliver sværere, hvis det er en underklasse-konstruktør, der kaster undtagelsen, selvfølgelig... det hele bliver lidt tricky. Det er ikke et problem ret ofte, men det er værd at overveje.


Ja, de kan give undtagelser. Hvis det er tilfældet, vil de kun blive delvist initialiseret, og hvis de ikke er endelige, kan de blive angrebet.

Følgende er fra Secure Coding Guidelines 2.0.

Delvist initialiserede forekomster af en ikke-finale klasse kan tilgås via et finalizer-angreb. Angriberen tilsidesætter den beskyttede færdiggørelsesmetode i en underklasse og forsøger at oprette en ny forekomst af den underklasse. Dette forsøg mislykkes (i ovenstående eksempel kaster SecurityManager-tjekket i ClassLoaders konstruktør en sikkerhedsundtagelse), men angriberen ignorerer simpelthen enhver undtagelse og venter på, at den virtuelle maskine udfører færdiggørelse på det delvist initialiserede objekt. Når det sker, påkaldes implementeringen af ​​den ondsindede færdiggørelsesmetode, hvilket giver angriberen adgang til dette, en reference til det objekt, der afsluttes. Selvom objektet kun er delvist initialiseret, kan angriberen stadig påberåbe sig metoder på det (og derved omgå SecurityManager-kontrollen).


Absolut.

Hvis konstruktøren ikke modtager gyldig input eller ikke kan konstruere objektet på en gyldig måde, har den ingen anden mulighed end at smide en undtagelse og advare dens kaldende.


Java tag