Este documento presenta conceptos avanzados sobre excepciones y multithreading en lenguajes de programación. Explica el manejo de excepciones con try, catch y finally, así como los diferentes estados de vida de un hilo. También introduce conceptos básicos sobre archivos y flujos de entrada/salida.
1. UNIDAD 7. CONCEPTO
AVANZADOS.
REPÚBLICA BOLIVARIANA DE VENEZUELA
MINISTERIO DEL PODER POPULAR PARA LA DEFENSA
UNIVERSIDAD NACIONAL EXPERIMENTAL POLITÉCNICA
DE LA FUERZA ARMADA NACIONAL
Docente:
Amado Arcaya
Santa Ana de Coro, Diciembre 2020
2. Objetivos de aprendizajes
• Objetivo general
Explicar los conceptos avanzados de excepciones y Multithreading.
aplicados en los Lenguajes de Programación.
• Objetivos específicos
o Definir los conceptos avanzados de excepciones y Multithreading.
Aplicados en la POO.
o Describir los características de las excepciones y Multithreading.
o Ejemplificar los diferentes métodos excepciones y Multithreading.
Aplicados en la POO.
3. Indice
• Introducción al manejo de las excepciones
• Manejo del try, catch y finally
• Manejo de las excepciones
• Multithreading
• Archivos y flujos
4. INTRODUCCIÓN AL MANEJO DE LAS
EXCEPCIONES
Al principio de la
programación de
computadoras los lenguajes
de programación no proveían
ningún soporte a los
programadores para el
manejo de errores..
Era responsabilidad de los
programadores proveer
rutinas para el manejos
de errores , debido a esto
muchos errores
importantes no eran
detectados en las
aplicaciones.
Los lenguajes posterior
como BASIC y COBOL
proveían un soporte
estructurado para la
revisión y manejo de
errores.
ON ERROR GOTO
Lenguajes de
programación diferentes
proveían sintaxis diferentes
para la detección y manejo
de errores
Aunque el código para el manejo
de errores soportara mejor que
ningún soporte, el código del
programa principal todavía se
intercalaba con el código para la
verificación y manejo de errores
Con la evolución de la
programación orientada a
objetos, se introdujo una nueva
forma de manejar los errores , en
la cual el código para el manejo
de error era separado del código
del problema principal
5. Excepciones
anormales
Esto es detectado solo en tiempos de
ejecución
Cuando un numero
es dividido entre
cero
Cuando se accede a un
elemento de un arreglo que
esta fuera del limite del
arreglo
Cuando hay una condición
de desborde (overflow o
underflow) durante la
asignación de valores a
variables numéricas
Cuando un recurso que es
requerido por la aplicación
pero no esta disponible por
ejemplo una impresora
Cuando el programa
requiere un archivo para la
lectura y el archivo no esta
disponible en el sistema de
archivos
Cuando un
programa accede a
recursos del
sistema sin
autorización .
6. Se
produce
el error
El manejador
de
excepciones
recibe la
excepción
Analiza la naturaleza de la
excepción
Crea un “objeto exception”
apropiado a través del
manejador
Preparar el
“objeto
exception” para
ser manejado por
el sistema de
tiempo de
ejecución
El sistema
de tiempo
de ejecución
Localiza en la pila de llamadas la
entrada del método en el cual
ocurrió la condición de error
¿El tipo de
excepción
lanzada es igual
al tipo de
excepción
manejada?
1
2
1
diferente
Igual
Se desciende en la
pila de llamadas
para localizar el
próximo
manejador
¿Hay mas
manejado
res en la
pila?
Detener el
sistema en
tiempo de
ejecución
si
No
2
Localiza el
manejador de
excepciones
apropiado para
esta excepción
Preparar para
capturar la
excepción
7. Manejo del try, catch y finally
Obtener el N-esimo elemento de una lista de elemento diferentes si este
es un string
Algoritmo
recuperarNEsimoElemento(){
aceptar lista;
obtener n_esimo elemento de la lista;
Retornar el elemento si es un string o retornar
nulo;
}
Se tienen cuatro eventos de revisión de error
que puede proveer la función anterior:
Si la lista es null
Si la lista esta disponible , pero vacía.
Si el valor de ‘N’ no es un índice valido en la
lista.
Si el elemento N no es un string.
String recuperarNEsimoElemnto(List lista, int n){
String str;
if (lista==null)
str=“lista nula”;
Else if (es Vacio(lista))
str=“Lista vacia”;
Else if (n<0 || n>numerodeelementos(lista))
str = “Indice invalido”;
Else{
str = getelemento(lista, n);
if (!esString(str))
str = “No es un String”;
}
return str;
}
Se ha definido el código principal con e código
para el manejo de errores, haciéndolo difícil de
entender.
//Definición de método en Java
String recuperarNEsimoElemento(List lista, int n){
try{
1)obtener n-esimo elemento de la lista
2) Retornar el elemento si es un String o retornar null;
}catch(lista_es_nula){
1)manejo de excepcion cuando la lista es nula;
}catch (lista_esta_vacia){
1)manejo de excepcion cuando la lista esta vacia;
} catch (indice_invalido ){
1)manejo de excepción cuando el índice es invalido;
} catch (elemento_no_es_String ){
1)manejo de excepción cuando eñ elemento a recuperar no
es un String;
}
}
8. Usando el bloque finally
El bloque finally se ejecuta después
de la ejecución de todos los
bloques catch. El bloque finally
siempre se ejecuta aun cuando se
no se lance ninguna excepción en el
bloque try o aunque los bloque try
–catch tengan una sentencia
return
Try{
//Código que puede generar las excepciones
}catch(chequeoExcepion X1){
//Código para manejo de la excepción
}catch (chequeoExcepcion2 x2) {
//Código para manejo de la excepción
}finally(){
//Código de limpieza;
}
9. Multithreading o multihilos
es una característica de Java
que permite la ejecución
simultánea de dos o más
partes de un programa para
la máxima utilización de la
CPU
Cada parte de dicho programa se llama hilo.
Entonces, los hilos son procesos livianos dentro de un proceso.
1. Ampliación de la clase de subproceso
2. Implementación de la interfaz ejecutable
Los subprocesos se pueden crear utilizando
Creación de subprocesos ampliando la clase de subproceso
• Creamos una clase que amplía la clase java.lang.Thread.
• Esta clase anula el método run () disponible en la clase Thread.
• Un hilo comienza su vida dentro del método run ().
• Creamos un objeto de nuestra nueva clase y llamamos al método start () para iniciar la
ejecución de un hilo.
• Start () invoca el método run () en el objeto Thread.
10. Ciclo de vida y estados de un hilo
Un hilo en Java en
cualquier momento
existe en cualquiera de
los siguientes estados.
Sus estado son
Nuevo
Runnable
Obstruido
Esperando
Espera
temporizada
Terminado
11. Nuevo hilo
•cuando se crea un nuevo hilo, está en el nuevo estado.
•El hilo aún no ha comenzado a ejecutarse cuando el hilo está en este estado
•Cuando un hilo se encuentra en el nuevo estado, su código aún no se ha ejecutado y no ha
comenzado a ejecutarse.
Estado
ejecutable
•un subproceso que está listo para ejecutarse se mueve al estado ejecutable.
•En este estado, un hilo puede estar ejecutándose o puede estar listo para ejecutarse en cualquier momento.
•Es responsabilidad del programador de subprocesos darle tiempo para que se ejecute.
•Un programa de subprocesos múltiples asigna una cantidad fija de tiempo a cada subproceso individual.
•Todos y cada uno de los subprocesos se ejecutan durante un breve período y luego se detienen y ceden la CPU
a otro subproceso, para que otros subprocesos puedan tener la oportunidad de ejecutarse.
•Cuando esto sucede, todos los subprocesos que están listos para ejecutarse, esperando la CPU y el subproceso
que se está ejecutando actualmente, se encuentran en estado ejecutable.
bloqueado
Estado / en
espera
•cuando un hilo está temporalmente inactivo, se encuentra en uno de los siguientes estados:
•Obstruido
•Esperando
Espera
temporizada
•un hilo se encuentra en estado de espera temporizada cuando llama a un método con un
parámetro de tiempo de espera.
•Un hilo permanece en este estado hasta que se completa el tiempo de espera o hasta que se recibe
una notificación.
•Por ejemplo, cuando un subproceso llama a dormir o una espera condicional, se mueve a un estado
de espera temporizada.
Estado
terminado
•un subproceso termina debido a cualquiera de las siguientes razones:
•Porque existe normalmente. Esto sucede cuando el programa ha ejecutado por completo el
código del hilo.
•Porque ocurrió algún evento erróneo inusual, como un error de segmentación o una excepción
no controlada.
12. Archivos y Flujos
Archivos
Se usan
Para almacenar, leer y
escribir datos
Para hacer eso se
necesita
Acceder a las archivos
del programa
Las clases relativas a
los archivos
trabajan con el
sistema archivos en
la computadora.
asimismo
Flujos
Ayudan en funciones
relativas a archivos en
funciones relativas a
archivos como leer del
archivo , escribir datos al
archivo, leer y escribir
datos sobre la red
Imaginemos
Un flujo como un tubo
donde, es posible leer o
escribir bytes y/o
caracteres. No importa lo
que pueda haber en el otro
extremo del tubo: puede
ser un teclado, monitor, un
archivo, un proceso, una
conexión TCP/IP o un
objeto.
13. La clase File en JAVA
Son un mecanismo usado para
almacenar información, existen
varias categorías de archivos,
dependiendo del tipo de información
que es almacenada y el sistema de
archivos que se usa depende del
sistema de operación usado en la
computadora
import java.io.File;
/*Definicion de la clase DetalleArchivo comienza aquí*/
public class DetalleArchivo{
/*Metodo main comienza Aqui*/
public void main(String[] args){
File a = new File
("C:UsersC:UsersamadoDocumentsAmadoII-2020programacion
orientada a onjetosclaseunidad7ejemplo.txt“);
if(a.exists()){
System.out.println("*** Datos del archivo***");
System.out.println("Nombre: " + a.getname());
System.out.println("Ruta completa: " + a.getPath());
System.out.println("Directorio Padre: " + a.getParent());
System.out.println("Tamaño (en Bytes): " + a.length());
}else{
System.out.println(
"Archivo: " +
a.getName() +
"no existe");
}
}/*Metodo main termina aqui*/
}/*Definicion de la clase DetalleArchivo termina aqui*/
14. Flujos
En java toda la información
independientemente de la fuente o el
destino, como flujo. Los datos que son
leídos y escritos en un programa java son
tratados como un flujo de datos, bytes son
leídos o escritos a archivos, conectores o
conexiones en internet.
Un flujo es
Es cualquier cosa ruta de
información desde la fuente
al destino.
Los siguientes son
algunos pares de
fuentes y destinos:
• Un teclado (Fuente) y un monitor (destino).
• Una pagina de texto en un monitor (fuente) y un archivo en un disco duro (destino).
• Un archivo en un disco duro (fuente) y un monitor (destino).
• Un servidor web (fuente) y un navegador (destino).
• Un teclado (fuente) y una cadena de caracteres (destino).
• Un archivo de texto (fuente) y una impresora (destino).
15. Los flujo en java están organizados y se clasifican en los siguientes dos grupos
Flujos de
byte
Flujos de
carácter
Los flujos de byte se usan para transferir 8-bits
de datos, son representados con las clases.
InputStream
OutputStream
Los flujos de caracteres trabajan con caracteres de 16 bits
son representados con las clases
Reader
Writer
16. Python
Para abrir archivo f = open("archivo.txt", "w")
Para escribir en un archivo f.write("Esto es un texto.")
Para cerrar el archivo f.close()
Para hacer una llamada
retornar una cadena
f.read()
print(f.readline())
posicionarse en un
determinado lugar del fichero
file.seek()
f.seek(30)
print(f.read())
17. Funciones stdio de ANSI equivalentes en la API de Flujos
Función Stdio de ANSI
C++
Función de Flujos de PHP Notas
fopen php_stream_open_wrapper Los Flujos incluyen parámetros adicionales
fclose php_stream_close
fgets php_stream_gets
fread php_stream_read El parámetro nmemb se asume que tiene un
valor de 1, por lo que el prototipo se parece
más a read(2)
fwrite php_stream_write El parámetro nmemb se asume que tiene un
valor de 1, por lo que el prototipo se parece
más a write(2)
fseek php_stream_seek
ftell php_stream_tell
rewind php_stream_rewind
feof php_stream_eof
fgetc php_stream_getc
fputc php_stream_putc
fflush php_stream_flush
puts php_stream_puts La misma semántica que puts, NO fputs
fstat php_stream_stat Los flujos tienen una estructura de estadísticas
más abundante