49
class throwseg1 
{ 
    void show() throws Exception 
    { 
     throw new Exception("my.own.Exception"); 
    } 

    void show2() throws Exception // Why throws is necessary here ? 
    { 
     show(); 
    } 

    void show3() throws Exception // Why throws is necessary here ? 
    { 
     show2(); 
    } 

    public static void main(String s[]) throws Exception // Why throws is necessary here ? 
    { 
     throwseg1 o1 = new throwseg1(); 
     o1.show3(); 
    } 
} 

por qué los informes de que los métodos compilador show2(), show3() y main() han¿Por qué es necesario "throws Exception" para llamar a una función?

Excepción excepción no declarada que debe ser capturado o se declara que se arrojen

cuando quito throws Exception de estos métodos?

+2

@PaulTomblin main ciertamente se puede declarar para lanzar Exception. Si lo hace, la JVM se apagará. Esto es lo más cercano a ignorarlo como permitirá el compilador. – Taymon

+0

Cuando el método llamado (** Methdod1 **) arroja 'Exception', tenemos que definir el método de llamada (** Method2 **) con' throws Exception'; si no estamos entregando esa excepción en el método de llamada. El propósito de esto es dar la cara al método de llamada (** Método3 **) de ** Método2 ** que una Excepción puede ser lanzada por ** Método2 ** y usted debe manejarlo aquí, de lo contrario puede interrumpir su programa. – Rito

+0

De forma similar, si ** Method3 ** no está manejando la excepción en su cuerpo, entonces, tenía que definir 'throws Exception' en su definición de método para dar la cabecera de su método de llamada. _extensión del comentario anterior_ – Rito

Respuesta

90

En Java, como ya sabrá, las excepciones se pueden categorizar en dos: una que necesita la cláusula throws o debe manejarse si no especifica una y otra que no. Ahora, vea la siguiente figura:

enter image description here

En Java, se puede tirar cualquier cosa que se extiende la clase Throwable. Sin embargo, no necesita especificar una cláusula throws para todas las clases. Específicamente, las clases que son Error o RuntimeException o cualquiera de las subclases de estos dos. En su caso Exception no es una subclase de Error o RuntimeException. Por lo tanto, es una excepción comprobada y se debe especificar en la cláusula throws, si no se maneja esa excepción en particular. Es por eso que necesita la cláusula throws.


De Java Tutorial:

Una excepción es un evento, que se produce durante la ejecución de un programa, que interrumpe el flujo normal de las instrucciones del programa.

Ahora, como usted sabe, las excepciones se clasifican en dos: marcadas y sin marcar. ¿Por qué esta clasificación?

Excepción comprobada: Se utilizan para representar problemas que se pueden recuperar durante la ejecución del programa. Por lo general, no son culpa del programador. Por ejemplo, un archivo especificado por el usuario no es legible, o no hay conexión de red disponible, etc., en todos estos casos, nuestro programa no necesita salir, en su lugar puede tomar medidas como alertar al usuario, o entrar en una reserva mecanismo (como trabajo fuera de línea cuando la red no está disponible), etc.

Excepciones no comprobadas: También se pueden dividir en dos: Errores y Excepciones de tiempo de ejecución. Una razón para que no se controle es que son numerosas en número, y que se requiere que manejen todas ellas desordenará nuestro programa y reducirá su claridad. La otra razón es:

  • excepciones de tiempo de ejecución: Por lo general ocurren debido a fallos programadores. Por ejemplo, si se produce un ArithmeticException de división por cero o se produce un ArrayIndexOutOfBoundsException, es porque no somos lo suficientemente cuidadosos en nuestra codificación. Ocurren generalmente porque algunos errores en nuestra lógica de programa. Por lo tanto, deben borrarse antes de que nuestro programa entre en modo de producción.No se controlan en el sentido de que nuestro programa debe fallar cuando ocurre, para que los programadores podamos resolverlo en el momento del desarrollo y las pruebas.

  • Errores: Los errores son situaciones de las que generalmente el programa no se puede recuperar. Por ejemplo, si se produce un StackOverflowError, nuestro programa no puede hacer mucho, como aumentar el tamaño de la pila de llamadas a funciones del programa. O si se produce un OutOfMemoryError, no podemos hacer mucho para aumentar la cantidad de RAM disponible para nuestro programa. En tales casos, es mejor salir del programa. Es por eso que se hacen sin control.

Para obtener información detallada ver:

+0

Lo que obtuve de su respuesta es que la clase Error y sus sublaclases y la clase RuntimeException y sus subclases, vienen bajo una excepción sin marcar (como System.out.println (5/0); no hay necesidad de arrojar como está una excepción de tiempo de ejecución, pero aún podemos aplicar try catch) y la clase Exception está marcada, por lo que debemos declarar cláusula throws en ese método y en cada método que lo llame – Nil

+0

@ rd4code O debemos manejarlos con 'try ... catch'. – Jomoos

