când să se arunce FileNotFoundException (Programare, Java)

Gropai a intrebat.

Am apelat o metodă numită readFile() în cadrul main metoda, readFile() aruncă FileNotFoundException, dar main nu o face, ca în cazul următor:

public static void main(String[] args){
    readFile();
}

public static void readFile() throws FileNotFoundException{
    Scanner input = new Scanner(new File("file.txt"));
    ...
}

Când am compilat programul, am primit o eroare la readFile() în metoda main metoda. Se pare că trebuie să arunc o excepție în antetul lui main de asemenea. De ce trebuie să arunc o excepție în ambele antecedente ale metodei main și readFile()?

Comentarii

  • Trebuie să o prindeți, nu să o aruncați. –  > Por Drew Kennedy.
  • Ce doriți să obțineți prin propagarea acestei excepții? –  > Por PM 77-1.
  • Deoarece main apelează readFile, iar dacă readFile aruncă o excepție FileNotFound, atunci main va propaga excepția dacă nu o prinde. Prin urmare, trebuie fie să prindeți excepția în main, fie să declarați că poate arunca o excepție, chiar dacă indirect. –  > Por Rup.
  • Cred că îi confunzi pe oameni cu „De ce trebuie să arunc o excepție”: Cred că vrei să spui „de ce trebuie să declar că main poate arunca excepția” –  > Por Rup.
5 răspunsuri
erip

Opțiunile dvs. pentru manipulare Exceptions sunt să le prindeți și să le tratați imediat sau să le aruncați în funcție și să propagați excepția până la apelantul funcției.

Pentru main, , este logic să catch și să tratăm excepția acolo.

public static void main(String[] args){
  try {
    readFile();
  } catch (FileNotFoundException e) {
    // Do something with `e`
  }
}

public static void readFile() throws FileNotFoundException {
  Scanner input = new Scanner(new File("file.txt"));
  // ...
}

Cu toate acestea, ați putea, de asemenea, să faceți ceva de genul următor:

public static void main(String[] args){
  readFile();
}

public static void readFile() {
  try {
    Scanner input = new Scanner(new File("file.txt"));
    // ...
  } catch (FileNotFoundException e) {
    // Do something with `e` or handle it accordingly.
  }
}

V-aș sfătui să nu aruncați excepțiile în funcția main, , dar, după aceea, este într-adevăr o chestiune de a ști dacă aveți o „rezervă” pentru cazul în care ceva eșuează. Pentru mai multe informații, această întrebare are detalii fantastice.

Daniel Williams

Java are unele controverse cu privire la excepțiile sale. Are două clase de excepții. Verificate și necontrolate. Orice excepție care se extinde de la RuntimeException sau Error este neverificată și nu trebuie să fie prinsă sau declarată explicit ca fiind aruncabilă în semnătura unei metode.

Cu toate acestea, FileNotFound este o excepție verificată și trebuie fie prinsă, fie declarată ca fiind eliminabilă în semnătura metodei.

Ideea de bază este că excepțiile verificate sunt cele care pot fi recuperate, în timp ce excepțiile necontrolate sunt cele care provin dintr-o eroare de programare care, cel mai probabil, nu poate fi recuperată.

Puteți citi totul despre acest subiect aici: https://docs.oracle.com/javase/tutorial/essential/exceptions/runtime.html

Drew Kennedy

Gândiți-vă la throws ca la o promisiune; spuneți că nu veți prinde excepția acum, dar o veți prinde la declarația de apelare.

Codul pe care îl aveți în prezent în readFile pare perfect valid, dar trebuie să includeți declarația de apelare într-o promisiune try-catch pentru a gestiona în mod corespunzător excepția.

Nir Levy

nu are rost să arunci o excepție în metoda main – acesta este punctul de intrare în program, ceea ce înseamnă că nicio altă metodă nu va prinde această excepție și nu o va trata. ar trebui să prinzi și să tratezi excepția aici – fie să înregistrezi eroarea, să dai un mesaj clar utilizatorului, să citești un alt fișier, orice, dar aruncând excepția este greșit aici.

Comentarii

  • Ce se întâmplă dacă o altă clasă Java apelează main în schimb? –  > Por MadProgrammer.
  • @MadProgrammer – atunci aceasta este o programare proastă și nu ar trebui să fie făcută (IMHO). main este un punct de intrare, nu ar trebui să fie apelat intern –  > Por Nir Levy.
  • Cu toate acestea, se face, doar pentru că noi considerăm că este rău nu împiedică să se întâmple și, de fapt, ar putea fi făcut prin proiectare. Puteți arunca excepția din main și JVM-ul o va gestiona (la fel ca și în cazul excepțiilor necapturate), dar asta ar necesita mai multe detalii 😉 – Preferința mea personală este de a o trata în cadrul main dar nu este întotdeauna posibil.  > Por MadProgrammer.
myselfmiqdad

Trebuie să prindeți excepția

public static void main(String[] args){
    readFile();
}

public static void readFile() {
   try {
      Scanner input = new Scanner(new File("file.txt"));
      ...
   } catch (FileNotFoundException ex) {
      // Error message
   } catch (Exception ex) {
      // Incase a different exception is caught
   }
}

Tags: