Foros del Web » Programación para mayores de 30 ;) » Java »

¿Por qué este código necesita lanzar una excepción?

Estas en el tema de ¿Por qué este código necesita lanzar una excepción? en el foro de Java en Foros del Web. Buenas a todos, estoy intentando entender este pequeño código, que sirve para llamar a otros comandos o aplicaciones del sistema (originalmente reiniciaba el PC). Lo ...
  #1 (permalink)  
Antiguo 31/12/2015, 09:06
Avatar de BramSt  
Fecha de Ingreso: abril-2015
Mensajes: 117
Antigüedad: 9 años
Puntos: 5
¿Por qué este código necesita lanzar una excepción?

Buenas a todos, estoy intentando entender este pequeño código, que sirve para llamar a otros comandos o aplicaciones del sistema (originalmente reiniciaba el PC).

Lo que más me cuesta entender aquí, por más que estoy investigando, es por qué tengo que hacer un "throws IOException".

¿Dónde está aquí la excepción a lanzar? ¿Qué tiene que ver el método exec con todo eso?


Un saludo y feliz año.

Código Java:
Ver original
  1. public static void main(String[] args) throws IOException
  2.     {
  3.        
  4.         Runtime r = null;
  5.         r=Runtime.getRuntime();
  6.        
  7.        
  8.         r.exec("notepad");
  9.        
  10.         };
  #2 (permalink)  
Antiguo 02/01/2016, 01:31
Avatar de jlrodmon  
Fecha de Ingreso: diciembre-2015
Ubicación: España
Mensajes: 9
Antigüedad: 8 años, 4 meses
Puntos: 2
Respuesta: ¿Por qué este código necesita lanzar una excepción?