+0

Una pregunta más: si las excepciones se clasifican como no marcadas y marcadas, especialmente las no marcadas (errores de tiempo de ejecución) para evitar más errores durante el tiempo de compilación. – Nil

3

Exception es una clase de excepción comprobada. Por lo tanto, cualquier código que invoque un método que declare que es throws Exception debe manejarlo o declararlo.

+0

Se declara que todos los métodos de la cadena lanzan Exception, incluido main. Entonces, ¿dónde está el problema? –

+0

@PaulTomblin im preguntando por qué es necesario escribir throws exception en las funciones de llamada, llamando a una función que arroja una excepción – Nil

+0

Ok, no entendía por qué preguntabas por un error del compilador que en realidad no recibías del código que publicaste Esa es una forma extraña de preguntar. –

18

Java es necesario manejar o declarar todas las excepciones. Si no está manejando una excepción usando un bloque try/catch, entonces debe declararse en la firma del método.

Por ejemplo:

class throwseg1 { 
    void show() throws Exception { 
     throw new Exception(); 
    } 
} 

debe ser escrita como:

class throwseg1 { 
    void show() { 
     try { 
      throw new Exception(); 
     } catch(Exception e) { 
      // code to handle the exception 
     } 
    } 
} 

De esta manera usted puede deshacerse de la "throws Exception" declaración en la declaración del método.

+3

Todas las excepciones que no son subclases de 'RuntimeException', es decir. – yshavit

+0

si hay alguna otra clase como Excepción que esté marcada? – Nil

+1

¿Qué quieres decir? Dado que todos los objetos de excepción tienen "Excepción" como su clase base, si captura un objeto "Excepción" (como en mi ejemplo) detectará cualquier excepción que se genere. Para ser más específico (dado que las diferentes excepciones probablemente requerirán diferentes formas de manejar las cosas), debe tener múltiples bloques catch. – jebar8

3

La declaración throws Exception es una forma automatizada de realizar un seguimiento de los métodos que pueden arrojar una excepción por razones anticipadas pero inevitables. La declaración suele ser específica sobre el tipo o tipos de excepciones que pueden arrojarse, como throws IOException o throws IOException, MyException.

Todos tenemos o eventualmente escribiremos código que se detiene inesperadamente e informa una excepción debido a algo que no anticipamos antes de ejecutar el programa, como división por cero o índice fuera de límites. Como el método no esperaba los errores, no podían "atraparse" y manejarse con una cláusula try catch. Cualquier usuario desprevenido del método tampoco sabría de esta posibilidad y sus programas también se detendrían.

Cuando el programador sabe que pueden ocurrir ciertos tipos de errores pero desea manejar estas excepciones fuera del método, el método puede "arrojar" uno o más tipos de excepciones al método de llamada en lugar de manejarlos. Si el programador no declaró que el método (podría) arrojar una excepción (o si Java no tenía la capacidad de declararlo), el compilador no podría saberlo y le correspondería al futuro usuario del método conocerlo, atrapa y maneja cualquier excepción que pueda arrojar el método. Dado que los programas pueden tener muchas capas de métodos escritos por muchos programas diferentes, se hace difícil (imposible) hacer un seguimiento de qué métodos pueden arrojar excepciones.

Aunque Java tiene la capacidad de declarar excepciones, aún puede escribir un nuevo método con excepciones no controladas y no declaradas, y Java lo compilará y podrá ejecutarlo y esperar lo mejor. Lo que Java no le permitirá hacer es compilar su nuevo método si usa un método que ha sido declarado como lanzamiento de excepción (s), a menos que maneje la (s) excepción (es) declarada (s) en su método o declare que su método arroja el mismo excepción (es) o si hay múltiples excepciones, puede manejar algunas y tirar el resto.

Cuando un programador declara que el método arroja un tipo específico de excepción, es solo una forma automática de advertir a otros programadores que utilizan el método que es posible una excepción. El programador puede entonces decidir manejar la excepción o pasar la advertencia declarando que el método de llamada también arroja la misma excepción. Como se advirtió al compilador de que la excepción es posible en este nuevo método, puede verificar automáticamente si los llamantes futuros del nuevo método manejan la excepción o la declaran y hacen cumplir una u otra para que suceda.

Lo bueno de este tipo de solución es que cuando el compilador informa Error: Unhandled exception type java.io.IOException da el archivo y el número de línea del método que se declaró para lanzar la excepción. A continuación, puede optar por simplemente pasar el dinero y declarar que su método también "arroja IOException". Esto puede hacerse hasta el método principal, donde provocaría que el programa se detenga e informe la excepción al usuario. Sin embargo, es mejor detectar la excepción y tratarla de una manera agradable, como explicarle al usuario lo que sucedió y cómo solucionarlo. Cuando un método atrapa y maneja la excepción, ya no tiene que declarar la excepción. El dinero se detiene allí, por así decirlo.

Cuestiones relacionadas