JAVA + try catch(FileNotFoundException e) gaat catch(Exception e)?

Ik heb een commando dat een bestand op schijf maakt.
Omdat de map waarin het bestand moet worden aangemaakt dynamisch is, heb ik een catch (FileNotFoundException e). In hetzelfde try-blok heb ik al een catch (uitzondering e) -blok.
Om de een of andere reden, wanneer ik mijn code uitvoer en de map bestaat nog niet, wordt het blok catch (Exception e) gebruikt, niet het FileNotFoundException-blok.

De debugger is echter duidelijk (voor mij althans) en toont een FileNotFoundException: java.io.FileNotFoundException: c:\mydata\2F8890C2-13B9-4D65-987D-5F447FF0DDA7\filename.png (Het systeem kan het pad niet vinden gespecificeerd)

Enig idee waarom het niet in het FileNotFoundException-blok gaat?
Bedankt;

CODE:

import java.io.FileNotFoundException;
try{
    Dimension screenSize = Toolkit.getDefaultToolkit().getScreenSize();
    Rectangle screenRectangle = new Rectangle(screenSize);
    Robot robot = new Robot();
    BufferedImage image = robot.createScreenCapture(screenRectangle);
    ImageIO.write(image, "png", new File(fileName));
}
catch (FileNotFoundException e){
    // do stuff here..
    return false;
}
catch(Exception e){
    // do stuff here..
    return = false;
}

Antwoord 1, autoriteit 100%

Het is ook mogelijk dat het specifieke probleem dat u ondervindt geen FileNotFoundException is. Door de “Uitzondering” te gebruiken in een catch-blok (dat de bovenliggende klasse is voor alle uitzonderingen), is dit in feite een “catch all”, omdat het wordt uitgevoerd als er een `uitzondering of een van zijn subklassen wordt gegenereerd.

Probeer de volgende wijziging:

...
catch (Exception e) {
  System.out.println(e.getClass());
}
...

Dit vertelt je de specifieke klasse van de Exception die door dit blok wordt opgevangen. Ik wed dat je zult ontdekken dat de Exception eigenlijk een instantie is van een subklasse (zoals bijvoorbeeld IOException).


Antwoord 2, autoriteit 20%

Uw probleem is dat de FileNotFoundException ergens diep in de java-bibliotheek wordt gegooid en niet wordt verspreid, zodat u hem niet kunt opvangen.
De echte boosdoener hier is een NullPointerException afkomstig van de

ImageIO.write(image, "png", new File(fileName));

bellen. Deze loopt tegen je catch (Exception e)-blok aan.
Als u een catch (NullPointerException e)-blok toevoegt vóór uw algemene Exception-catch, ziet u het daar binnenkomen.

Other episodes