0% encontró este documento útil (0 votos)
37 vistas62 páginas

Arreglos y Excepciones en Java

El documento explica los conceptos básicos de los arreglos en Java. Indica que los arreglos son objetos que pueden almacenar múltiples variables del mismo tipo, y que existen arreglos unidimensionales, bidimensionales y multidimensionales. Describe cómo declarar, crear e inicializar arreglos en Java, indicando que la declaración especifica el tipo de dato seguido de corchetes.
Derechos de autor
© © All Rights Reserved
Nos tomamos en serio los derechos de los contenidos. Si sospechas que se trata de tu contenido, reclámalo aquí.
Formatos disponibles
Descarga como PDF, TXT o lee en línea desde Scribd
0% encontró este documento útil (0 votos)
37 vistas62 páginas

Arreglos y Excepciones en Java

El documento explica los conceptos básicos de los arreglos en Java. Indica que los arreglos son objetos que pueden almacenar múltiples variables del mismo tipo, y que existen arreglos unidimensionales, bidimensionales y multidimensionales. Describe cómo declarar, crear e inicializar arreglos en Java, indicando que la declaración especifica el tipo de dato seguido de corchetes.
Derechos de autor
© © All Rights Reserved
Nos tomamos en serio los derechos de los contenidos. Si sospechas que se trata de tu contenido, reclámalo aquí.
Formatos disponibles
Descarga como PDF, TXT o lee en línea desde Scribd

7/26/2019 Arreglos String Polimorfismo y Excepciones en Java

Módulo 4
Arreglos, String,
Polimorfismo y
Excepciones en Java

Programación Orientada a Objetos

De las Heras, Sebastián

http://slidepdf.com/reader/full/arreglos-string-polimorfismo-y-excepciones-en-java 1/62
7/26/2019 Arreglos String Polimorfismo y Excepciones en Java

4.1- Arreglos y la clase


Vector
4.1.1- Arreglos
El objetivo que perseguiremos en esta sección será el aprendizaje de
arreglos en Java. Estudiaremos qué es un arreglo y la sintaxis utilizada
para declarar, crear, inicializar y manipular un arreglo.
Conceptualmente, los arreglos en Java son objetos  que pueden
almacenar múltiples variables del mismo tipo de dato . A un arreglo
también se lo suele denominar “array” por su denominación en inglés. Los
arreglos pueden mantener referencias a tipos de datos  primitivos o tipos de
de datos  por referencia  (objetos), pero el arreglo propiamente dicho es
siempre un objeto.

Los arreglos se clasifican  en:


  Unidimensionales: almacenan datos indicando un solo índice
debido a que están compuestos por una única dimensión. A estos
tipos de arreglos se los denomina también vectores. La siguiente
figura representa un arreglo unidimensional   que almacena seis
 valores numéricos enteros:
Índice 0 1 2 3 4 5

Elementos 24 12 14 28 9 2

Para referenciar al primer elemento de un arreglo, se utiliza el índice


cero, es decir el conteo del índice comienza en cero.
  Bidimensionales: están compuestos por dos dimensiones,
razón por la cual para manipularlos se deben indicar dos índices.
Imaginemos que tenemos un arreglo en el cual los elementos de la
primera dimensión, almacenan a su vez otros arreglos:

Dimensión 1

Dimensión 2

La figura anterior representa un arreglo bidimensional cuya primera


dimensión contiene tres elementos que almacenan nuevos arreglos
de cuatro elementos.

Programación Orientada a Objetos  – De las Heras, Sebastián | 2


http://slidepdf.com/reader/full/arreglos-string-polimorfismo-y-excepciones-en-java 2/62
7/26/2019 Arreglos String Polimorfismo y Excepciones en Java

Otra representación más intuitiva es considerar que los datos de los


arreglos bidimensionales se almacenan en una estructura con forma
de matriz . La siguiente figura representa el mismo arreglo definido
anteriormente pero para su representación se utiliza una matriz:
Columnas
0 1 2 3
0 43 21 7 25
   s
   a
    l
   i 1 3 67 34 67
   F
2 6 2 56 87

Debido a que la primera dimensión del arreglo contiene tres


elementos, entonces se puede considerar que la matriz que
representa al arreglo contiene tres filas. También se puede
considerar que la matriz contiene cuatro columnas debido a que la
segunda dimensión del arreglo contiene cuatro elementos.
  Multidimensionales: tienen más de dos dimensiones. Para
manipular a este tipo de arreglo se tiene que utilizar un índice
para cada una de las dimensiones que componen al arreglo. La
siguiente figura representa un ejemplo de un arreglo
multidimensional de tres dimensiones que almacena elementos de
tipo char:
-  La  primera dimensión puede almacenar tres elementos. Los
elementos que se almacenan son nuevos arreglos ( dimensión
2).

-  Los arreglos de la segunda dimensión pueden almacenar dos


elementos. Los elementos que se almacenan son nuevos
arreglos (dimensión 3).
-  Los arreglos de la tercera dimensión pueden almacenar tres
elementos. Se almacenan valores de tipo char.

Dimensión 1

Dimensión 2

Dimensión 3

 
Debido a que el arreglo representado contiene tres dimensiones,
entonces
cubo comotambién se loa puede
se muestra representar mediante la figura de un
continuación:

Programación Orientada a Objetos  – De las Heras, Sebastián | 3


http://slidepdf.com/reader/full/arreglos-string-polimorfismo-y-excepciones-en-java 3/62
7/26/2019 Arreglos String Polimorfismo y Excepciones en Java

 A modo de ejemplo, podemos observar que el elemento que se


encuentra en la posición [0,1,1] tiene almacenado el valor “k”. Cuando
indicamos la posición [0,1,1] hacemos referencia a la primera fila de la
dimensión 1 (índice 0), la segunda fila de la dimensión 2 (índice 1) y la
segunda fila de la dimensión 3 (índice 1). Es importante recordar que el
conteo de los índices comienza en cero.

Para aprender a utilizar un arreglo, es fundamental conocer los siguientes


conceptos:

  Declaración de un arreglo.
   Creación de un arreglo.

   Inicialización de un arreglo.

Cada uno de estos puntos tiene distintas variantes y estudiaremos las más
utilizadas.

Declaración de un arreglo  
Un arreglo se declara indicando el tipo de dato de los elementos que el
arreglo almacenará, pudiendo ser tipos de datos  primitivos o tipos de datos
 por referencia  (objeto), seguido de un par de corchetes que se pueden
ubicar a la izquierda o a la derecha del identificador del arreglo. A
continuación se declaran dos arreglos para ejemplificar:
int []numeros;
String palabras[];
El primer arreglo es un objeto cuyo identificador es “ numeros” y almacena
 valores numéricos enteros (int ). El segundo arreglo es un objeto cuyo
identificador
 String . es “ palabras” y almacena cadenas de caracteres de tipo

Programación Orientada a Objetos  – De las Heras, Sebastián | 4


http://slidepdf.com/reader/full/arreglos-string-polimorfismo-y-excepciones-en-java 4/62
7/26/2019 Arreglos String Polimorfismo y Excepciones en Java

Los corchetes se pueden colocar indistintamente a la izquierda o a la


derecha del identificador. En la declaración del primer arreglo, los
corchetes se colocaron a la izquierda del identificador mientras que para el
segundo arreglo se optó por colocarlos a la derecha del identificador.
Si deseamos declarar un arreglo de más de una dimensión, entonces se
deben colocar tantos pares de corchetes como número de dimensiones
contenga el arreglo. Por ejemplo, declararemos un arreglo de tres
dimensiones que contendrá objetos de tipo  Persona.
Persona[][][] listadoPersonas;
También se lo podría haber declarado de la siguiente forma:
Persona listadoPersonas[][][];
Por el momento, solamente hemos definido una variable que representa un
arreglo pero no hemos creado ningún objeto. Para crear o construir un
arreglo es necesario invocar al operador “new”. 

Creación de un arreglo
La creación de un arreglo significa invocar a su constructor para que esté
disponible en memoria junto a todos los objetos creados por la Máquina
 Virtual Java. Para la creación de un arreglo, Java debe conocer cuánto
espacio de memoria debe reservar, motivo por el cual se debe
especificar el tamaño del arreglo durante la creación del mismo. El tamaño
del arreglo hace referencia a la cantidad de elementos que el arreglo podrá
almacenar.
Hay diferentes alternativas para construir un arreglo. La formas más
estandarizada es utilizando la palabra reservada “new”, seguida del tipo de
dato del arreglo con un par de corchetes que indican la cantidad de
elementos del arreglo. Veamos el siguiente ejemplo:
int[] calificaciones; // declaración de un arreglo
// que contendrá números enteros

calificaciones = new int[3]; // Creación de un


// arreglo unidimensional
// de 3 elementos

También se puede declarar y crear un arreglo en una sola sentencia:


int[] calificaciones = new int[3]; 
Para crear un arreglo de objetos también se procede de la misma manera:
Alumno[] listadoAlumnos = new Alumno[3]; 
No hay que confundir la utilización del operador “new”. Si nos fijamos en el
ejemplo anterior, cuando construimos el arreglo “listadoAlumnos”
utilizando el operador “new”, no estamos invocando al constructor de la
clase  Alumno, no estamos creando instancias de tipo  Alumno, sino que
estamos construyendo o instanciando un objeto arreglo.

Programación Orientada a Objetos  – De las Heras, Sebastián | 5


http://slidepdf.com/reader/full/arreglos-string-polimorfismo-y-excepciones-en-java 5/62
7/26/2019 Arreglos String Polimorfismo y Excepciones en Java

También es importante tener en cuenta que en la creación de un arreglo


siempre se debe indicar el tamaño del mismo, de lo contrario obtendremos
un error de compilación. En la siguiente línea de código, se intenta crear un
arreglo sin especificar su tamaño, y por consiguiente obtenemos un error de
compilación:

Alumno[] listadoAlumnos = new Alumno[]; // No compila 


Esto se debe a que la Máquina Virtual Java necesita conocer cuánto espacio
de memoria debe reservar para almacenar el arreglo.
Para la construcción de arreglos de más de una dimensión, se debe seguir la
misma lógica como lo muestra el ejemplo a continuación:
Persona listadoPersonas[][][]; // declaración de un
// arreglo de 3
// dimensiones de objetos
// de tipo Persona

listadoPersonas = new Persona[3][2][2]; 


En el ejemplo anterior, hemos declarado un arreglo de tipo  Persona de tres
dimensiones. Posteriormente hemos construido dicho arreglo e indicamos
que la primera dimensión contendrá tres elementos, y la segunda y tercera
dimensiones contendrán dos elementos cada una.

Inicialización de un arreglo 
Hasta el momento, hemos podido declarar y crear un arreglo, pero no
hemos indicado el almacenamiento de algún elemento en el mismo. Los
elementos que se pueden almacenar pueden ser valores  primitivos  u
objetos mediante variables de referencia .

Los elementos de un arreglo pueden ser accedidos mediante un índice


que indica una posición exacta en el arreglo. Este índice es un número
que comienza en cero. Si por ejemplo, tenemos un arreglo de seis
elementos, los índices del arreglo comenzarán en cero y llegarán hasta el
 valor cinco.

Programación Orientada a Objetos  – De las Heras, Sebastián | 6


http://slidepdf.com/reader/full/arreglos-string-polimorfismo-y-excepciones-en-java 6/62
7/26/2019 Arreglos String Polimorfismo y Excepciones en Java

Supongamos que tenemos definida la clase  Persona, y declaramos un


arreglo que contiene elementos de tipo  Persona:
Persona[] empleados = new Persona[3];
El objeto “empleados” puede almacenar elementos que representan
referencias
tenemos tresa objetos de tipo
referencias
 Persona, pero hasta el momento solamente
de tipo  Persona  pero nulas, es decir, no hemos
inicializado cada uno de los elementos de tipo  Persona  del arreglo. La
siguiente figura es una representación del arreglo “empleados” luego de
haber sido declarado y creado:

Si observamos
almacenar cada
objetos deuno
tipode los elementos
 Persona , pero pordel arreglo, todos
el momento tienenellos pueden
referencias
nulas. El próximo paso entonces, es crear objetos de tipo  Persona y asignar
estos objetos a las posiciones del arreglo “empleados”. Esto lo podemos
realizar de la siguiente manera:
empleados[0] = new Persona(“Juan”); 
empleados[1] = new Persona(“Lucas”); 
empleados[2] = new Persona(“Florencia”); 

De esta forma, para cada posici ón del arreglo “empleados”, hemos


inicializado un objeto de tipo Persona.

Programación Orientada a Objetos  – De las Heras, Sebastián | 7


http://slidepdf.com/reader/full/arreglos-string-polimorfismo-y-excepciones-en-java 7/62
7/26/2019 Arreglos String Polimorfismo y Excepciones en Java

Persona

Juan

Persona

Lucas

Persona

Florencia
 

Hay que tener en cuenta que si intentamos acceder a una posición del
arreglo inexistente entonces obtendremos un error en tiempo de ejecución
( ArrayIndexOutOfBoundsException). Por ejemplo, si en el caso anterior
intentamos inicializar la posición del índice 3 del arreglo, obtendremos un
error en tiempo de ejecución.
empleados[3] = new Persona(“Pedro”); 

El índice 3  se encuentra fuera de rango, no existe, ya que el tamaño del


arreglo es tres y por consiguiente los posibles valores de los índices son 0, 1
 y 2.
Para inicializar un arreglo de más de una dimensión hay que aplicar la
misma lógica; se debe referenciar a alguna posición específica del arreglo y
asignar un objeto o valor en dicha posición. El siguiente código es un
ejemplo de inicialización de un arreglo bidimensional que almacena valores
boolean.

boolean[][] a = new boolean[2][2];


a[0][0] = true;
a[0][1] = false;
a[1][0]
a[1][1] = true;

 Algo importante a tener en cuenta, es que si declaramos y construimos un


arreglo de tipo primitivo, entonces sus elementos quedan inicializados 
con los valores por defecto correspondientes al tipo de dato del arreglo.
int[] a = new int[4];
boolean[][] b = new boolean[2][3]; 

En el ejemplo anterior, los elementos del arreglo “a” están inicializados con 
el valor cero ya que este es el valor por defecto o predeterminado para el

Programación Orientada a Objetos  – De las Heras, Sebastián | 8


http://slidepdf.com/reader/full/arreglos-string-polimorfismo-y-excepciones-en-java 8/62
7/26/2019 Arreglos String Polimorfismo y Excepciones en Java

tipo de dato int . Los elementos del arreglo “b” están inicializados con el
 valor “ false” ya que este es el valor por defecto del tipo de dato boolean.

Un arreglo también puede ser inicializado  utilizando sentencias


iterativas, otorgando de esta forma una alternativa más sencilla para
inicializar un arreglo cuando su tamaño es grande. Supongamos que
tenemos un arreglo de  String de cien elementos y deseamos inicializar cada
uno de ellos con una cadena de caracteres vacía “”. De acuerdo a lo que
acabamos de analizar anteriormente, una de las formas de hacerlo es la
siguiente:
String[] s = new String[100];
s[0] = new String(“”);
s[1] = new String(“”); 
s[2] = new String(“”); 
.
.
.
s[98] = new String(“”); 
s[99] = new String(“”); 

Pero como podemos ver, esta forma de inicializar un arreglo resulta


 bastante tediosa si el número de elementos que contiene el arreglo es alto.