Tiene que tener el IOException porque el comando exec de Runtime lo tiene definido (https://docs.oracle.com/javase/7/docs/api/java/lang/Runtime.html#exec(java.lang.String).

Ese exec sirve para lanzar el línea de comandos el comando que le especifiques, así que parece que lo que el trozo de código que has puesto hace es lanzar un notepad.
  #3 (permalink)  
Antiguo 02/01/2016, 13:25
Avatar de BramSt  
Fecha de Ingreso: abril-2015
Mensajes: 117
Antigüedad: 9 años
Puntos: 5
Respuesta: ¿Por qué este código necesita lanzar una excepción?

Cita:
Iniciado por jlrodmon Ver Mensaje
Tiene que tener el IOException porque el comando exec de Runtime lo tiene definido (https://docs.oracle.com/javase/7/doc...va.lang.String).

Ese exec sirve para lanzar el línea de comandos el comando que le especifiques, así que parece que lo que el trozo de código que has puesto hace es lanzar un notepad.
Muchas gracias... es que no veo la lógica de que tenga que especificarse que se arroja una excepción que no se produce por ningún sitio... soy muy novato, como se puede ver

Entonces simplemente lo acepto como tal porque está definido así el metodo, ¿no? Gracias por el enlace.
  #4 (permalink)  
Antiguo 03/01/2016, 05:55
Avatar de Xerelo  
Fecha de Ingreso: mayo-2009
Mensajes: 2.175
Antigüedad: 14 años, 11 meses
Puntos: 306
Respuesta: ¿Por qué este código necesita lanzar una excepción?

Cita:
Iniciado por BramSt Ver Mensaje
Muchas gracias... es que no veo la lógica de que tenga que especificarse que se arroja una excepción que no se produce por ningún sitio... soy muy novato, como se puede ver

Entonces simplemente lo acepto como tal porque está definido así el metodo, ¿no? Gracias por el enlace.
¿Y de dónde sacas que esa excepción no se produce nunca?

El tema de las excepciones da para mucho y hay diversas opiniones de cómo afrontarlas, pero cuando un método avisa de una excepción (checked) es porque el creador del método cree que ante determinado problema, el programador que usa ese método debe/puede tomar una decisión.

Resumiendo, en el método main no debes usar throws.

http://chuwiki.chuidiang.org/index.p...ciones_en_Java
__________________
Cada vez que solucionas los problemas de alguien que no se esfuerza, piensa en que el día de mañana puede llegar a ser tu compañero de trabajo, o peor, tu jefe.
  #5 (permalink)  
Antiguo 03/01/2016, 10:03
Avatar de BramSt  
Fecha de Ingreso: abril-2015
Mensajes: 117
Antigüedad: 9 años
Puntos: 5
Respuesta: ¿Por qué este código necesita lanzar una excepción?

Cita:
Iniciado por Xerelo Ver Mensaje
¿Y de dónde sacas que esa excepción no se produce nunca?

El tema de las excepciones da para mucho y hay diversas opiniones de cómo afrontarlas, pero cuando un método avisa de una excepción (checked) es porque el creador del método cree que ante determinado problema, el programador que usa ese método debe/puede tomar una decisión.

Resumiendo, en el método main no debes usar throws.

http://chuwiki.chuidiang.org/index.p...ciones_en_Java
Hola, gracias por tu mensaje.

Me refiero a que en ese código concreto, no sé por qué para usar el comando exec me exige poner "throws IOException", ya que yo no veo qué tiene que ver el exec con las excepciones (salvo como ha explicado el compañero, que se ha definido que el método hay que usarlo así y ya está, quizá porque como has dicho, cuando lo crearon, algo habrá que preveer...).

Gracias por el enlace, me lo estudiaré a ver si me saca algo en claro (en clase no hemos dado aún nada de esto).

Un saludo.
  #6 (permalink)  
Antiguo 03/01/2016, 14:12
Avatar de Xerelo  
Fecha de Ingreso: mayo-2009
Mensajes: 2.175
Antigüedad: 14 años, 11 meses
Puntos: 306
Respuesta: ¿Por qué este código necesita lanzar una excepción?

Cita:
Me refiero a que en ese código concreto, no sé por qué para usar el comando exec me exige poner "throws IOException"
La API es tu amiga

https://docs.oracle.com/javase/7/doc...va.lang.String)

Cita:
Throws:
SecurityException - If a security manager exists and its checkExec method doesn't allow creation of the subprocess
IOException - If an I/O error occurs
NullPointerException - If command is null, or one of the elements of envp is null
IllegalArgumentException - If command is empty
Cita:
Gracias por el enlace, me lo estudiaré a ver si me saca algo en claro (en clase no hemos dado aún nada de esto)
Dudo que no hayáis visto try/catch, el tema de ver Runtime indica que o bien ya habéis dado bastante temario o simplemente era un ejemplo puntual para que vieseis que java puede interactuar con el sistema operativo, pero entonces no deberías preocuparte de no entenderlo.
__________________
Cada vez que solucionas los problemas de alguien que no se esfuerza, piensa en que el día de mañana puede llegar a ser tu compañero de trabajo, o peor, tu jefe.
  #7 (permalink)  
Antiguo 04/01/2016, 09:49
Avatar de chuidiang
Colaborador
 
Fecha de Ingreso: octubre-2004
Mensajes: 3.774
Antigüedad: 19 años, 6 meses
Puntos: 454
Respuesta: ¿Por qué este código necesita lanzar una excepción?

Hola,

Lo que comenta Xerelo, cuando llamas a exec(), ese código por dentro puede lanzar una excepción si tiene algún problema al intentar ejecutarse (las que comenta Xerelo, SecurityException si no tienes permisos para ejecutar el proceso, IOException si hay algún error con las entradas saildas de ese proceso, etc, etc).

Como el método exec() puede lanzar una excepción, tienes dos opciones al llamarlo, o bien capturarla metiendo la llamada dentro de un try/catch, o bien "relanzarla" en tu método (en tu main en este caso).

Se bueno.
__________________
Apuntes Java
Wiki de Programación
  #8 (permalink)  
Antiguo 04/01/2016, 10:36
(Desactivado)
 
Fecha de Ingreso: enero-2015
Mensajes: 393
Antigüedad: 9 años, 3 meses
Puntos: 52
Respuesta: ¿Por qué este código necesita lanzar una excepción?

Cita:
Iniciado por chuidiang Ver Mensaje

Como el método exec() puede lanzar una excepción, tienes dos opciones al llamarlo, o bien capturarla metiendo la llamada dentro de un try/catch, o bien "relanzarla" en tu método
En realidad el problema es que java es un lenguaje terriblemente mal diseñado, y esta cuestión de los "checked exceptions" es una de las tantas falencias del lenguaje, que no solamente obliga a escribir más código completamente innecesario, sino que como se puede observar en este thread, confunde a los novatos con sus cuestionables idiosincracias.

Los lenguajes modernos no tienen este problema.
https://kotlinlang.org/docs/referenc...ked-exceptions
  #9 (permalink)  
Antiguo 05/01/2016, 12:34
Avatar de BramSt  
Fecha de Ingreso: abril-2015
Mensajes: 117
Antigüedad: 9 años
Puntos: 5
Respuesta: ¿Por qué este código necesita lanzar una excepción?

Cita:
Iniciado por Xerelo Ver Mensaje
La API es tu amiga

https://docs.oracle.com/javase/7/doc...va.lang.String)




Dudo que no hayáis visto try/catch, el tema de ver Runtime indica que o bien ya habéis dado bastante temario o simplemente era un ejemplo puntual para que vieseis que java puede interactuar con el sistema operativo, pero entonces no deberías preocuparte de no entenderlo.
Gracias Xerelo.

Realmente para cuando yo vengo a preguntar aquí ya he buscado por Internet para intentar entender las cosas por mi cuenta. Y cuando no lo consigo (por supuesto la documentación de Oracle es lo primero que miro), es cuando recurro a los foros. No me gusta, como bien dice tu firma, preguntar sin haberme esforzado antes.

Y no, en clase no hemos dado aún ni try/ cath ni la clase Runtime nada que se le parezca. De hecho aún estamos aprendiendo lo que son las clases y objetos. Es mi culo inquieto el que me hace estudiar por mi cuenta y claro, a veces me hago la cabeza un lío.

En clase, con decirte que aún no hemos dado arrays y yo ya tengo hecho un bingo con matrices... (con sus clases propias, objetos, propiedades y métodos creados por mí), y antes de meterme con Java (que es lo que nos enseñan en el módulo), me tiré un montón de meses con C++ por mi cuenta, lo cuál me ha ayudado muchísimo.



Cita:
Iniciado por chuidiang
Hola,

Lo que comenta Xerelo, cuando llamas a exec(), ese código por dentro puede lanzar una excepción si tiene algún problema al intentar ejecutarse (las que comenta Xerelo, SecurityException si no tienes permisos para ejecutar el proceso, IOException si hay algún error con las entradas saildas de ese proceso, etc, etc).

Como el método exec() puede lanzar una excepción, tienes dos opciones al llamarlo, o bien capturarla metiendo la llamada dentro de un try/catch, o bien "relanzarla" en tu método (en tu main en este caso).

Se bueno.
Ya, lo que pasa que teóricamente cualquier código puede lanzar una excepción, ¿no? Entonces me imagino que un programa "normal" estará lleno de try/ cath o throws por todas partes... además de que no le veo mucha utilidad. No sé, si yo trato de acecder en tiempo de ejecución a una posición de array que no existe, ¿para qué voy a escribir yo un código para tratar la excepción, para que muestre el texto que yo quiero y ayudar al user por ejemplo con explicaciones más claras? Total, me imagino que el programa , lo que se dice cascar, va a cascar y lanzar una excepción igual... trate yo la excepción o no.

Pero es cuestión de tiempo que vaya viéndolo y comprendiéndolo, imagino. Ya digo que esto en clase ni siquiera lo hemos dado aún.



Cita:
En realidad el problema es que java es un lenguaje terriblemente mal diseñado, y esta cuestión de los "checked exceptions" es una de las tantas falencias del lenguaje, que no solamente obliga a escribir más código completamente innecesario, sino que como se puede observar en este thread, confunde a los novatos con sus cuestionables idiosincracias.

Los lenguajes modernos no tienen este problema.
https://kotlinlang.org/docs/referenc...ked-exceptions
La verdad es que mucha gente pone verde a Java (evidentemente yo no tengo aún conocimientos para criticar o elogiar Lenguajes), pero no descarto por supuesto ir comprendiendo otros lenguajes en un futuro. Ahora, es el que tengo que aprender.

Última edición por BramSt; 05/01/2016 a las 13:22
  #10 (permalink)  
Antiguo 05/01/2016, 16:42
Avatar de chuidiang
Colaborador
 
Fecha de Ingreso: octubre-2004
Mensajes: 3.774
Antigüedad: 19 años, 6 meses
Puntos: 454
Respuesta: ¿Por qué este código necesita lanzar una excepción?

Hola:

Cualquier código no puede lanzar una excepción, hay operaciones que no fallan. Por ejemplo, si sumas dos variables enteras, eso no puede lanzar nunca una excepción. Si llamas a un método, ese método puede o no lanzar excepciones, según lo que haga por dentro, pero sólo si declara que las lanza (el throws en la declaración del método), es cuando estás obligado a capturarla o relanzarla. En tu caso y como comentaba Xerelo, el método Runtime.exec() dice que puede lanzar varios tipos de excepciones, por eso tienes que capturarlas o relanzarlas.

En cuanto a tratar tu la excepción o no, si no la capturas y tratas, desde luego el programa fallará. Pero si tú la tratas, aparte de dejar un mensaje más claro, en ocasiones es posible intentar recuperar el programa. Por ejemplo, si una conexión a una base de datos falla, puedes capturar la excepción para que haga una pequeña espera y vuelva a intentar conectarse. Si la desconexión era por algo temporal (por ejemplo, la base de datos se está reiniciando), el capturar la excepción para intentar reconectar puede ser útil.

Se bueno.
__________________
Apuntes Java
Wiki de Programación

Etiquetas: lanzar, necesita
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 15:54.