Enunciado
Considere as seguintes classes Java, que ocupam arquivos separados: public class Err01 extends Exception { public Err01() { } public Err01(String m) { super(m); } } public class Err02 extends Err01 { public Err02() { } public Err02(String m) { super(m); } } Qual classe NÃO produzirá erros de compilação?
Alternativas
- A)
public class Main { public double m01(double a, double b) { try { if(a < 0) throw new Err01(); if(b < 0) throw new Err02(); if(b == 0) throw new Exception(); } catch(Err01 e) { System.out.println("a menor do que zero"); } return a / b; } public static void main(String[] args) throws Exception { Main m=new Main(); System.out.println( m.m01 (8.0, 4.0) ); } }
- B)
public class Main { public double m01(double a, double b) { try { if(a < 0) throw new Err01(); if(b <= 0) throw new Err02(); } catch(Err02 e) { System.out.println("b menor ou igual a zero"); } return a / b; } public static void main(String[] args) throws Exception { Main m=new Main(); System.out.println( m.m01 (8.0, 4.0) ); } }
- C)
public class Main { public double m01(double a, double b) { try { if(a < 0) throw new Err01(); if(b <= 0) throw new Err02(); } catch(Err01 e) { System.out.println("a menor do que zero"); } catch(Err02 e) { System.out.println("b menor ou igual a zero"); } catch(Exception e) { System.out.println("b igual a zero"); } return a / b; } public static void main(String[] args) throws Exception { Main m=new Main(); System.out.println( m.m01 (8.0, 4.0) ); } }
- D)
public class Main { public double m01(double a, double b) throws Err01 { try { if(a < 0) throw new Err01(); if(b < 0) throw new Err02(); if(b == 0) throw new Exception(); } catch(Exception e) { System.out.println("b igual a zero"); } return a / b; } public static void main(String[] args) throws Exception { Main m=new Main(); System.out.println( m.m01 (8.0, 4.0) ); } }
- E)
public class Main { public double m01(double a, double b) throws Exception { try { if(a < 0) throw new Err01(); if(b <= 0) throw new Err02(); } catch(Err01 e) { System.out.println("a menor do que zero"); } catch(Err02 e) { System.out.println("b menor ou igual a zero"); } return a / b; } public static void main(String[] args) throws Exception { Main m=new Main(); System.out.println( m.m01 (8.0, 4.0) ); } }
Gabarito e comentário
Resposta correta: D
Err02 é subclasse de Err01, o que influencia tanto a necessidade de tratar exceções verificadas quanto a ordem dos blocos catch. Nas alternativas C e E, um catch de Err01 aparece antes de catch de Err02, tornando o segundo inalcançável; em A e B permanecem exceções verificadas sem tratamento ou declaração adequada. Na alternativa D, o catch(Exception e) pode tratar Err01, Err02 e Exception lançadas no try, e a assinatura é válida. Assim, D é a classe que não produz erro de compilação.