Para facilitar esta tarea podemos hacer uso de las sentencias iterativas. Los
arreglos tienen un atributo denominado “length” que representa el
número de elementos que puede almacenar un arreglo, es decir, su tamaño.
Entonces por ejemplo, en el arreglo anterior, el valor de “s.length” es igual a
100. Si hacemos uso de este atributo y de las sentencias iterativas entonces
podemos inicializar el arreglo. Una de las formas más utilizadas es
mediante la sentencia for:
String[] s = new String[100];
for (int i=0; i<s.length; i++) {
s[i] = new String(“”); 

En cada iteración, el valor de i   es aumentado en una unidad comenzando


desde cero, entonces se utiliza esta variable para hacer referencia a las
posiciones de los elementos del arreglo. Cuando la variable i  vale 100, no se
cumple la condición “i < s.length” y por consiguiente el ciclo  for deja de ser
ejecutado. Utilizar un ciclo  for  para inicializar un arreglo es una de las
formas más utilizadas pero también se pueden utilizar otras sentencias
iterativas, como por ejemplo la sentencia while:
String[] s = new String[100];
int i=0;
while (i<100) {
s[i] = new String("");
i++;
}

Si deseamos utilizar sentencias iterativas para inicializar un arreglo de más


de una dimensión entonces se debe iterar sobre todos los elementos para
cada una de las dimensiones que componen el arreglo. Veamos el siguiente
ejemplo:
1. byte[][][] arregloBytes = new byte[3][2][2];

Programación Orientada a Objetos  – De las Heras, Sebastián | 9


http://slidepdf.com/reader/full/arreglos-string-polimorfismo-y-excepciones-en-java 9/62
7/26/2019 Arreglos String Polimorfismo y Excepciones en Java

2. for (int a=0 ; a<arregloBytes.length ; a++) {


3. for (int b=0 ; b<arregloBytes[a].length ; b++) {
4. for (int c=0 ; c<arregloBytes[a][b].length ; c++) {
5. arregloBytes[a][b][c] = 2;
6. }
7. }
8. } 
La línea de código 2 del ejemplo anterior, recorre los elementos de la
primera dimensión del arreglo, la línea de código 3 recorre los elementos de
la segunda dimensión y la línea de código 4 recorre los elementos de la
tercera dimensión.
También se puede declarar, crear e inicializar un arreglo en una única línea:
int[] c = {22,8,53,45,2};
La línea anterior realiza las siguientes acciones:


  Declara unesarreglo
referencia “c”. 
que almacenará valores int   cuya variable de

  Construye un arreglo de valores int   que podrá almacenar cinco


elementos.
   Almacena los valores “22”, “8”, “53”, “45” y “2”  en el arreglo “c”. 

Es decir, la sentencia de código anterior es equivalente a la siguiente:


int[] c;
c = new int[5];
c[0] = 22;
c[1] = 8;
c[2] = 53;
c[3] = 45;
c[4] = 2;

 Ahora veremos otro ejemplo, pero aplicado a un arreglo de objetos:


Persona juan = new Persona(“Juan”);
Persona[] listadoPersonas = {juan, new
Persona(“Lucas”), new Persona(“Florencia”)}; 

El código anterior realiza las siguientes acciones:


  Declara un arreglo que almacenará objetos de tipo  Persona  cuya
 variable de referencia es “listadoPersonas”. 

  Construye un arreglo de elementos de tipo  Persona  de tres


elementos.
   Asigna el objeto “ juan” de tipo  Persona creado con anterioridad al
primer elemento del arreglo.
  Crea dos objetos de tipo  Persona  y los asigna al segundo y tercer
elementos del arreglo.

Por último,unveremos
inicializar arreglo:otra alternativa que podemos utilizar para construir e

Programación Orientada a Objetos  – De las Heras, Sebastián | 10


http://slidepdf.com/reader/full/arreglos-string-polimorfismo-y-excepciones-en-java 10/62
7/26/2019 Arreglos String Polimorfismo y Excepciones en Java

char[] d;
d = new char[]{'p','o','o'};

Esta forma de crear e inicializar arreglos se denomina creación anónima 


de arreglos. Esta alternativa es poco utilizada, pero no deja de ser una
posibilidad con la que nos encontremos alguna vez.
Una vez que tenemos un arreglo declarado, creado e inicializado, para
utilizarlo simplemente se deben referenciar a sus elementos utilizando el
índice correspondiente a la posición del elemento con el que se desea
trabajar.
 A continuación se muestra un ejemplo de una aplicación que genera
instancias de la clase Usuario, las asigna a un arreglo de cinco elementos y
por último realiza una iteración sobre el arreglo para imprimir en consola
los objetos almacenados.
// Clase GeneracionDeUsuarios
package programacion;
public class GeneracionDeUsuarios {
public static void main(String[] args) {
Usuario[] listadoUsuarios = new Usuario[5];

for (int i=0; i<listadoUsuarios.length; i++) {


int idGenerado = (int)(Math.random() * 1000);
listadoUsuarios[i] = new Usuario(idGenerado);
}
for (int i=0; i<listadoUsuarios.length; i++) {
System.out.println(listadoUsuarios[i]);
}
}

// Clase Usuario
package programacion;

public class Usuario {


private int id;

public Usuario(int idUsuario) {


id = idUsuario;
}

public int getId() {


return id;
}

public void setId(int id) {


this.id = id;
}

public String toString() {


String s = "Usuario - id: " + id;
return s;
}
}

Programación Orientada a Objetos  – De las Heras, Sebastián | 11


http://slidepdf.com/reader/full/arreglos-string-polimorfismo-y-excepciones-en-java 11/62
7/26/2019 Arreglos String Polimorfismo y Excepciones en Java

4.1.2- Vector
En la sección anterior estudiamos los conceptos asociados a los arreglos en
Java y vimos que los mismos son útiles para almacenar varios elementos de
un mismo tipo de dato. Para ello debemos conocer de antemano la cantidad
de elementos que se podrán almacenar en el arreglo. Sin embargo, hay
algunos escenarios en los cuales no sabemos con precisión la cantidad de
elementos que serán almacenados en el arreglo. Una posible solución a este
problema es crear un arreglo que pueda almacenar un número de
elementos mucho mayor a la cantidad de elementos que estimamos que
podemos llegar a guardar. El inconveniente de esta solución, es que cada
posición del arreglo ocupa un lugar en memoria, y de esta forma estaremos
ocupando espacio adicional en memoria en forma innecesaria.
Java provee la clase Vector   que permite representar arreglos que pueden
aumentar o disminuir la cantidad de elementos posibles a almacenar en
forma dinámica. La clase Vector se encuentra en el paquete “ java.util ” y
cada vez que queramos hacer uso de esta clase será necesario importar
dicho paquete.
Vector nombres = new Vector(5);
La línea de código anterior crea un objeto de tipo Vector con una capacidad
inicial de cinco elementos. En el caso que hayamos agregado cinco
elementos al vector y agreguemos un elemento adicional, entonces su
capacidad   será duplicada en forma automática, es decir se incrementará a
diez elementos. Si en un futuro esta capacidad es superada, entonces
nuevamente su capacidad   será duplicada automáticamente, en este caso a
 veinte elementos. En otras palabras, si utilizamos este constructor su
capacidad   inicial   será aquella indicada por medio del parámetro que se
envía en su constructor, y por cada vez que su capacidad   sea superada,
entonces la misma será duplicada en forma automática. Hay que tener
precaución en la utilización de este constructor especialmente cuando se
debe almacenar una gran cantidad de elementos, ya que en el punto en el
que superemos la capacidad, la misma será duplicada y por consiguiente se
requerirá mayor cantidad de memoria disponible.
Si deseamos tener un mayor control sobre cómo se incrementa la capacidad
del vector cada vez que la misma es superada entonces podemos utilizar el
siguiente constructor:

Vector nombres = new Vector(5, 5);


El constructor anterior recibe dos parámetros: el primero de ellos indica la
capacidad inicial del vector, y el segundo indica cuánto debe aumentar la
capacidad por cada vez que se la supere. En el ejemplo anterior, la
capacidad inicial del vector es cinco y por cada vez que la misma sea
superada, entonces será incrementada de a cinco unidades (5, 10, 15, 20,
25…).

También se puede utilizar un tercer constructor que no recibe ningún


parámetro:
Vector nombres = new Vector(); 

Programación Orientada a Objetos  – De las Heras, Sebastián | 12


http://slidepdf.com/reader/full/arreglos-string-polimorfismo-y-excepciones-en-java 12/62
7/26/2019 Arreglos String Polimorfismo y Excepciones en Java

En este caso, la capacidad inicial del vector es diez y será duplicada por cada
 vez que la misma sea superada.
No se deben confundir los conceptos de capacidad   y tamaño. La
capacidad   tiene una relación con la cantidad de espacio en memoria
reservado por un vector, mientras que el tamaño  de un vector hace
referencia a la cantidad de elementos almacenados en un momento
determinado.

Sus métodos 
 A continuación, analizaremos los métodos que provee la clase Vector  que
nos permiten manipular objetos de este tipo.
Si deseamos añadir un elemento a un vector podemos utilizar los métodos
addElement(Object o) o add(Object o):

Vector nombres = new Vector(5, 5);


nombres.add(“Juan”);
nombres.add(“María”);
nombres.add(“Rodrigo”);
nombres.addElement(“Florencia”);

Se pueden utilizar los métodos addElement()  y add() en forma indistinta ya


que proveen la misma funcionalidad. Estos métodos agregan un elemento
al final del vector.
Si deseamos insertar un elemento en una determinada posición entonces
podemos hacer uso del método insertElementAt():
nombres.insertElementAt(“Darío”, 2);
Si utilizamos el método insertElementAt(), entonces debemos enviar un
primer parámetro que representa el objeto que deseamos insertar y un
segundo parámetro que indica la posición en la cual deseamos insertar el
objeto dentro del vector. A la posición la debemos indicar mediante un
índice y el conteo del mismo comienza en cero. En el ejemplo anterior,
agregamos un objeto de tipo  String  con la cadena de caracteres “ Darío” en
la tercera posición (índice 2).

También se puede: utilizar en forma indistinta el método add(int index,


Object element)

nombres.add(4, “Paula”); 

 A diferencia del método insertElementAt(), este método recibe como


primer parámetro un índice que hace referencia a la posición en la que se
desea insertar el objeto, y recibe como segundo parámetro el objeto que se
desea insertar. En el ejemplo anterior, agregamos un objeto de tipo  String 
con la cadena de caracteres “ Paula” en la quinta posición (índice 4).

Cuando se utiliza un índice para referenciar una posición específica para


insertar un elemento en un vector, el mismo debe ser igual o mayor a cero
(el conteo comienza en cero) y menor o igual al tamaño del vector.
Recordemos que el tamaño de un vector hace referencia a la cantidad de

Programación Orientada a Objetos  – De las Heras, Sebastián | 13


http://slidepdf.com/reader/full/arreglos-string-polimorfismo-y-excepciones-en-java 13/62
7/26/2019 Arreglos String Polimorfismo y Excepciones en Java

elementos almacenados. Si hacemos referencia a una posición inexistente


por el momento entonces obtendremos un error
( ArrayIndexOutOfBoundsException). En el siguiente ejemplo, se intenta
insertar un elemento en la séptima posición ( índice 6), pero la misma es
inexistente ya que el tamaño del vector en el momento que se inserta el
objeto es tres.
import java.util.Vector;

public class EjemplosVector {

public static void main(String[] args) {


Vector numeros = new Vector();
numeros.add(“uno”);
numeros.add(“dos”);
numeros.add(“tres”);

/* Insertamos el objeto “siete” 


* en la séptima posición(índice 6) */
numeros.insertElementAt(“siete”, 6);
}
}

Si ejecutamos el código anterior obtenemos el siguiente error:


Exception in thread "main"
java.lang.ArrayIndexOutOfBoundsException: 6 > 3
at java.util.Vector.insertElementAt(Vector.java:551)
at
programacion.EjemplosVector.main(EjemplosVector.java
:15)
Java Result: 1 

Si deseamos conocer el tamaño de un vector se puede utilizar el método


size() y para conocer su capacidad se puede utilizar el método capacity():

Vector numeros = new Vector(5);


numeros.add(“uno”);
numeros.add(“dos”);
numeros.add(“tres”);

System.out.println(“Tamaño
numeros.size()); del vector: ” +
System.out.println(“Capacidad del vector: ” +
numeros.capacity()); 

El código anterior produce la siguiente salida en consola:


Tamaño del vector: 3
Capacidad del vector: 5 

Esto se debe a que solamente hemos agregado tres elementos al vector y lo


hemos inicializado con una capacidad inicial de cinco.

Programación Orientada a Objetos  – De las Heras, Sebastián | 14


http://slidepdf.com/reader/full/arreglos-string-polimorfismo-y-excepciones-en-java 14/62
7/26/2019 Arreglos String Polimorfismo y Excepciones en Java

Un vector se considera vacío  si su tamaño es cero, es decir, si no tiene


ningún elemento almacenado. Para saber si un vector está vacío, podemos
obtener su tamaño mediante el método size() y verificar si el mismo es igual
a cero; o también podemos hacer uso de un método más directo
denominado isEmpty(). Este método retorna el valor boolean  “true” si el
 vector se encuentra vacío, y en caso contrario retorna el valor boolean 
“ false”. 
Vector numeros = new Vector(5);

/* Por el momento, el vector no contiene


* ningún elemento, entonces está vacío.
* La siguiente sentencia imprime “true” */
System.out.println(“¿Vector vacío? ” +
numeros.isEmpty());

numeros.add(“uno”);
numeros.add(“dos”);
numeros.add(“tres”);
/* Se han agregado elementos al vector.
* En consecuencia, la siguiente sentencia
* imprime “false” */
System.out.println(“¿Vector vacio? ” +
numeros.isEmpty());

Si deseamos eliminar todos los elementos de un vector podemos utilizar los


métodos removeAllElements() o clear() en forma indistinta:

Vector numeros
numeros.add( = new Vector(5);
“uno”);
numeros.add(“dos”);
numeros.add(“tres”);

System.out.println(“Tamaño del vector: ” +


numeros.size()); // Imprime 3

// Se remueven todos los elementos del vector


numeros.removeAllElements();

System.out.println(“Tamaño del vector: ” +


numeros.size()); //Imprime 0
Si pretendemos remover algún elemento específico del vector entonces
podemos utilizar los métodos removeElement()  o remove()  enviando
como parámetro el objeto que estamos interesados en remover:
Vector numeros = new Vector(5);
numeros.add(“uno”);
numeros.add(“dos”);
numeros.add(“tres”);

System.out.println(“Tamaño del vector: ” +


numeros.size()); // Imprime 3

Programación Orientada a Objetos  – De las Heras, Sebastián | 15


http://slidepdf.com/reader/full/arreglos-string-polimorfismo-y-excepciones-en-java 15/62
7/26/2019 Arreglos String Polimorfismo y Excepciones en Java

/* Se remueve el objeto de tipo String


* con la cadena de caracteres “dos” */
numeros.removeElement(“dos”);

System.out.println(“Tamaño del vector: ” +


numeros.size()); // Imprime 2

También podemos remover un elemento en particular indicando la posición


en la que se encuentra el elemento. Para ello se utiliza el método
removeElementAt()  y se envía como parámetro el índice
correspondiente a la posición en la que se encuentra el objeto que deseamos
remover:
Vector numeros = new Vector(5);
numeros.add(“uno”);
numeros.add(“dos”);
numeros.add(“tres”);

System.out.println(“Tamaño del vector: ” +


numeros.size()); // Imprime 3

/* Se remueve el elemento que se encuentra


* en la tercera posición (índice 2) */
numeros.removeElementAt(2);

System.out.println(“Tamaño del vector: ” +


numeros.size()); // Imprime 2

En el caso
podemos queuso
hacer queramos
del métodoremplazar un elemento
setElementAt() delutilizarlo,
. Para vector por otro,
debemos
enviar como parámetros el nuevo objeto que deseamos almacenar y un
índice que hace referencia a la posición del objeto que deseamos remplazar.
Vector numeros = new Vector(5);
numeros.add(“uno”);
numeros.add(“dos”);
numeros.add(“nueve”);
numeros.add(“cuatro”);

/* Remplazamos el objeto que se encuentra


*
* en la posición
objeto del índice
String “tres” */ 2 por el
numeros.setElementAt(“tres”, 2);

Los métodos  firstElement()  y lastElement()  devuelven el primer y


último elemento del vector respectivamente:
Vector numeros = new Vector(5);
numeros.add(“uno”);
numeros.add(“dos”);
numeros.add(“tres”);
numeros.add(“cuatro”);

/* Se imprime el primer elemento del vector,

Programación Orientada a Objetos  – De las Heras, Sebastián | 16


http://slidepdf.com/reader/full/arreglos-string-polimorfismo-y-excepciones-en-java 16/62
7/26/2019 Arreglos String Polimorfismo y Excepciones en Java

* en este caso “uno” */


System.out.println(numeros.firstElement());

/* Se imprime el último elemento del vector,


* en este caso “cuatro” */
System.out.println(numeros.lastElement());

Si deseamos conocer el índice correspondiente a un elemento en particular,


entonces podemos hacer uso del método indexOf(). A este método se le
debe enviar como parámetro el objeto sobre el cual nos interesa conocer su
índice correspondiente en el vector.
Vector numeros = new Vector(5);
numeros.add(“uno”);
numeros.add(“dos”);
numeros.add(“tres”);
numeros.add(“cuatro”);

/* Se imprime el índice correspondiente


* a la posición en la que se encuentra
* el objeto “tres” */
System.out.println(numeros.indexOf(“tres”));

En el ejemplo anterior, si hubiéramos enviado como parámetro un objeto


inexistente al método indexOf(), entonces el valor devuelto por el método es
“-1”.

Para saber si un elemento en particular se encuentra almacenado o no en


un vector,
como podemos
parámetro utilizardel
el objeto el cual
método contains()
se desea . Este
conocer método recibe
su existencia o no
dentro del vector. En caso que el objeto esté contenido en el vector,
entonces el método contains()  retorna un valor booleano “true”, y en caso
contrario, retorna un valor booleano “ false”. 
Vector numeros = new Vector(5);
numeros.add(“uno”);
numeros.add(“dos”);
numeros.add(“tres”);
numeros.add(“cuatro”);

/* El objeto “ ”
tres se
* en consecuencia  SÍimprime
existe en el  */
“true”vector,
System.out.println(numeros.contains(“tres”));

/* El objeto “ocho” NO existe en el vector,


* en consecuencia se imprime “false” */
System.out.println(numeros.contains(“ocho”));

Para acceder a los elementos de un vector, se pueden utilizar los métodos


elementAt() o get() en forma indistinta. Para ello, estos métodos reciben
como parámetro un índice que hace referencia a una posición determinada
del vector y retornan el objeto que se encuentra en dicha posición.
Vector numeros = new Vector(5);

Programación Orientada a Objetos  – De las Heras, Sebastián | 17


http://slidepdf.com/reader/full/arreglos-string-polimorfismo-y-excepciones-en-java 17/62
7/26/2019 Arreglos String Polimorfismo y Excepciones en Java

numeros.add(“uno");
numeros.add(“dos”);
numeros.add(“tres”);
numeros.add(“cuatro”);

System.out.println(numeros.elementAt(0));
System.out.println(numeros.elementAt(1));
System.out.println(numeros.get(2));
System.out.println(numeros.get(3));

Las últimas cuatro sentencias del código anterior imprimen en consola los
elementos del vector correspondientes a los índices 0, 1, 2 y 3 . Si en algún
momento intentamos acceder a un elemento que se encuentra fuera de
rango, obtendremos un error en tiempo de ejecución. En el ejemplo
anterior, el último índice válido es  3; si intentamos utilizar un índice
superior a este último entonces obtendremos una excepción de tipo
 ArrayIndexOutOfBoundsException.

 Al igual que los arreglos, también es posible utilizar sentencias iterativas 
para manipular los elementos de un objeto de tipo Vector.
Vector numeros = new Vector(5);
numeros.add(“uno”);
numeros.add(“dos”);
numeros.add(“tres”);
numeros.add(“cuatro”);

for (int i = 0; i<numeros.size(); i++) {


System.out.println(numeros.elementAt(i));
}

Otra forma de acceder a los elementos de un vector es mediante la interface


 Enumeration. Para ello, se utilizan las funciones hasMoreElements()  y
nextElement()  de esta interface. Si invocamos al método elements() , este
último retorna un objeto que implementa la interface  Enumeration  y en
consecuencia, tiene implementadas las funciones hasMoreElements()  y
nextElement(). Estos métodos permiten recorrer secuencialmente los
elementos de un vector. El método hasMoreElements()  retorna un valor
 boolean “true”  o “ false” que indica si el vector tiene más elementos para
recorrer o no. Cuando se llega al último elemento del vector, este método
devuelve un valor boolean “ false”, indicando que no hay más elementos
para recorrer. El método nextElement() retorna una referencia al próximo
elemento del vector. Para entender mejor estos conceptos, a continuación
se presenta un código que recorre secuencialmente un vector utilizando
estos métodos:
Vector numeros = new Vector(5);
numeros.add(“uno”);
numeros.add(“dos”);
numeros.add(“tres”);
numeros.add(“cuatro”);
Enumeration elementos = numeros.elements();
while (elementos.hasMoreElements()) {
System.out.println(elementos.nextElement());
}

Programación Orientada a Objetos  – De las Heras, Sebastián | 18


http://slidepdf.com/reader/full/arreglos-string-polimorfismo-y-excepciones-en-java 18/62
7/26/2019 Arreglos String Polimorfismo y Excepciones en Java

En el código anterior, se utiliza la sentencia iterativa while. Mientras se


cumpla la condición de que haya elementos para recorrer en el vector
“numeros” entonces se ejecuta el ciclo iterativo, es decir, mientras la
función hasMoreElements()  retorne el valor “true”, entonces se ejecutará
un nuevo ciclo del bloque while(). Dentro de este bloque de código, se
utiliza el método nextElement()   para obtener una referencia al siguiente
elemento del vector. De esta forma, este método permite avanzar
secuencialmente sobre los elementos de un vector. A medida que
avanzamos, antes de ejecutar un nuevo ciclo, se evalúa que el vector tenga
más elementos para recorrer utilizando el método hasMoreElements(). Una
 vez que lleguemos al último elemento del vector, el método
hasMoreElements() retornará un valor boolean  “ false” debido a que no hay
más elementos para recorrer, y en consecuencia, la ejecución del ciclo while 
se detendrá. Cuando se utilicen estos métodos hay que tener en cuenta que
el método nextElement()   retorna una referencia a un objeto de la clase
Object . Esto quiere decir que en la mayoría de los casos será necesario
aplicar casting a la clase adecuada con la que tengamos que trabajar.

 Ventajas y desventajas de arreglos y


 Vectores 
Los arreglos y vectores en Java permiten disponer de estructuras de datos
para almacenar elementos que contienen información. Dependiendo del
escenario en el que nos encontremos, es conveniente utilizar un arreglo o
una instancia de la clase Vector.
Un arreglo  representa una estructura de datos estática  que puede
almacenar un determinado número de variables. Estas variables son
almacenadas en una posición específica del arreglo. Cuando construimos un
arreglo, se debe especificar la cantidad de variables que se podrán
almacenar.
int[] arreglo = new int[5];
En el ejemplo anterior, se declara un arreglo y en su creación se reservan
cinco espacios en memoria. Una vez que un arreglo es creado, el tamaño del
mismo no puede ser alterado.

 A diferencia
una dedeundatos
estructura arreglo, un Vector
dinámica . La  capacidad
(instanciade
dealmacenamiento
la clase Vector) de
tiene
un
 vector puede cambiar en forma dinámica. Cuando un Vector  es
instanciado, el mismo es inicializado con una capacidad   inicial , y cuando
esta es superada, la misma es incrementada en forma automática, e incluso
podemos configurar cómo debe incrementarse la capacidad en caso que sea
necesario. La clase Vector  nos ofrece muchos métodos que nos permiten
manipular un Vector y todos ellos brindan una alternativa más sencilla para
desarrollar aplicaciones.
Un objeto de la clase Vector  utiliza arreglos internamente. La principal
 ventaja de un Vector sobre un arreglo es que un Vector puede aumentar su
capacidad en forma
con un tamaño automática; en cambio, un arreglo  una vez creado
determinado, no se puede modificar, por lo tanto, si en

Programación Orientada a Objetos  – De las Heras, Sebastián | 19


http://slidepdf.com/reader/full/arreglos-string-polimorfismo-y-excepciones-en-java 19/62
7/26/2019 Arreglos String Polimorfismo y Excepciones en Java

el escenario que estamos trabajando, necesitamos una estructura de datos


para almacenar información cuyo tamaño puede ser cambiante, entonces es
conveniente la utilización de la clase Vector.
En el caso que estemos trabajando en un escenario en el que necesitemos
almacenar información en una estructura de datos pero la misma tiene un
tamaño fijo y no cambiante en el tiempo, entonces es aconsejable utilizar
arreglos. Esto se debe principalmente a que un arreglo tiene mejor
performance  que un Vector  ya que sus operaciones y el acceso a sus
elementos tienen mejor performance. Los métodos definidos en la clase
Vector están basados en operaciones entre objetos y tienen menor eficiencia
en comparación a los algoritmos utilizados para manipular arreglos. Es
decir, un Vector nos puede ofrecer mayor facilidad para su manipulación en
comparación a un arreglo, pero este último tiene mejor performance en
cuantos a sus operaciones. Si la performance del escenario en el que
estamos trabajando es un punto crítico a tener en cuenta, entonces es
recomendable la utilización de arreglos en lugar de Vectores .

El siguiente cuadro expone las ventajas y desventajas de  Arreglos  y


Vectores .

 Estructura  Arreglo Vector

Las operaciones sobre


Su estructura es dinámica.
arreglos tienen mejor
Ventajas
performance que las de un Su tamaño puede
Vector.
incrementarse o reducirse.

Define operaciones a nivel


 Desventajas
Su tamaño es fijo y no de objetos, por lo tanto son
puede cambiar. más ineficientes que los
algoritmos de los arreglos.

Programación Orientada a Objetos  – De las Heras, Sebastián | 20


http://slidepdf.com/reader/full/arreglos-string-polimorfismo-y-excepciones-en-java 20/62
7/26/2019 Arreglos String Polimorfismo y Excepciones en Java

4.2- Clase String


4.2.1- Utilización de la clase String
La manipulación de texto o cadena de caracteres es una parte fundamental
en la gran mayoría de los lenguajes de programación. En Java, las
cadenas de caracteres son objetos. Para trabajar con estos objetos,
Java provee una clase para tal fin. Dicha clase se llama “ String” y
pertenece al paquete “ java.lang”. Mediante la utilización de esta clase
podremos crear instancias que representan cadenas de caracteres.
 Al igual que cualquier otro objeto, se puede instanciar un objeto de tipo
 String utilizando el operador “new” como se muestra a continuación: 

String s1 = new String();


La línea de código anterior crea una instancia de la clase  String  y se la
asigna a la variable “s1”. En este caso, la variable “s1” representa una cadena
de caracteres vacía. Esto se debe a que en el momento de su inicialización,
no se envió por parámetro ninguna cadena de caracteres específica.
Si deseáramos inicializar un objeto de tipo  String  con una cadena de
caracteres en particular, podemos utilizar el constructor de la clase  String 
que recibe una cadena de texto como parámetro de la siguiente manera:
String s2 = new String(“Ejemplo de un objeto String”); 

La clase  String también provee otros constructores que permiten crear un


objeto por medio de distintas alternativas. El código de ejemplo siguiente
construye un objeto  String utilizando un constructor que recibe un arreglo
de elementos char:
char[] javaArray = {'¡','J','a','v','a','!'};
String javaString = new String(javaArray);
System.out.println(javaString); 

El código anterior imprimirá en consola la cadena de caracteres “¡Java!”. 


La utilización de cadena de caracteres es bastante frecuente en la
programación, y porde
inicializar un objeto este motivo,
tipo StringJava
. nos ofrece una forma más sencilla de
String s3 = “Ejemplo de un objeto String”;
La línea de código anterior también crea un objeto de tipo  String  que
contiene la cadena de caracteres “ Ejemplo de un objeto String”.

 Algo importante que debemos conocer acerca de la utilización de objetos de


tipo  String es que los mismos son inmutables. Esto quiere decir que una
 vez que asignamos una cadena de caracteres a un objeto de tipo  String,
dicha cadena de caracteres representada por el objeto no podrá ser
modificada . Analicemos este concepto mediante un ejemplo:
String s4 = “Programación”; 

Programación Orientada a Objetos  – De las Heras, Sebastián | 21


http://slidepdf.com/reader/full/arreglos-string-polimorfismo-y-excepciones-en-java 21/62
7/26/2019 Arreglos String Polimorfismo y Excepciones en Java

s4.concat(“ Orientada a Objetos”); 


System.out.println(“s4 = ” + s4 ); //la salida en
//consola es “Programación ” 

En la primera línea se crea un objeto “s4” de tipo  String y se le asigna el


 valor
con la“ Programación”. En la siguiente
intención de concatenar línea se
la cadena deutiliza el método
caracteres “  Orientada a 
“concat()”
Objetos” al objeto “s4”. En la tercera línea imprimimos en consola el valor
del objeto “s4”, pero los resultados muestran que en lugar de imprimir
“ Programación Orientada a Objetos”, se imprime solamente
“ Programación”. Esto se debe a la inmutabilidad de los objetos de tipo
 String. En el ejemplo anterior, cuando utilizamos el método “concat()”, este
método devuelve un objeto de tipo  String  con las cadenas de caracteres
“Programación Orientada a Objetos” como resultado de la concatenación
entre los valores “ Programación” y “  Orientada a Objetos” pero no hay
ninguna variable que referencie a este nuevo objeto. La variable “s4” sigue
referenciando al objeto original con el valor “ Programación”. 
 Analicemos este nuevo ejemplo:
String s5 = “java”; 
s5.toUpperCase();
System.out.println(“s5 = ” + s5); // la salida en
// consola es “java” 

El método “toUpperCase()”  devuelve un objeto  String  cuya cadena de


caracteres se encuentra en mayúscula, pero la cadena de caracteres
representada por el objeto “s5 ” permanece inmutable. Este es el motivo por
el cual se imprime la cadena de caracteres “ java” en minúscula en lugar de
mayúscula cuando imprimimos el valor del objeto “s5 ”.  Para imprimir la
cadena de caracteres en mayúscula, debemos referenciar al objeto  String 
devuelto por el método “toUpperCase()” en una variable y luego imprimir
dicha variable:
String s5 = “java”; 
String s6 = s5.toUpperCase();
System.out.println(“s5 = ” + s5); // la salida en
// consola es “java” 
System.out.println(“s6 = ” + s6) ;// la salida en
// consola es “JAVA” 

Las siguientes figuras describen las sentencias ejecutadas del código


anterior:
String s5 = “java”; 

Obj et os en m em or i a 

s5 “java”
Variable de tipo
String
 

Programación Orientada a Objetos  – De las Heras, Sebastián | 22


http://slidepdf.com/reader/full/arreglos-string-polimorfismo-y-excepciones-en-java 22/62
7/26/2019 Arreglos String Polimorfismo y Excepciones en Java

String s6 = s5.toUpperCase(); 

Obj et os en m em or i a 

s5 “java”
toUpperCase()
Variable de tipo
String

s6 “JAVA”
Variable de tipo
String
 

Otra consideración a tener en cuenta de la clase  String  es que la misma


contiene el modificador  final   en su declaración, lo cual implica que no
puede ser derivada.

4.2.2- Métodos de la clase String


La clase  String provee muchos métodos que pueden ser utilizados para la
manipulación de cadena de caracteres y son de gran ayuda para los
programadores
más de provee
utilizados que aplicaciones. A continuación analizaremos los métodos
esta clase.

 public char charAt(int index)

Devuelve el carácter que se encuentra en la posición indicada por la variable


“index ” recibida por parámetro. Los índices utilizados por la clase  String 
comienzan en cero.
String java = "Java";
System.out.println(java.charAt(1)); //La salida es ‘a’ 

 public String concat(String s) 

Devuelve un objeto  String  compuesto por la unión de la cadena de


caracteres del objeto que invoca el método y la cadena de caracteres del
objeto que se recibe por parámetro.
String lenguaje = "Lenguaje";
System.out.println(lenguaje.concat(" Java")); 

También se pueden utilizar los operadores “+” y “+=” como si se tratara de


un tipo de dato  primitivo. La utilización de estos operadores sobre un
objeto de tipo String permite también concatenar cadenas de caracteres.

Programación Orientada a Objetos  – De las Heras, Sebastián | 23


http://slidepdf.com/reader/full/arreglos-string-polimorfismo-y-excepciones-en-java 23/62
7/26/2019 Arreglos String Polimorfismo y Excepciones en Java

Ejemplo utilizando operador “+”:


String lenguaje = "Lenguaje";
System.out.println(lenguaje + " Java"); 

Ejemplo utilizando operador “=+”:


String lenguaje = "Lenguaje";
lenguaje += " Java";
System.out.println(lenguaje); 

 public boolean endsWith(String suffix) 

Devuelve un valor boolean  (true  o  false) que indica si la cadena de


caracteres del objeto recibido por parámetro ( suffix ) es sufijo de la cadena
de caracteres del objeto que invoca el método.

String poo = "Programación Orientada a Objetos";


System.out.println(poo.endsWith("a Objetos")); //true
System.out.println(poo.endsWith("a Objetosss")); //false 

 public boolean equals(Object anObject) 

Devuelve un valor boolean  (true  o  false) que indica si la cadena de


caracteres que representa el objeto que invoca el método es igual a la
cadena de caracteres representada por el objeto recibido por parámetro.
Este método tiene en cuenta la distinción entre minúsculas y mayúsculas.

String c
String JAVA = "JAVA";
= "c";
System.out.println(JAVA.equals("JAVA")); // true
System.out.println(JAVA.equals("java")); // false
System.out.println(JAVA.equals("jAvA")); // false
System.out.println(JAVA.equals(c)); // false 

Este método es heredado de la clase  java.lang.Object  y lo analizaremos con


mayor detalle en el apartado 4.4 de la lectura (“Comparación de Objetos”).

 public boolean equalsIgnoreCase(String s) 


Devuelve un valor boolean  (true  o  false) que indica si la cadena de
caracteres que representa el objeto que invoca el método es igual a la
cadena de caracteres recibida por parámetro. A diferencia del método
“equals()”, este método no tiene en cuenta la distinción entre minúsculas y
mayúsculas.
String JAVA = "JAVA";
String c = "c";
System.out.println(JAVA.equalsIgnoreCase("JAVA")); // true
System.out.println(JAVA.equalsIgnoreCase("java")); // true
System.out.println(JAVA.equalsIgnoreCase("jAvA")); // true
System.out.println(JAVA.equalsIgnoreCase(c)); // false 

Programación Orientada a Objetos  – De las Heras, Sebastián | 24


http://slidepdf.com/reader/full/arreglos-string-polimorfismo-y-excepciones-en-java 24/62
7/26/2019 Arreglos String Polimorfismo y Excepciones en Java

 public int indexOf(int ch) 

Devuelve un valor entero que indica la posición de la primera ocurrencia del


carácter recibido por parámetro. Si no hay ninguna ocurrencia, entonces el
 valor devuelto es “-1”. 

String poo = "Programación Orientada a Objetos";


System.out.println(poo.indexOf('t'));
System.out.println(poo.indexOf('k')); 

El código anterior, primero imprime en consola el valor “18”, ya que la


primera ocurrencia del carácter “t ” se da en la posición 18  (la primera
posición es cero). Luego imprime en consola “-1” ya que no hay ninguna
ocurrencia del carácter “k” en la cadena de caracteres  “ Programación
Orientada a Objetos”.

 public int indexOf(String str) 

Devuelve un valor entero que indica la posición de la primera ocurrencia de


la cadena de caracteres recibida por parámetro. Si no hay ninguna
ocurrencia, entonces el valor devuelto es “-1”. 

String poo = "Programación Orientada a Objetos";


System.out.println(poo.indexOf("Orientada"));
System.out.println(poo.indexOf("No Orientada")); 

El código anterior imprime en consola el valor “13”, ya que la primera


ocurrencia de la subcadena de caracteres “Orientada” se da en la posición
13 (la primera posición es cero). Luego imprime en consola “-1” ya que no
hay ninguna ocurrencia de la subcadena de caracteres “ No Orientada”. 

 public int length() 

Devuelve un entero que indica el largo de la cadena de caracteres, es decir


indica cuántos caracteres contiene la cadena de caracteres del objeto.
String java = "Java";
System.out.println(java.length()); // Imprime el
// valor ‘4’ 

 public String replace(char old, char new) 

Este método remplaza todas las ocurrencias del carácter “old   recibido por
”  

parámetro por el carácter “new  también recibido por parámetro y devuelve


”  

un objeto  String  como resultado. Este método distingue mayúsculas y


minúsculas.
String JaVa = "JaVa";
System.out.println(JaVa.replace('a', 'A')); //Imprime ‘JAVA’ 

Programación Orientada a Objetos  – De las Heras, Sebastián | 25


http://slidepdf.com/reader/full/arreglos-string-polimorfismo-y-excepciones-en-java 25/62
7/26/2019 Arreglos String Polimorfismo y Excepciones en Java

 public boolean startsWith(String prefix) 

Devuelve un valor un boolean  (true  o  false) que indica si la cadena de


caracteres del objeto recibido por parámetro ( prefix ) es prefijo de la cadena
de caracteres del objeto que invoca el método. Este método distingue
mayúsculas y minúsculas.
String poo = "Programación Orientada a Objetos";
System.out.println(poo.startsWith("Programación")); // true
System.out.println(poo.startsWith("Programación No
Orientada")); // false 

 public String substring(int begin) 

Este método es utilizado para devolver una subcadena de caracteres que


representa una parte de la cadena de caracteres del objeto sobre el que se
invoca el método. El parámetro recibido indica a la posición inicial en la
que inicia la subcadena de caracteres a devolver. El índice comienza en
cero.
String poo = "Programación Orientada a Objetos";
System.out.println(poo.substring(13));

El código anterior imprime en consola la cadena de caracteres “Orientada a


Objetos”. 

 public String substring(int begin, int end) 

Este método es utilizado para devolver una cadena de caracteres que


representa una parte de la cadena de caracteres del objeto sobre el que se
invoca el método. A diferencia del método anterior, este último recibe dos
parámetros. El primer parámetro recibido ( begin) indica la posición inicial
en la que inicia la subcadena de caracteres a devolver y el segundo
parámetro recibido (end ) indica la posición final en la que debe terminar la
subcadena de caracteres a devolver. Hay que tener en cuenta que en la
determinación de la posición inicial de la subcadena de caracteres, se
considera que la primera posición comienza en cero, mientras que para la
determinación de la posición final de la subcadena de caracteres se
considera que la primera posición comienza en 1.
String poo = "Programación Orientada a Objetos";
System.out.println(poo.substring(13,22));

El código anterior imprime en consola la subcadena de caracteres


“Orientada”. 

 public String toLowerCase() 

Devuelve un objeto String constituido por la cadena de caracteres del objeto


que invocó al método pero con todos sus caracteres en minúscula.
String JAVA = "JAVA";
System.out.println(JAVA.toLowerCase()); //Imprime ‘java’ 

Programación Orientada a Objetos  – De las Heras, Sebastián | 26


http://slidepdf.com/reader/full/arreglos-string-polimorfismo-y-excepciones-en-java 26/62
7/26/2019 Arreglos String Polimorfismo y Excepciones en Java

 public String toString() 

Devuelve un objeto  String  con la cadena de caracteres que representa el


objeto.
String Java = "Java";
System.out.println(Java.toString()); //Imprime ‘Java’ 

 public String toUpperCase() 

Devuelve un objeto String constituido por la cadena de caracteres del objeto


que invocó al método pero con todos sus caracteres en mayúscula.
String Java = "Java";
System.out.println(JAVA.toUpperCase()); //Imprime ‘JAVA’ 

 public String trim() 

Devuelve un objeto String compuesto por la cadena de caracteres del objeto


que invocó al método, pero si dicha cadena de caracteres tiene espacios en
 blancos tanto al comienzo como al final, entonces los mismos son
removidos.
String lenguajeJava = " Lenguaje Java ";
System.out.println(lenguajeJava.trim()); 

El método anterior imprime en consola la cadena de caracteres


“ Lenguaje Java” en lugar de “  Lenguaje Java ”, ya que el método
trim()  elimina los espacios en blanco que se encuentran al comienzo y al
final de la cadena de caracteres.

Programación Orientada a Objetos  – De las Heras, Sebastián | 27


http://slidepdf.com/reader/full/arreglos-string-polimorfismo-y-excepciones-en-java 27/62
7/26/2019 Arreglos String Polimorfismo y Excepciones en Java

4.3- Polimorfismo
Cuando declaramos una variable de referencia de un tipo de clase que se
corresponde a una clase base de una jerarquía, dicha variable puede hacer
referencia a cualquier subclase
denomina Polimorfismo . de dicha jerarquía. Esta propiedad se

Si definimos una variable “ Figura f  , dicha variable puede hacer referencia


”  

a objetos de la clase Figura o también puede hacer referencia a objetos de la


clase Rectangulo o de la clase Triangulo:
Figura figura = new Figura(); // Suponiendo que la
// clase Figura no
// fuera abstracta
Figura rectangulo = new Rectangulo();
Figura triangulo = new Triangulo();

En todos los casos hemos declarado variables de tipo  Figura, pero en el


caso de las variables “rectangulo” y “triangulo”, ambas hacen referencia a
una instancia de la clase  Rectangulo y una instancia de la clase Triangulo 
respectivamente.
En el momento que se declara una variable de un cierto tipo de clase,
cuando se crea efectivamente el objeto usando el operador new, la variable
puede apuntar a cualquier instancia de una subclase de la clase definida en
la variable. Esta propiedad se conoce como  Polimorfismo. Tenemos una
 variable que apunta a un objeto distinto al que se esperaría por el tipo de
dato de la variable.
Cuando se invoca un método desde una variable con una referencia
polifórmica, el método invocado será aquel que se encuentra definido en la
clase de la referencia polifórmica.
 Veamos un ejemplo que explique estos conceptos:
En este ejemplo vamos a usar el método “ toString()”, razón por la cual lo
 vamos a redefinir en la clase  Rectangulo  y Triangulo  de la misma forma
que lo hicimos en su momento para la clase Figura.
Método toString() para la clase Rectangulo:
public String toString() {
String s = super.toString() + "¿Es Cuadrado?: " +
isCuadrado;
return s;

Método toString() para la clase Triangulo:


public String toString() {
String s = super.toString() + "Tipo de triángulo: " +
tipoTriangulo;
return s;

Programación Orientada a Objetos  – De las Heras, Sebastián | 28


http://slidepdf.com/reader/full/arreglos-string-polimorfismo-y-excepciones-en-java 28/62
7/26/2019 Arreglos String Polimorfismo y Excepciones en Java

En la siguiente clase definiremos un método “main()” en el que


declararemos dos variables con referencias polifórmicas e invocaremos al
método “toString()” para ambas variables. 
package programacion;

public class Polimorfismo {


public static void main(String args[]) {
Figura rectangulo = new Rectangulo("Rectángulo", 4, 4,
true);
System.out.println("Datos de la variable rectangulo");
System.out.println(rectangulo.toString());

System.out.println("\n");

Figura triangulo = new Triangulo("Triángulo", 4, 6,


"Escaleno");
System.out.println("Datos de la variable triangulo");

} System.out.println(triangulo.toString());

Si ejecutamos el método “main()”, obtendremos los siguientes resultados


en consola:
Datos de la variable rectangulo
Nombre: Rectángulo
Alto: 4
Ancho: 4
¿Es Cuadrado?: true

Datos de la variable triangulo


Nombre: Triángulo
Alto: 4
Ancho: 6
Tipo de triángulo: Escaleno

Como podemos ver, en el caso de la variable “rectangulo”, cuando hemos


invocado al método “toString()”, el método ejecutado es el que se encuentra
en la referencia
hace clase  Rectangulo
es una  porque
instanciaefectivamente
de esta clase.elLa
objeto
mismacreado y al
lógica se que se
aplica
para la variable “triangulo”. Esta variable es de tipo  Figura  pero hace
referencia a una instancia de la clase Triangulo, en consecuencia, el método
“toString()” a ejecutar será el de la clase Triangulo.

 Vamos a mencionar otro ejemplo pero esta vez usando el método


“calcularArea()”. Como bien sabemos, el método “calcularArea()” es un
método abstracto en la clase  Figura, pero tanto en la clase  Rectangulo 
como en la clase Triangulo,  el método ha sido redefinido con su propia
implementación particular para cada clase.

Programación Orientada a Objetos  – De las Heras, Sebastián | 29


http://slidepdf.com/reader/full/arreglos-string-polimorfismo-y-excepciones-en-java 29/62
7/26/2019 Arreglos String Polimorfismo y Excepciones en Java

package programacion;

public class Polimorfismo {

public static void main(String args[]) {


Figura[] figuras = new Figura[2];

figuras[0] = new Rectangulo("Rectángulo", 4, 4, true);


figuras[1] = new Triangulo("Triángulo", 4, 6,
"Escaleno");

for (int i=0 ; i<figuras.length ; i++) {


Figura figura = figuras[i];
System.out.println("El cálculo del área para la figura "
+ figura.getNombre() + " es igual a "
+ figura.calcularArea());
}
}

}
En este caso, hemos definido un arreglo  de referencias a objetos de tipo
 Figura. Nuestro interés en este caso es agregar en este arreglo todo tipo de
figuras sin importar su tipo específico (rectángulos o triángulos) para luego
recorrer este arreglo y mostrar en pantalla el cálculo del área de las figuras
almacenadas. Para ello, cuando recorremos el arreglo, sabemos que
obtendremos cualquier objeto de tipo  Figura, ya sea un  Rectangulo  o un
Triangulo, pero no nos importa el tipo específico al que pertenece el objeto
al que se refiere la variable, sólo nos interesa saber que estas referencias ya
sean de tipo  Rectangulo  o Triangulo  tienen implementado el método
“calcularArea()”. Cualquier objeto que obtengamos del arreglo  figuras,

será una instancia


“calcularArea()”. La de la claseVirtual
Máquina de  yJava
 Figura podremos invocar
determinará en al método
tiempo de
ejecución la implementación correspondiente que debe invocar de acuerdo
a la clase a la que pertenece la referencia polifórmica.
En la primera iteración del ciclo  for, estamos trabajando con una variable
que en tiempo de ejecución hace referencia a una instancia de la clase
 Rectangulo, por ende el método “calcularArea()” que se ejecuta es el que se
corresponde al de la clase  Rectangulo.
En la segunda iteración del ciclo  for, estamos trabajando con una variable
que en tiempo de ejecución hace referencia a una instancia de la clase
Triangulo, en consecuencia, el método “calcularArea()” que se ejecuta es el
que se corresponde al de la clase Triangulo.
En todos estos casos entra en juego el concepto de Polimorfismo. Se trata
de una propiedad que permite obtener distintas respuestas ante un
mismo mensaje dependiendo de quién reciba el mensaje. En el ejemplo
anterior, el mensaje “calcularArea()” es siempre el mismo, pero la
respuesta será distinta si quien recibe el mensaje es una instancia de la
clase Rectangulo o una instancia de la clase Triangulo.
Cuando utilizamos variables con referencias polifórmicas, solamente
podemos invocar aquellos métodos definidos en la clase base a la que
pertenece la variable. Es decir, si declaramos una variable de la siguiente
forma Figura figura = new Triangulo();

Programación Orientada a Objetos  – De las Heras, Sebastián | 30


http://slidepdf.com/reader/full/arreglos-string-polimorfismo-y-excepciones-en-java 30/62
7/26/2019 Arreglos String Polimorfismo y Excepciones en Java

La variable “ figura” solamente podrá invocar a los métodos definidos en la


clase Figura. Aunque la variable “ figura” esté referenciando a una instancia
de la clase Triangulo, no podrá invocar los métodos definidos en esta
última clase. Cualquier intento de invocar un método definido en la
subclase ocasionará un error de compilación:

Figura figura = new Triangulo();


figura.getTipoTriangulo(); // ¡Error de compilación! 

En tiempo de compilación, se debe invocar a los métodos definidos en la


clase base de la variable. Esto se debe a que una variable de tipo  Figura 
puede referenciar a instancias de las subclases  Rectangulo  o Triangulo  y
hay métodos que están definidos en la clase  Rectangulo pero no en la clase
Triangulo y viceversa.

Sin embargo, hay una forma de invocar a los métodos definidos en la clase a
la que la instancia hace referencia. En estos casos se debe realizar un
casting a la clase polifórmica.
Triangulo t = (Triangulo) figura;
t.getTipoTriangulo();

Mediante el empleo de casting, le estamos diciendo al compilador que la


 variable “ figura” en realidad se trata de una instancia de la clase Triangulo.
Si la variable figura no hiciera referencia a una instancia de la clase
Triangulo, obtendríamos un error en tiempo de ejecución
(ClassCastException). Una forma de saber la clase a la que pertenece la
instancia referida por una variable es mediante el operador “instanceof ”. 
Figura figura = new Triangulo();
if (figura instanceof Triangulo) {
System.out.println("La variable figura hace
referencia a una instancia de
la clase Triangulo");
}

Lo importante a tener en cuenta con respecto al  Polimorfismo es que una


 variable de cierta clase puede referirse a una subclase. Cuando se invocan
los métodos sobre dicha variable, solamente pueden invocarse los métodos
definidos
será el queen la clase
está base.
definido enPero en tiempo
la subclase a la de
queejecución, el método invocado
hace referencia.

Programación Orientada a Objetos  – De las Heras, Sebastián | 31


http://slidepdf.com/reader/full/arreglos-string-polimorfismo-y-excepciones-en-java 31/62
7/26/2019 Arreglos String Polimorfismo y Excepciones en Java

4.4- Comparación de
objetos
Para comprender la comparación de objetos en Java primero debemos
entender algunos conceptos relacionados a la forma en que Java almacena
una variable en memoria. Una variable en Java puede ser  primitiva o  por
referencia . Ambas nos sirven para manipular información, pero difieren en
su complejidad y el manejo que hace la Máquina Virtual de Java para
almacenarlas en memoria.
Cuando declaramos una variable local  de tipo  primitiva en Java, la misma
es almacenada en un sector de la memoria denominado  Stack. Una de las
características de este sector de la memoria es su rápido acceso. Cada
variable local primitiva  declarada, cuenta con su espacio de memoria
reservado en el Stack.
int a = 10;
int b = 6;
int c = 2;
int d = a;

Suponiendo las variables anteriores declaradas son locales, cada una de


ellas es almacenada en el  Stack. La declaración de la variable “d   indica que
”  

se asigne como valor de la misma el valor de la variable “a  pero esto no


”  

quiere decir que ambas variables compartan el mismo espacio de memoria.


Se crea una copia del valor de la variable “a”, en este caso “10” y se lo asigna
a la variable “d ”. 

Stack

c
b

Cuando se trata de objetos, su creación difiere en cuanto a la forma en la


que se crean variables  primitivas, ya que para crear un objeto se debe
primero declarar una variable y luego se debe indicar la construcción de un
objeto que será referenciado por la variable creada:

Auto a1;

Programación Orientada a Objetos  – De las Heras, Sebastián | 32


http://slidepdf.com/reader/full/arreglos-string-polimorfismo-y-excepciones-en-java 32/62
7/26/2019 Arreglos String Polimorfismo y Excepciones en Java

En el ejemplo anterior, se declara únicamente una variable de tipo  Auto,


pero por el momento esta variable no referencia a ningún objeto, solamente
contamos con la variable que apunta a una referencia nula. Para que esta
 variable referencie a un objeto, se debe primero construir un objeto y luego
asignar este objeto a la variable “a1”. Para ello, se utiliza el operador new y
el operador de asignación (=).
a1 = new Auto(“Ford Fiesta”, “LAR123”);
En la línea de código anterior, primero se crea un objeto de tipo  Auto 
utilizando el operador new y luego dicho objeto es asignado a la variable de
referencia “a1 , es decir, la variable “a1” referencia al objeto  creado de tipo
”  

 Auto. Una variable de referencia se almacena en el  Stack pero el objeto al


que referencia se almacena en un sector de la memoria denominado  Heap.
En el ejemplo anterior, una vez creado el objeto, el mismo es almacenado en
el  Heap. Este sector de memoria es más lento en comparación al sector
de memoria Stack, por lo tanto, por el momento contamos con una variable
de referencia y un objeto referenciado por dicha variable. Una variable de
referencia  es una variable que indica mediante una dirección de memoria la
ubicación donde se encuentra el objeto que referencia.
Auto a1;
Auto a2;
Auto a3;
Auto a4;

En las líneas de código anteriores, se declaran cuatro variables de referencia


de tipo  Auto. Supongamos que la clase  Auto  tiene definidos los atributos
“modelo” y “ patente” y su constructor recibe dos variables de tipo  String 

para inicializar dichos atributos.


1. a1 = new Auto("Ford Fiesta", "LAR123");
2. a2 = new Auto("Volkswagen Gol", "HIJ583");
3. a3 = new Auto("Ford Fiesta", "KUS392");
4. a4 = a1; 

La línea de código 1 crea un objeto de tipo  Auto  y se asigna a la variable


“a1”. La línea de código 2 crea un objeto de tipo  Auto  y se asigna a la
 variable “a2”. La línea de código 3 crea un objeto de tipo  Auto y se asigna a
la variable “a3”. La línea de código 4, indica que la referencia indicada por
la variable “a1   sea asignada a la variable “a4 , es decir, se indica que la
”   ”  

 variable “a4” referencie al mismo objeto referenciado por la variable “a1”.

La siguiente figura ilustra una representación de las variables declaradas y


sus respectivas referencias.

Programación Orientada a Objetos  – De las Heras, Sebastián | 33


http://slidepdf.com/reader/full/arreglos-string-polimorfismo-y-excepciones-en-java 33/62
7/26/2019 Arreglos String Polimorfismo y Excepciones en Java

Heap

Instancia de Auto

“Ford
“LARFiesta”
123”
Instancia de Auto

“Ford Fiesta”
“KUS392”

Instancia de Auto

“Vokswagen Gol”
“HIJ583”

Como se puede ver en la figura, un objeto puede ser referenciado por más
de una variable.
Luego de comprender los conceptos relacionados a la asignación y creación
de objetos en memoria, y siguiendo con el ejemplo anterior, nos podemos
plantear la siguiente pregunta:
  ¿Son las variables “a1” y “a2” iguales? 

  ¿Son las variables “a1” y “a3” iguales? 

  ¿Son las variables “a1” y “a4” iguales? 

Para responder a estas preguntas, en primer lugar debemos tener en cuenta


el criterio que se aplica para definir cuándo dos variables son iguales o no.
Un criterio podría considerar que dos variables de referencia son iguales si
ambas referencian al mismo objeto. Si seguimos este criterio, entonces
las que
 ya únicas variables
ambas hacenque son iguales
referencia entre síobjeto
al mismo seríany las variables
el resto “a1”
de las y “a4”,
variables
referencian a objetos distintos.
El operador == permite aplicar este tipo de comparación entre dos objetos.
Este operador devuelve como resultado el valor lógico “true” si ambas 
 variables referencian al mismo objeto y devuelve el valor lógico “ false” si
ambas variables referencian a objetos distintos. A continuación se muestra
un ejemplo en el que se hace uso de este operador:
Auto a1 = new Auto("Ford Fiesta", "LAR123");
Auto a2 = new Auto("Volkswagen Gol", "HIJ583");
Auto a3 = new Auto("Ford Fiesta", "KUS392");
Auto a4 = a1;

Programación Orientada a Objetos  – De las Heras, Sebastián | 34


http://slidepdf.com/reader/full/arreglos-string-polimorfismo-y-excepciones-en-java 34/62
7/26/2019 Arreglos String Polimorfismo y Excepciones en Java

// Comparación 1
if (a1 == a2) {
System.out.println("Las variables a1 y a2 hacen
referencia al mismo objeto");
} else {
System.out.println("Las variables a1 y a2 hacen
referencia a objetos distintos");
}

// Comparación 2
if (a1 == a3) {
System.out.println("Las variables a1 y a3 hacen
referencia al mismo objeto");
} else {
System.out.println("Las variables a1 y a3 hacen
referencia a objetos distintos");
}

// Comparación 3
if (a1 == a4) {
System.out.println("Las variables a1 y a4 hacen
referencia al mismo objeto");
} else {
System.out.println("Las variables a1 y a4 hacen
referencia a objetos distintos");
}

En “Comparación 1”, se comparan las referencias de las variables “a1” y


“a2”. El resultado de dicha comparación es “ false” ya que ambas variables
apuntan a distintos objetos. La misma lógica se aplica en “Comparación 2”
pero aplicado a las variables “a1” y “a3”. Estas últimas hacen referencia a
objetos distintos y en consecuencia el resultado de la comparación es
“ false”.  En “Comparación 3” se comparan las referencias de las variables
“a1” y “a4” y ambas variables referencian al mismo objeto, y por
consiguiente el resultado de la comparación es “true”. 
Por el momento, el criterio de igualdad   que aplicamos es el de considerar
que dos variables de referencia son iguales si ambas referencian al mismo
objeto. Para aplicar este criterio de comparación se utiliza el operador ==. A
su vez, el operador != es utilizado en sentido inverso, es decir, para
determinar si dos variables de referencia no son iguales. En el caso que las
 variables de referencia no sean iguales entonces el operador != retorna
“true” y en caso que sean iguales retorna “ false”. 

Otro criterio de comparación podría considerar que dos variables de


referencia son iguales, si los objetos a los que referencian son
“conceptualmente iguales”. Siguiendo con el ejemplo anterior, los
atributos que contiene una instancia de la clase  Auto  son “modelo” y
“ patente”. Podríamos considerar que dos objetos de tipo  Auto son iguales
conceptualmente si son del mismo modelo y tienen la misma patente, pero
a modo de ejemplo, vamos a considerar que dos objetos de tipo  Auto  son
conceptualmente iguales si ambos tienen definido el mismo modelo.
Siguiendo este criterio, entonces las variables “a1” y “a3” son las únicas
 variables “conceptualmente iguales” ya que los objetos referenciados  por
ambas variables tienen el mismo modelo definido (“ Ford Fiesta”). 

Programación Orientada a Objetos  – De las Heras, Sebastián | 35


http://slidepdf.com/reader/full/arreglos-string-polimorfismo-y-excepciones-en-java 35/62
7/26/2019 Arreglos String Polimorfismo y Excepciones en Java

Para definir este criterio de igualdad conceptual entre objetos de tipo  Auto 
debemos redefinir un método especial que tienen todos los objetos
denominado “equals()”. Este método se encuentra definido en la clase
 java.lang.Object , por lo tanto todos los objetos heredan este método, pero
para definir nuestro propio criterio conceptual de igualdad es necesario
redefinir este método con una implementación acorde a nuestro criterio de
igualdad. A continuación se redefine el método “equals()” de la clase Auto:
public boolean equals(Object o) {
if ((o instanceof Auto) &&
(((Auto)o).getModelo().equalsIgnoreCase(this.modelo))
{
return true;
} else {
return false;
}

El método “equals()” recibe un objeto como parámetro. Luego se  aplica el


operador “instanceof ”  para comprobar que el objeto recibido sea una
instancia de la clase Auto para verificar que se comparan objetos del mismo
tipo.  A continuación se compara el “modelo” del objeto recibido por
parámetro y el “modelo” del objeto actual y en caso que sean iguales, se
retorna el valor lógico “true” y en caso contrario se retorna el valor lógico
“ false”. 

En el siguiente código, se utiliza el método “ equals()” para comparar las


 variables de referencia “a1”, “a2”, “a3” y “a4”. 

Auto a1 = new Auto("Ford Fiesta", "LAR123");


Auto
Auto a2
a3 =
= new
new Auto("Volkswagen Gol",
Auto("Ford Fiesta", "HIJ583");
"KUS392");
Auto a4 = a1;

// Comparación 4
if (a1.equals(a2)) {
System.out.println("Las variables a1 y a2 son iguales
conceptualmente");
} else {
System.out.println("Las variables a1 y a2 no son
iguales conceptualmente");
}

// Comparación 5
if (a1.equals(a3)) {
System.out.println("Las variables a1 y a3 son iguales
conceptualmente");
} else {
System.out.println("Las variables a1 y a3 no son
iguales conceptualmente");
}

// Comparación 6
if (a1.equals(a4)) {
System.out.println("Las variables a1 y a4 son iguales
conceptualmente");

Programación Orientada a Objetos  – De las Heras, Sebastián | 36


http://slidepdf.com/reader/full/arreglos-string-polimorfismo-y-excepciones-en-java 36/62
7/26/2019 Arreglos String Polimorfismo y Excepciones en Java

} else {
System.out.println("Las variables a1 y a4 no son
iguales conceptualmente");
}

En “Comparación 4”, se comparan conceptualmente las referencias de las


 variables “a1” y “a2”. El resultado de dicha comparación es “ false” ya que
los objetos referenciados por ambas variables tienen modelos distintos de
autos. En “Comparación 5 ”, se comparan conceptualmente las referencias
de las variables “a1” y “a3”. Ambas variables referencian objetos distintos,
pero tienen el mismo modelo de auto, por lo tanto conceptualmente son
iguales y en consecuencia el valor devuelto por el método “equals()” es
“true”. En “Comparación 6”, se comparan conceptualmente las referencias
de las variables “a1” y “a4”, pero ambas variables referencian al mismo
objeto y en consecuencia se está comparando conceptualmente al mismo
objeto y en consecuencia el resultado de la comparación es “true”. 

De acuerdo
igualdad a lo dos
entre analizado anteriormente,
objetos, debemos tenersiempre que queramos
en cuenta si lo que verificar
queremos la
 verificar es si las variables de referencia hacen referencia al mismo objeto
(operador ==), o si los objetos referenciados por ambas variables son
conceptualmente iguales (métodos equals()).

Programación Orientada a Objetos  – De las Heras, Sebastián | 37


http://slidepdf.com/reader/full/arreglos-string-polimorfismo-y-excepciones-en-java 37/62
7/26/2019 Arreglos String Polimorfismo y Excepciones en Java

4.5- Sobrecarga de métodos


La sobrecarga de un método hace referencia a la definición de distintas
 versiones del mismo método en una clase. Para sobrecargar un método,
debe mantenerse
parámetros el mismo
del mismo. No senombre   pero sobrecarga
toma como debe modificarse la lista de
la diferenciación
solamente en el tipo de salida del método.
Ejemplos de métodos sobrecargados:
void ejemplo(int a, String b)
{
.
.
}

int ejemplo(int a)
{
.
.
}

int ejemplo(int a, int b)


{
.
.
}

int ejemplo()
{
.
.
}

Se trata de métodos distintos  pero todos ellos tienen el mismo


nombre. La diferencia que existe entre ellos radica en que tienen distinto
número y/o tipo de argumentos en su declaración.

 Algo a tener en cuenta es que los métodos sobrecargados pueden cambiar el


tipo de retorno y se pueden definir también en subclases.

En el momento en el que se invoca a un método sobrecargado, el


compilador busca el método que tenga la definición que se corresponde con
el número y/o tipo de parámetros en la invocación del método. Si el
compilador no encuentra ningún método que se corresponda con la
invocación, entonces obtendremos un error de compilación.
Otro claro ejemplo del uso de métodos sobrecargados es cuando definimos
distintos constructores para una misma clase.

Programación Orientada a Objetos  – De las Heras, Sebastián | 38


http://slidepdf.com/reader/full/arreglos-string-polimorfismo-y-excepciones-en-java 38/62
7/26/2019 Arreglos String Polimorfismo y Excepciones en Java

4.6- La palabra clave this


La palabra clave “this” hace referencia a la instancia u objeto actual.
Por medio de ella podemos referirnos a cualquier miembro del objeto
actual.
 Veamos a continuación un ejemplo que permita clarificar este concepto:
En la clase “ Ejemplo”, tenemos un constructor con dos parámetros (int c,
int d ) que son asignados a las variables de instancia “a” y “b”.

public class Ejemplo {


public int a = 0;
public int b = 0;

//constructor con 2 parámetros


public Ejemplo(int c, int d) {
a = c;
b = d;
}
}

 A continuación vamos a escribir la misma clase “ Ejemplo”  pero haciendo


uso de la palabra clave "this":
public class Ejemplo {
public int a = 0;
public int b = 0;

//constructor con 2 parámetros


public Ejemplo(int c, int d) {
this.a = c;
this.b = d;
}
}

Podemos ver que lo único que cambió en el constructor fue el agregado de


la palabra "this". Ésta se puede utilizar para evitar ambigüedades en el
código.
 Veamos el siguiente ejemplo:
public class Ejemplo {
public int a = 0; // variable de instancia
public int b = 0; // variable de instancia

//constructor con 2 parámetros


public Ejemplo(int a, int b) {
a = a; // variable local
b = b; // variable local
}

Programación Orientada a Objetos  – De las Heras, Sebastián | 39


http://slidepdf.com/reader/full/arreglos-string-polimorfismo-y-excepciones-en-java 39/62
7/26/2019 Arreglos String Polimorfismo y Excepciones en Java

En este caso, el constructor define dos parámetros del mismo nombre que
las variables de instancia (“a”  y “b”) ¿Cuál es el valor de las variables de
instancia “a” y “b” luego de llamar al constructor?
La respuesta es “a = 0”, y “b = 0”, porque el compilador está asignando la
 variable “a” que viene por parámetro a la misma variable “a” que viene por
parámetro, y lo mismo se aplica para la variable “b”, es decir, en el
constructor nunca hacemos referencia a las variables de instancia, sino que
siempre nos estamos refiriendo a las variables locales.
Este problema de ambigüedad se soluciona agregando la palabra clave
"this" antes de las variables “a” y “b”, como se muestra a continuación:
public class Ejemplo {
public int a = 0;//variable de instancia
public int b = 0;//variable de instancia

//constructor con 2 parámetros


public Ejemplo(int
this.a = a;
a, int b) {
this.b = b;
}
}

Supongamos que invocamos al constructor de la clase “ Ejemplo”  y como


parámetros enviamos los valores “1” y “2”. Como resultado de la ejecución
del constructor, los valores de las variables de instancia son “a = 1” y “b = 2”.
Hay que tener en cuenta que la palabr a clave “this” no puede ser utilizada
desde un método estático debido a que estos métodos no se refieren a
ninguna instancia en particular y al usar la palabra clave “this”
pretenderíamos obtener la instancia actual, lo cual es contradictorio.
public class Ejemplo {
int a;

public static void main(String args[]) {


System.ou.println(this.a);//Error de compilación 
}
}

La utilización de la palabra clave “this” se considera una buena práctica de


programación para evitar ambigüedades. 

Programación Orientada a Objetos  – De las Heras, Sebastián | 40


http://slidepdf.com/reader/full/arreglos-string-polimorfismo-y-excepciones-en-java 40/62
7/26/2019 Arreglos String Polimorfismo y Excepciones en Java

4.7- La palabra clave super


La palabra clave “super ” se utiliza cuando se quiere acceder a los
miembros de la clase padre, desde la clase hija.
Si se redefine un método de la clase padre, en la clase hija, y se quiere
acceder al método de la clase padre, la forma de hacerlo es con la palabra
clave “super”. 

public class EjemploPadre {

public void escribir() {


System.out.println("Estoy en la clase padre");
}
}

public class EjemploHija extends EjemploPadre {

public void escribir() {


System.out.println("Estoy en la clase hija");
}

public static void main(String[] args) {


EjemploHija ejemploHija = new EjemploHija();
ejemploHija.escribir();
}
}

Cuando ejecutamos el método “main()” de la clase hija, vemos por la


consola el siguiente mensaje:
Estoy en la clase hija
 Vemos este mensaje en la consola, porque el método escribir()  de la clase
padre, fue sobrescrito en la clase hija. 
Para poder ejecutar desde la clase hija el método “escribir()” de la clase
padre, agregamos la palabra clave “super ” como vemos a continuación: 

public class EjemploHija extends EjemploPadre {

public void escribir() {


super.escribir();//Se utiliza super SIN paréntesis.
System.out.println("Estoy en la clase hija");
}

public static void main(String[] args) {


EjemploHija ejemploHija = new EjemploHija();
ejemploHija.escribir();
}
}

Programación Orientada a Objetos  – De las Heras, Sebastián | 41


http://slidepdf.com/reader/full/arreglos-string-polimorfismo-y-excepciones-en-java 41/62
7/26/2019 Arreglos String Polimorfismo y Excepciones en Java

Cuando ejecutamos el método “main()” de la clase hija, vemos por la


consola el siguiente mensaje:
Estoy en la clase padre
Estoy en la clase hija

Si tenemos en la clase hija una variable de instancia “int a=8”, y queremos


acceder a una variable de instancia “int a=6” que se encuentra en la clase
padre, lo podemos hacer de la siguiente manera:
public class EjemploPadre {
public int a = 6;//variable de instancia
}

public class EjemploHija extends EjemploPadre {


public int a = 8;//variable de instancia

public void escribir() {


System.out.println("El valor de a en la clase padre
es: " + super.a);
System.out.println("El valor de a en la clase hija
es: " + a);
}

public static void main(String[] args) {


EjemploHija ejemploHija = new EjemploHija();
ejemploHija.escribir();
}
}

Luego de ejecutar el método “main()” de la clase hija, vemos por la consola


el siguiente mensaje:
El valor de a en la clase padre es: 6
El valor de a en la clase hija es: 8

Programación Orientada a Objetos  – De las Heras, Sebastián | 42


http://slidepdf.com/reader/full/arreglos-string-polimorfismo-y-excepciones-en-java 42/62
7/26/2019 Arreglos String Polimorfismo y Excepciones en Java

4.8- Manejo de excepciones


4.8.1- Concepto de excepción
En los lenguajes de programación, escribir código que verifique y haga un
correcto manejo de las situaciones anómalas  que podría tener una
aplicación puede resultar tedioso. Sin embargo, la detección de posibles
errores y la determinación de cómo debería reaccionar  la aplicación
ante esos errores es un aspecto fundamental que definirá cuán robusta y
confiable  es la aplicación. Para ello, Java provee los mecanismos
necesarios para el manejo de eventos anormales.

Definiremos entonces a una excepción como un evento anormal  o


inesperado que ocurre durante la ejecución de un programa y altera
su flujo normal.

El objetivo del manejo  o gestión de excepciones  es el de proveer un


contexto acorde para que la aplicación pueda resolver las situaciones
anómalas  de la forma en que nosotros creamos más conveniente. Para
entender mejor estos conceptos, analicemos el siguiente código de ejemplo:
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;

public class Division {

public static void main(String args[]) throws IOException {


System.out.println("División entre dos números enteros");

BufferedReader br = new BufferedReader(new


InputStreamReader(System.in));

System.out.println("Ingrese un dividendo entero");


int dividendo = Integer.parseInt(br.readLine());

System.out.println("Ingrese un divisor entero");


int divisor = Integer.parseInt(br.readLine());

int cociente = dividendo/divisor;


System.out.println("El resultado de la división es: " +
cociente);
}

El código anterior solicita al usuario el ingreso de dos números enteros para


realizar el cálculo de su cociente. Si ejecutamos la aplicación podemos ver
los siguientes mensajes en la consola:
División entre dos números enteros
Ingrese un dividendo entero

Programación Orientada a Objetos  – De las Heras, Sebastián | 43


http://slidepdf.com/reader/full/arreglos-string-polimorfismo-y-excepciones-en-java 43/62
7/26/2019 Arreglos String Polimorfismo y Excepciones en Java

8
Ingrese un divisor entero
4
El resultado de la división es: 2

 Veamos qué sucede si ingresamos como divisor el valor “cero”:


División entre dos números enteros
Ingrese un dividendo entero
2
Ingrese un divisor entero
0
Exception in thread "main"
java.lang.ArithmeticException: / by zero
at Division.main(Division.java:18)
Java Result: 1 

En consola podemos ver que ha ocurrido una “excepción  y la aplicación ha


”  

terminado abruptamente:
Exception in thread "main"
java.lang.ArithmeticException: / by zero
at Division.main(Division.java:18) 

Esta información se la conoce como stack trace o rastreo de la pila de


la excepción. Esta información incluye el nombre de la excepción que ha
ocurrido ( java.lang.ArithmeticException) junto a algún mensaje
descriptivo de la misma y la cadena de llamadas a métodos al momento en
que ocurrió la excepción. En este caso, se intentó hacer una división por
cero en la siguiente línea de código y la misma arrojó una excepción:
int cociente = dividendo/divisor;
El nombre de la excepción  que se obtuvo es
“ java.lang.ArithmeticException”  y se informa que se intentó hacer una
división por cero (“ / by zero”). La división por cero en el conjunto de los
números enteros es una operación no permitida, siendo éste el motivo por
el cual obtuvimos la excepción.
En el código de ejemplo que vimos, el flujo normal de la aplicación sería
esperar se
 vimos, quepuede
el usuario
dar lasiempre
ocasióningrese
en la valores enteros válidos,
que el usuario ingrese pero como
valores no
esperados, dando a producir situaciones anómalas conocidas como
excepciones.

Una aplicación puede arrojar varios tipos de excepciones. Intentemos


ejecutar la aplicación e ingresar alguna letra en lugar de un número. El
resultado obtenido es el siguiente:
División entre dos números enteros
Ingrese un dividendo entero
a
Exception in thread "main"
java.lang.NumberFormatException: For input string: "a"

Programación Orientada a Objetos  – De las Heras, Sebastián | 44


http://slidepdf.com/reader/full/arreglos-string-polimorfismo-y-excepciones-en-java 44/62
7/26/2019 Arreglos String Polimorfismo y Excepciones en Java

at
java.lang.NumberFormatException.forInputString(NumberFo
rmatException.java:48)
at java.lang.Integer.parseInt(Integer.java:449)
at java.lang.Integer.parseInt(Integer.java:499)
at Division.main(Division.java:13)
Java Result: 1 

Como podemos ver, la consola nos informa que se ha lanzado una excepción 
de tipo “ java.lang.NumberFormatException”  y la aplicación finaliza
abruptamente. Esto se debe a que la aplicación espera que siempre se
ingresen números enteros, pero darse la situación en la que un usuario se
equivoque e ingrese una letra en lugar de un número. En dicho caso la
siguiente línea de código arrojará una excepción:
int dividendo = Integer.parseInt(br.readLine());

Esto se debe a que la función “ Integer.parseInt()”  intenta obtener el


número entero que representa la cadena de caracteres ingresada, pero si
ingresamos como cadena de caracteres alguna letra, esta función no podrá
convertir dicha letra en un número entero y arroja una excepción.

Mediante el manejo de excepciones, los desarrolladores pueden


detectar posibles eventos anormales sin tener que escribir demasiados
códigos e indicar cómo se debe comportar la aplicación ante estos
eventos. Una excepción es representada por un objeto que la  Máquina
Virtual de Java  instancia en tiempo de ejecución si algún evento
anómalo ha sucedido, permitiendo al programador que intervenga en
dicha situación si así lo deseare para recuperarse del estado anormal y
evitar que la aplicación finalice en forma abrupta. 

4.8.2- Captura de excepciones


Como bien se mencionó anteriormente, el término excepción   hace
referencia a un “evento anormal ” que puede alterar el flujo normal de una
aplicación. Muchas pueden ser las causas que pueden originar una
excepción: fallas en el hardware, no disponibilidad de recursos, situaciones
no contempladas, errores matemáticos, invocación de un método sobre un
puntero nulo, índices fuera de rango, entre otros.
Cuando una excepción ocurre, se dice que la misma ha sido arrojada y el
código responsable de hacer algo con dicha excepción se denomina gestor
de la excepción. Se dice que dicho código captura  la excepción 
arrojada. De esta forma, la ejecución del programa se transfiere al
manejador de la excepción apropiado.

Entonces, porpor
archivo pero ejemplo, si llamamos
algún motivo, éste noa puede
un método que intenta
ser abierto, abrir un
la ejecución de
dicho método se detendrá y el código que hayamos definido para que

Programación Orientada a Objetos  – De las Heras, Sebastián | 45


http://slidepdf.com/reader/full/arreglos-string-polimorfismo-y-excepciones-en-java 45/62
7/26/2019 Arreglos String Polimorfismo y Excepciones en Java

controle esta situación será ejecutado. Pero para que este modelo funcione,
necesitamos indicarle de alguna forma a la  Máquina Virtual Java  qué
código se debe ejecutar cuando alguna excepción en particular ocurre. Para
hacer esta indicación, se utilizan las palabras claves “try” y “catch”. 

La palabra clave “try” se utiliza para definir un bloque de código en donde


alguna excepción puede ocurrir.
La palabra clave “catch” se utiliza para capturar   alguna excepción  en
particular o grupo de excepciones   para luego ejecutar algún bloque de
código.
 Analicemos la utilización de las palabras claves “try” y “catch” siguiendo el
escenario del ejemplo anterior:
1. import java.io.BufferedReader;
2. import java.io.IOException;
3. import java.io.InputStreamReader;
4.
5. public class Division {
6.
7. public static void main(String args[]) throws
IOException {
8. boolean reprocesarCiclo = true;
9. do {
10. try {
11. System.out.println("División entre dos números
enteros");
12.
13. BufferedReader br = new BufferedReader(new
InputStreamReader(System.in));
14.
15. System.out.println("Ingrese un dividendo
entero");
16. int dividendo = Integer.parseInt(br.readLine());
17.
18. System.out.println("Ingrese un divisor entero");
19. int divisor = Integer.parseInt(br.readLine());
20.
21. int cociente = dividendo/divisor;
22.
23. System.out.println("El resultado de la división
es: " + cociente);
24.
25. reprocesarCiclo = false;
26. } catch (ArithmeticException e) {
27. System.out.println("No se puede dividir por
cero!");
28. } catch (NumberFormatException e) {
29. System.out.println("El valor ingresado no es un
número entero!");
30. }
31. } while (reprocesarCiclo);
32.
33. System.out.println("Fin de la aplicación");
34. }
36. }

Programación Orientada a Objetos  – De las Heras, Sebastián | 46


http://slidepdf.com/reader/full/arreglos-string-polimorfismo-y-excepciones-en-java 46/62
7/26/2019 Arreglos String Polimorfismo y Excepciones en Java

En el ejemplo, el código que se encuentra entre las líneas “11”  y “25 ” 


constituye una región de código en donde alguna excepción puede ocurrir
 ya que dicho código se encuentra en un bloque “try”. Es nuestra forma de
decirle al compilador que en dicho bloque de código puede producirse
alguna excepción.

El código que se encuentra entre las líneas “26” y “27 ” se corresponde con
un bloque “catch” y le indica a la aplicación qué acciones debe realizar en el
caso que el bloque de código “try” indicado con anterioridad arroje una
excepción de tipo “ ArithmeticException”. 

El código que se encuentra entre las líneas “28” y “29” se corresponde con
un bloque “catch” y le indica a la aplicación qué acciones debe realizar en el
caso que el bloque de código “try” indicado con anterioridad arroje una
excepción de tipo “ NumberFormatException”. 

Como pudimos ver, cada bloque “catch” debe especificar entre paréntesis
un parámetro que indica el tipo de excepción que manipulará dicho bloque
de código que
excepción “catch”. Esto permite
ha ocurrido trabajar
para obtener con el
mayor   objeto quederepresenta
información la
la misma si
así se desea. Cuando ocurre una excepción  en un bloque de código “try”
entonces inmediatamente se ejecutará el bloque de código “catch” 
correspondiente a la excepción que ocurrió.
Se debe tener en cuenta que los bloques de código “catch” se deben colocar
inmediatamente después del bloque de código “try”.  A su vez, si hay varios
 bloques de código “catch”, los mismos deben colocarse consecutivamente,
es decir, no se puede colocar alguna sentencia intermedia entre los bloques
“catch”. 

La ejecución del código protegido po r el bloque “try” comienza en la línea


“11”. Si la aplicación logra ejecutarse hasta llegar a la línea “25 ” sin arrojar
ninguna excepción, es decir si ningún evento anormal sucede, entonces la
ejecución de la aplicación continuará en la línea “ 32” hacia abajo. Pero si en
algún momento durante la ejecución del código que se encuentra entre las
líneas “11”  y “25 ”  ocurre alguna excepción  de tipo “ ArithmeticException”, 
entonces la ejecución se transferirá directamente a la línea “26”  y en
consecuencia se ejecutará el bloque de código “catch” correspondiente a la
línea “27 ”. Una vez que el bloque de código “catch” finaliza, la ejecución del
programa continúa en la línea “ 32”.
 Algo importante a tener en cuenta también es que si por ejemplo, una
excepción  se produce en la línea “16”, entonces el resto de las líneas
sucesivas que se encuentran en el bloque de código “try”  no serán
ejecutadas, es decir, una vez que el control de un programa se encuentra en
un bloque de código “catch” entonces el control nunca regresará al bloque
de código “try” para completar su ejecución. 

Uno de los beneficios de este modelo de manejo de excepciones es que el


código necesario para manejar alguna excepción  en particular que pueda
ser arrojada en cualquier sección de un bloque de código “try” debe ser
escrita una única vez. En el ejemplo anterior, una excepción  de tipo
“ NumberFormatException” puede ocurrir tanto en la línea “16” y “19”, pero
sin importar en qué línea se arroje la excepción, el mismo bloque de código
“catch” capturará la excepción.

Programación Orientada a Objetos  – De las Heras, Sebastián | 47


http://slidepdf.com/reader/full/arreglos-string-polimorfismo-y-excepciones-en-java 47/62
7/26/2019 Arreglos String Polimorfismo y Excepciones en Java

4.8.3- Lanzamiento de excepciones


En la sección anterior vimos de qué forma se podía escribir un bloque de
código “catch” para capturar alguna excepción en particular y determinar
cómo queremos que se comporte el programa ante dicha excepción. En
algunos casos es apropiado capturar una excepción en el mismo método en
donde ocurre dicha excepción  mediante los bloques de código “try” y
“catch”, pero también hay otros casos  en los cuales puede resultar más
conveniente que la excepción  sea capturada por algún método superior o
previo en  pila de llamadas  (stack trace). Para ello se dice que se debe
lanzar la excepción hacia los métodos previos de la  pila de llamadas. Para
entender este concepto debemos primero comprender el funcionamiento de
la pila de llamadas de un método.

La pila de llamadas  de un método es la cadena de métodos que el


programa ejecuta para obtener el método actual que está siendo
ejecutado.

Si nuestro programa inicia con el método “main()”, y dentro de este método


se invoca al método “a()”, y éste invoca al método “b()”, y éste último invoca
al método “c()”, la pila de llamadas es la siguiente:

c()

 b()

a()

 main()

En la  pila de llamadas de métodos, el último método invocado es el que se


encuentra en lo más alto del listado, mientras que el primer método
invocado es el que encuentra en lo más bajo del listado. En este caso, “c()” 
es el método que se estaba ejecutando actualmente, y a medida que
descendemos hacia abajo en el listado observamos los métodos
previamente invocados. En algunos casos se representa la  pila de llamadas 
con el orden invertido al expuesto en el ejemplo.
Supongamos ahora que existe la posibilidad de que durante la ejecución del
método “c()” ocurra una excepción. Una de las opciones que tenemos es la
de capturar dicha excepción mediante los bloques de código “try” y “catch”
dentro del mismo método “c()”. Otra opción que tenemos es la de lanzar la
excepción  hacia el método que previamente fue invocado, en este caso el
método “b()” y que sea éste quien tenga la responsabilidad de manipular la
excepción. Pero para ello, debemos indicarle a la  Máquina Virtual Java que
existe la posibilidad de que el método “c()”  pueda arrojar una excepción.
Esto lo indicamos en la declaración del método utilizando la palabra clave
“throws”. 

 A continuación,
comprender mejoranalizaremos un código de ejemplo para que podamos
estos conceptos:

Programación Orientada a Objetos  – De las Heras, Sebastián | 48


http://slidepdf.com/reader/full/arreglos-string-polimorfismo-y-excepciones-en-java 48/62
7/26/2019 Arreglos String Polimorfismo y Excepciones en Java

import java.io.FileWriter;
import java.io.IOException;

public class EscribirArchivo {

private static FileWriter file;

public static void main(String args[]) {


leerArchivo();
escribirArchivo();
}

public static void leerArchivo() {


try {
file = new FileWriter("test.txt");
} catch (IOException ex) {
System.out.println("Una excepción ha ocurrido: " +
ex.toString());
}
}

public static void escribirArchivo() {


try {
file.write("Programación Orientada a Objetos");
file.close();
} catch (IOException ex) {
System.out.println("Una excepción ha ocurrido: " +
ex.toString());
}
}

El código anterior escribe la cadena de caracteres “ Programación


Orientada a Objetos” en un archivo de texto plano denominado “test.txt ”. Si
dicho archivo no existe, entonces el archivo es creado. Cuando se ejecuta el
método “leerArchivo()”, la pila de llamadas es la siguiente:
leerArchivo()
 main()

Esto indica que primero se ejecutó el método “main()”  y luego dentro de


este método se invoca al método “leerArchivo()”. Una vez que finaliza el
método “leerArchivo()”, el control vuelve al método “main()” y este último
invoca ahora al método “escribirArchivo()”. Cuando se ejecuta el método
“escribirArchivo()” la pila de llamadas es la siguiente:

escribirArchivo()
 main()

Esto indica que el primer método en ser ejecutado fue el método “main()” y
en algún momento este último invoca al método “escribirArchivo()”.

Programación Orientada a Objetos  – De las Heras, Sebastián | 49


http://slidepdf.com/reader/full/arreglos-string-polimorfismo-y-excepciones-en-java 49/62
7/26/2019 Arreglos String Polimorfismo y Excepciones en Java

Si observamos los métodos “leerArchivo()” y “escribirArchivo()”, ambos


métodos contienen bloques de código “try” y “catch” debido a que las
sentencias utilizadas pueden arrojar excepciones   de tipo “ IOException”.
Este tipo de excepción representa errores relacionados con operaciones de
entrada y salida de datos, como puede ser por ejemplo algún error en el
intento de creación del archivo “test.txt ” o algún problema mientras se
intenta guardar una cadena de caracteres en el archivo.
En este caso, hemos definido bloques de código “try” y “catch” que se
encargan de manipular las excepciones  dentro del método donde ha
sucedido la excepción. A continuación modificaremos el código para que
 veamos de qué forma se puede lanzar  la excepción  que ha ocurrido a un
método previo en la pila de llamadas:
import java.io.FileWriter;
import java.io.IOException;

public class EscribirArchivo {

private static FileWriter file;

public static void main(String args[]) {


try {
leerArchivo();
escribirArchivo();
} catch (IOException ex) {
System.out.println("Una excepción ha ocurrido: " +
ex.toString());
}
}

public static void leerArchivo() throws IOException {


file = new FileWriter("test.txt");
}

public static void escribirArchivo() throws IOException {


file.write("Programación Orientada a Objetos");//línea 22
file.close();
}
}

Como bien dijimos con anterioridad, para lanzar una excepción  a un


método previo de la  pila de llamadas se debe indicar la posibilidad de que
el método actual
“leerArchivo()”  ypuede arrojar una excepción
“escribirArchivo()” . Si métodos
, ambos observamos los métodos
tienen en su
declaración la siguiente sentencia:
throws IOException
Esto quiere decir que el conjunto de sentencias de este método tiene la
posibilidad de arrojar una excepción de tipo “ IOException”.
Entonces si por ejemplo, ocurre una excepción  en la línea de código “22” 
mientras se intenta escribir la cadena de caracteres “ Programación
Orientada a Objetos” en el archivo, la pila de llamadas de la excepción será
la siguiente:

Programación Orientada a Objetos  – De las Heras, Sebastián | 50


http://slidepdf.com/reader/full/arreglos-string-polimorfismo-y-excepciones-en-java 50/62
7/26/2019 Arreglos String Polimorfismo y Excepciones en Java

escribirArchivo()
 main()

En este caso, como la línea de código “22” no forma parte de un bloque de


código “try”
el método y “catch”
previo entonces
de la  pila se dice que
de llamadas , en la excepción
este  es lanzada
caso el método  hacia
“main()” ,y
este último es ahora responsable de manipular la excepción, que
efectivamente lo hace mediante un bloque de código “try” y “catch”. La
misma lógica se aplica para el método “leerArchivo()”. Si una excepción de
tipo “ IOException”  ocurre durante la ejecución de este método, entonces
dicha excepción será lanzada hacia el método “main()”.
Es importante tener en cuenta el uso de la sentencia “throws” en la
declaración de un método para indicar que el mismo puede lanzar 
excepciones. De esta forma, si un método “a()” invoca a otro método “b()” 
cuya declaración incluye la sentencia “throws”, entonces el método “a()” 

conoce quepara
preparado puede recibir excepciones desde el método “b()” y deberá estar
manipularlas.
Para indicar que un método puede lanzar más de una excepción, se indican
los distintos tipos de excepciones  que se pueden lanzar  separados por
coma:
public static void escribirArchivo() throws
FileNotFoundException, InterruptedIOException,
RemoteException {
La declaración de este método indica que puede arrojar excepciones de tipo
 FileNotFoundException, InterruptedIOException y RemoteException.

 Antes de que una excepción  pueda ser capturada  en algún punto, debe
existir algún código que inicie y lance dicha excepción. Este lanzamiento  
de la excepción puede estar indicado en nuestro código o en el código de
alguna librería que utilicemos o en las clases que componen los paquetes de
Java. Sin importar quién lanza específicamente la excepción, lo importante
es saber que para que se inicie el flujo de una excepción, la misma debe ser
lanzada  o arrojada  utilizando la sentencia “throw” (no confundir con la
sentencia “throws”).

En los ejemplos anteriores, las excepciones  eran creadas y lanzadas  por


clases de Java. Por ejemplo, cuando evaluábamos la siguiente expresión:
Integer.parseInt(br.readLine()); 
Si la sentencia anterior recibe como parámetro una cadena de caracteres
que no representa un número entero, entonces la implementación del
método “ parseInt()”  crea y lanza  una excepción  de tipo
“ NumberFormatException”, es decir, la implementación del método
“ parseInt()”  contiene líneas de código que evalúan si el parámetro que
recibe se corresponde al de un número entero, y en caso contrario crea un
objeto de tipo “ NumberFormatException”  que representa la excepción 
producida y la misma es arrojada utilizando la sentencia “throw”. 
 A continuación mostraremos un ejemplo, en donde verifiquemos una
condición, y en el caso que dicha condición no se cumpla entonces
lanzaremos una excepción. Supongamos que a nuestra clase  Division  que

Programación Orientada a Objetos  – De las Heras, Sebastián | 51


http://slidepdf.com/reader/full/arreglos-string-polimorfismo-y-excepciones-en-java 51/62
7/26/2019 Arreglos String Polimorfismo y Excepciones en Java

hemos definido en un ejemplo anterior que se encarga de realizar la


división entre dos números enteros deseamos incluir como restricción que
únicamente se puedan dividir números enteros positivos. En otras palabras,
si al momento de ingresar el dividendo y el divisor, se ingresan números
negativos entonces se debe informar que no se podrá realizar la división
porque el número ingresado es un número entero negativo. El código
modificado para cumplir con esta restricción sería el siguiente:
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;

public class Division {

public static void main(String args[]) throws IOException {


boolean reprocesarCiclo = true;
do {
try {
System.out.println("División entre dos números
enteros");
BufferedReader br = new BufferedReader(new
InputStreamReader(System.in));

System.out.println("Ingrese un dividendo entero");


int dividendo = Integer.parseInt(br.readLine());
if (dividendo < 0) {
Exception e = new Exception("Dividendo ingresado
negativo!");
throw e;
}

System.out.println("Ingrese un divisor entero");


int divisor = Integer.parseInt(br.readLine());
if (divisor < 0) {
Exception e = new Exception("Divisor ingresado
negativo!");
throw e;
}

int resultado = dividir(dividendo, divisor);

System.out.println("El resultado de la división es: "


+ resultado);

} reprocesarCiclo = false;
catch (ArithmeticException e) {
System.out.println("No se puede dividir por cero!");
} catch (NumberFormatException e) {
System.out.println("El valor ingresado no es un
número entero!");
} catch (Exception e) {
System.out.println("Una excepción ha ocurrido! " +
e);
}
} while (reprocesarCiclo);

System.out.println("Fin de la aplicación");
}
public static int dividir(int dividendo, int divisor) {

Programación Orientada a Objetos  – De las Heras, Sebastián | 52


http://slidepdf.com/reader/full/arreglos-string-polimorfismo-y-excepciones-en-java 52/62
7/26/2019 Arreglos String Polimorfismo y Excepciones en Java

int cociente = dividendo/divisor;


return cociente;
}
}

En el código
de que anterior,y el
el dividendo endivisor
las líneas “17 ” y “24”
ingresados no hemos
puedenagregado la condición
ser números enteros
negativos. Si se cumple la condición de que los valores ingresados son
números enteros negativos entonces se crea una instancia de la clase
 Exception y luego se lanza la excepción utilizando la palabra clave throw.

Exception e = new Exception("Dividendo ingresado


negativo!");
throw e;

Si se lanza la excepción, entonces el bloque de código “catch” de la línea


“ 38”  captura  dicha excepción  y la procesa. En el constructor de la clase
 Exception  hemos pasado como parámetro una cadena de caracteres con
información sobre el error producido. Si ejecutamos el programa e
introducimos un número entero negativo, entonces en la consola se nos
informa que una excepción  ha ocurrido y se nos muestra el mensaje de
error que hemos definido en el código:
División entre dos números enteros
Ingrese un dividendo entero
8
Ingrese un divisor entero
-4
Una excepción ha ocurrido! java.lang.Exception:
Divisor ingresado negativo!

La plataforma de Java dispone de muchas clases para representar


excepciones. Todas estas clases son descendientes de la clase
“ java.lang.Throwable”. Cuando se lanza  una excepción  utilizando la
sentencia “throw”, el único requerimiento de esta sentencia es que el objeto
que se ha de lanzar debe ser una instancia de la clase “Throwable”. En el
ejemplo anterior hemos creado una instancia de la clase  Exception 
(subclase de Throwable) y dicho objeto ha sido lanzado  utilizando la
sentencia “throw”.

No hay que confundir la utilización de las palabras claves “throws” y


“throw”. La palabra clave “throws” es utilizada  en la declaración de un
método para indicar las excepciones  que pueden ser arrojadas por dicho
método; mientras que la palabra clave “throw” es utilizada para lanzar en
forma explícita una excepción.

Programación Orientada a Objetos  – De las Heras, Sebastián | 53


http://slidepdf.com/reader/full/arreglos-string-polimorfismo-y-excepciones-en-java 53/62
7/26/2019 Arreglos String Polimorfismo y Excepciones en Java

4.8.4- Jerarquía de excepciones


Todas las clases que representan excepciones   en la plataforma Java son
subclases de la clase “ java.lang.Exception”. A su vez, esta última deriva
de la clase “ java.lang.Throwable”  y ésta de la clase
“ java.lang.Object ”. 

Object

Throwable

Error 
Exception
(unchecked)

RuntimeException
(unchecked) Excepciones del
IOException
programador 
(checked)
(checked)

En la figura anterior se representa la jerarquía de excepciones  de la


plataforma Java con sus clases más representativas. La clase Throwable 
tiene dos subclases:
   Error : las clases que derivan de  Error  representan situaciones
anómalas  que no son causadas por errores de programación y
pueden estar asociadas a errores graves  de hardware o del
sistema en los cuales el programador nada puede hacer al respecto
más que ser notificado sobre el error. Un ejemplo de este tipo de
error se genera cuando la  Máquina Virtual Java  no cuenta con la
memoria suficiente para almacenar algún objeto en memoria y en
consecuencia se produce un error de tipo OutOfMemoryError  
(subclase de  Error). En general, cuando sucede alguno de estos
tipos de errores (instancias de la clase  Error), la aplicación no estará
en condiciones de manipular el error y recuperarse de la situación,
motivo por el cual muchas veces no tiene sentido intentar manipular
estos tipos de errores. Técnicamente, las instancias de la clase  Error 
no se las considera excepciones   porque no derivan de la clase
 Exception.

Programación Orientada a Objetos  – De las Heras, Sebastián | 54


http://slidepdf.com/reader/full/arreglos-string-polimorfismo-y-excepciones-en-java 54/62
7/26/2019 Arreglos String Polimorfismo y Excepciones en Java

  Exception: una instancia de la clase  Exception  representa una


situación anómala excepcional   que puede ocurrir y puede ser
manipulada  de forma tal que la aplicación se puede recuperar de
dicho estado anormal. La mayoría de los programas lanzan y
capturan objetos que derivan de la clase  Exception. Una excepción 
indica que un problema ha ocurrido pero no es tan grave como un
error del sistema.
La plataforma Java define muchas clases descendientes de la clase
 Exception. Cada una de estas clases representa algún tipo de tipo de
excepción en particular que puede requerir por parte del programador la
obligación de definir algún código que manipule dicha excepción  ya que
de lo contrario la aplicación no compilaría. De acuerdo a la obligación o
no de definir código que manipule una excepción, las mismas se
pueden clasificar en  verificadas en compilación (o chequeadas) y no
 verificadas en compilación (o no chequeadas).

Para las excepciones  que son verificadas en compilación  es obligatorio 


definir un código
puede producir que haga
aunque un tratamiento
la misma de la aposible
no llegue nunca excepción
ejecutarse, ya queque se
de lo
contrario el código no compilará. Todas las clases que extienden de
 Exception  salvo la clase  RutimeException  son verificadas  o chequeadas
(checked ).
Como ejemplo, podemos citar las excepciones que son instancias de la clase
 IOException. Esta clase deriva de  Exception y representa a las excepciones
relacionadas con operaciones de entrada y salida de datos desde diversos
tipos de dispositivos. Si en algún momento utilizamos un método que puede
arrojar este tipo de excepción, entonces al ser una excepción verificada,
tenemos la obligación de definir algún código que haga un tratamiento de la
excepción, de lo contrario obtendremos un error de compilación. Por
ejemplo, los métodos “write()”  y “close()” de la clase “ FileWriter” pueden
arrojar excepciones de tipo  IOException, por lo tanto si no indicamos
ningún tratamiento ante la posibilidad de recibir una excepción cuando
utilizamos estos métodos, obtendremos un error de compilación:
public static void escribirArchivo() {
//file es una instancia de FileWriter
file.write("Programación Orientada a Objetos");
file.close();

En el código anterior, hacemos uso de los métodos “write()”  y “close()”,


pero no indicamos ningún tratamiento para la posible excepción de tipo
 IOException que se podría recibir desde estos métodos, por lo tanto el error
de compilación que obtenemos es el siguiente:
Exception in thread "main" java.lang.RuntimeException:
Uncompilable source code - unreported exception
java.io.IOException; must be caught or declared to be thrown
at
EscribirArchivo.escribirArchivo(EscribirArchivo.java:22)
at EscribirArchivo.main(EscribirArchivo.java:11)
Java Result: 1 

Programación Orientada a Objetos  – De las Heras, Sebastián | 55


http://slidepdf.com/reader/full/arreglos-string-polimorfismo-y-excepciones-en-java 55/62
7/26/2019 Arreglos String Polimorfismo y Excepciones en Java

El error de compilación informa que se debe indicar algún código que


permita darle un tratamiento a la posible excepción de tipo  IOException 
que se puede arrojar. Para definir un tratamiento a la posible excepción, se
puede definir código que capture la excepción mediante bloques “try”  y
“catch”  o se puede seguir lanzando la excepción a un método superior
(sentencia “throws” en la declaración del método). Como ejemplo, vamos a
dejar que la excepción sea manipulada por algún método previo y para ello
 vamos a utilizar la sentencia “throws” en la declaración del método.
public static void escribirArchivo() throws IOException {
//file es una instancia de FileWriter 
file.write("Programación Orientada a Objetos");
file.close();
}

Debido a que hemos definido un tratamiento para la excepción verificada o


chequeada  de tipo  IOException, entonces ahora el método

“escribirArchivo()” compila en forma satisfactoria.


Por el otro lado, para las excepciones no verificadas  o no chequeadas 
(unchecked ) el compilador no obliga a establecer algún código que defina
un tratamiento a las posibles excepciones que se pueden ejecutar, pero el
programador lo puede hacer si así lo deseare. Las clases que derivan de
 RuntimeException y Error representan excepciones no verificadas.

En el siguiente ejemplo, hacemos uso del método “ parseInt()”  de la clase


 Integer:

Integer.parseInt("a");

 yEste métodode puede lanzar


queuna
excepción de tipo  NumberFormatException 
se trata una clase extiende de  RuntimeException , por lo tanto es
una excepción no verificada. Debido a esto, no es necesario  definir un
código que trate a la posible excepción  que se puede llegar a lanzar, pero
podemos hacerlo si deseamos ejecutar alguna acción en particular ante la
ocurrencia de dicha excepción :
try {
Integer.parseInt("a");
} catch (NumberFormatException e) {
System.out.println("El valor ingresado no es un
número entero!");
}

 Algunas de las clases más conocidas que extienden de Exception son:


-  ClassNotFoundException
-   IllegalAccessException
-   InterruptedException
-   IOException
-   NamingException
-   SQLException
-  TimeoutException 

Programación Orientada a Objetos  – De las Heras, Sebastián | 56


http://slidepdf.com/reader/full/arreglos-string-polimorfismo-y-excepciones-en-java 56/62
7/26/2019 Arreglos String Polimorfismo y Excepciones en Java

 Algunas de las clases más conocidas que extienden de RuntimeException


son:
-   ArithmeticException
-  ClassCastException
-  ConcurrentModificationException
-   IllegalArgumentException
-   IndexOutOfBoundsException
-   MissingResourceException
-   NegativeArraySizeException
-   NoSuchElementException
-   NullPointerException 

Una vez que tenemos un objeto que representa una excepción, hay dos
formas de obtener información acerca de la misma. Una opción es por
medio del tipo de excepción, es decir, por medio de la clase de la cual el
objeto es instancia. Por otro lado, la clase Throwable  provee algunos
métodos que pueden ser útiles para obtener información acerca de la
excepción ocurrida. Como estos métodos se encuentran definidos en la clase
Throwable, entonces los mismos son heredados por el resto de las clases
del árbol de excepciones. Uno de los métodos útiles es el método
“ printStackTrace()”, el cual imprime en consola la  pila de llamadas  de
métodos al punto en el que se ejecutó la excepción. El método
“getMessage()” retorna un objeto de tipo  String con información sobre el
error que dio origen a la excepción.

4.8.5- Excepciones definidas por el


programador
Cuando una excepción ocurre, un objeto de la clase  Exception o de alguna
de sus subclases es instanciada  y lanzada. Cuando estamos escribiendo
código y deseamos lanzar una excepción, podemos crear una instancia de
una clase ya existente como pueden ser aquellas que pertenecen a la
plataforma Java, o podemos definir nuestra propia clase que represente
alguna excepción. Para ello, lo único que debemos realizar es definir una
nueva clase y que la misma extienda de la clase Exception.
Para ejemplificar este concepto, supongamos que en la aplicación anterior
en la cual se intenta realizar la división entre dos números enteros no
negativos definimos la siguiente clase que representa una excepción:
public class NumeroNegativoException extends Exception {
private String mensaje = "Se produjo un error debido a
que el número ingresado es un
número negativo";

public NumeroNegativoException() {
}

public NumeroNegativoException(String mensaje) {


this.mensaje = mensaje;

Programación Orientada a Objetos  – De las Heras, Sebastián | 57


http://slidepdf.com/reader/full/arreglos-string-polimorfismo-y-excepciones-en-java 57/62
7/26/2019 Arreglos String Polimorfismo y Excepciones en Java

public String getMensaje() {


return mensaje;
}

Esta excepción puede ser utilizada para representar un error cuando se


ingresa un número con valor negativo. De esta forma, en lugar de lanzar
una excepción de tipo  Exception como lo hacíamos anteriormente cuando
se ingresa un valor negativo, podemos modificar el código de la aplicación
para crear una excepción de tipo NumeroNegativoException y lanzarla.
int dividendo = Integer.parseInt(br.readLine());
if (dividendo < 0) {
NumeroNegativoException e = new
NumeroNegativoException("Dividendo
ingresado negativo!");

} throw e;

System.out.println("Ingrese un divisor entero");


int divisor = Integer.parseInt(br.readLine());
if (divisor < 0) {
NumeroNegativoException e = new
NumeroNegativoException("Divisor
ingresado negativo!");
throw e;

De esta forma,
excepción  con lapodemos
estructuracrear una clase
que a nosotros nos que represente
parezca alguna
más conveniente.

Programación Orientada a Objetos  – De las Heras, Sebastián | 58


http://slidepdf.com/reader/full/arreglos-string-polimorfismo-y-excepciones-en-java 58/62
7/26/2019 Arreglos String Polimorfismo y Excepciones en Java

4.9- Aplicaciones en Java


 Aplicación: Carga de salarios

La siguiente aplicación tiene por objetivo realizar la carga por teclado de


una determinada cantidad de salarios para luego mostrar los valores
ingresados y el promedio de los mismos. En la aplicación se hace uso de
arreglos y manejo de excepciones.

// Clase CargaSalarios

package salarios;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;

public class CargaSalarios {


private int[] salarios;
BufferedReader br;

private static int LIMITE_CANTIDAD_SALARIOS = 10;

public CargaSalarios() {
br = new BufferedReader(new
InputStreamReader(System.in));
}

public void cargarCantidadDeSalarios() throws IOException {


boolean pedirCargaDeDatos = true;
while (pedirCargaDeDatos) {
System.out.println("\nIngrese la cantidad de salarios
con la que desea operar (entre 1 y 10): ");
try {
int cantidadDeSalarios =
Integer.parseInt(br.readLine());
if (cantidadDeSalarios < 0 || cantidadDeSalarios >
LIMITE_CANTIDAD_SALARIOS) {
ValorIngresadoException ex = new
ValorIngresadoException("La cantidad de
salarios ingresada no es correcta. Debe
ser entre 1 y 10");
throw ex;
}
salarios = new int[cantidadDeSalarios];
pedirCargaDeDatos = false;
} catch (NumberFormatException ex) {
System.out.println("El valor ingresado no es un
número entero! Intente ingresar un
número entero.");
} catch (ValorIngresadoException ex) {
System.out.println("ValorIngresadoException: " +
ex.getMensaje());
}
}
}

Programación Orientada a Objetos  – De las Heras, Sebastián | 59


http://slidepdf.com/reader/full/arreglos-string-polimorfismo-y-excepciones-en-java 59/62
7/26/2019 Arreglos String Polimorfismo y Excepciones en Java

public void cargarSalarios() throws IOException {


for (int i=0 ; i<salarios.length ; i++) {
boolean pedirCargaDeDatos = true;
while (pedirCargaDeDatos) {
try {
System.out.print("Ingrese el valor del salario " +
(i+1)
int salarioIngresado = + ": ");
Integer.parseInt(br.readLine());
if (salarioIngresado < 0) {
ValorIngresadoException ex = new
ValorIngresadoException("El salario
ingresado no puede ser negativo!");
throw ex;
}
salarios[i] = salarioIngresado;
pedirCargaDeDatos = false;
} catch (NumberFormatException ex) {
System.out.println("El valor ingresado no es un

número entero!
un número Intente ingresar
entero.");
} catch (ValorIngresadoException ex) {
System.out.println("ValorIngresadoException: " +
ex.getMensaje());
}
}
}
}

public void mostrarSalarios() {


System.out.println("\nValores ingresados:");
for (int i=0 ; i<salarios.length ; i++) {
System.out.println("Valor salario " + (i+1) + ": " +
salarios[i]);
}
}

public void mostrarSalarioPromedio() {


int sumaSalarios = 0;
for (int i=0 ; i<salarios.length ; i++) {
sumaSalarios += salarios[i];
}
int salarioPromedio = sumaSalarios / salarios.length;
System.out.println("\nSalario promedio: " +
salarioPromedio);
}

public static void main(String[] args) {


CargaSalarios cs = new CargaSalarios();
try {
System.out.println("CARGA DE SALARIOS");
cs.cargarCantidadDeSalarios();
cs.cargarSalarios();
cs.mostrarSalarios();
cs.mostrarSalarioPromedio();
} catch (IOException e) {
System.out.println("Se produjo un error de tipo
IOException: " + e);
}
}
}

Programación Orientada a Objetos  – De las Heras, Sebastián | 60


http://slidepdf.com/reader/full/arreglos-string-polimorfismo-y-excepciones-en-java 60/62
7/26/2019 Arreglos String Polimorfismo y Excepciones en Java

// Clase ValorIngresadoException

package salarios;

public class ValorIngresadoException extends Exception {


private String mensaje = "El valor ingresado no es un valor
esperado!";

public ValorIngresadoException() {
}

public ValorIngresadoException(String mensaje) {


this.mensaje = mensaje;
}

public String getMensaje() {


return mensaje;
}

public void setMensaje(String mensaje) {


this.mensaje = mensaje;
}

Programación Orientada a Objetos  – De las Heras, Sebastián | 61


http://slidepdf.com/reader/full/arreglos-string-polimorfismo-y-excepciones-en-java 61/62
7/26/2019 Arreglos String Polimorfismo y Excepciones en Java

http://slidepdf.com/reader/full/arreglos-string-polimorfismo-y-excepciones-en-java 62/62

También podría gustarte