Mostrar Mensajes

Esta sección te permite ver todos los posts escritos por este usuario. Ten en cuenta que sólo puedes ver los posts escritos en zonas a las que tienes acceso en este momento.


Mensajes - Jorge lopez

Páginas: 1 2 3 4 [5] 6 7 8 9 10 ... 13
81
 Hola Cabanota!

Antes de comentar tu código, primero te aclaro dos puntos a tomar en cuenta en tus próximas publicaciones en los foros de aprenderaprogramar.com

1ro: Evita usar nombres de temas como: AYUDA!! o Error!! ext.. En su lugar, usa un nombre de tema descriptivo al problema con el cual necesitas ayuda, o descriptivo al error que estés presentando. En este caso debido a que necesitas ayuda con un ArrayList que no esta guardando los objetos como ha de esperarse, un tema descriptivo del problema podría ser: "Entrega CU00665B. Inconveniente al agregar un objeto a un ArrayList java." ext..

2do: Veo que has creado un nuevo tema https://www.aprenderaprogramar.com/foros/index.php?topic=1549.0 que mas bien podría ser una continuación en este mismo hilo (tema) Cuando actualices, mejores o corrijas un código que ya ayas publicado y que quieras publicar dicha actualización, mejora o corrección, es recomendable que lo hagas en un mismo hilo, con su comentario correspondiente, esto nos permite a todos los que leamos, una mejor asimilación del tema.

En cuanto al inconveniente que estas presentando, el problema (por una razón que aun no entiendo) en este caso lo esta generando el método nextLine(); de la clase Scanner, para "corregir" esto, sustituimos el método nextLine(); por el metodo next();

También te recomiendo cuidar tu ortografía para evitar cosas como escribir "en"  donde deberias escribir "el". El truco esta en leer y releer tu código en busca de estos "errores" en los cuales el compilador java no nos brinda apoyo  ;D

Otras sugerencias y comentarios los encontraras a modo de comentario en el siguiente código que he editado ligeramente a partir de tu código.

Clase TestListaNombres
Código: [Seleccionar]
import java.util.Scanner;
/**
 * Write a description of class TestListaNombres here.
 *
 * @author (your name)
 * @version (a version number or a date)
 */
public class TestListaNombres{
   
    public TestListaNombres(){
    }
   
    public static void main(String[] args){
        Scanner sc = new Scanner(System.in);
        ListaNombres listDeAmigos = new ListaNombres("Amigos");//Cambiamos el nombre de la variable "listDeNombres" por "listDeAmigos"
       
        System.out.print("¿Cuantos nombres desea ingresar?: ");
        int numIngresos = sc.nextInt();
       
        for(int i = 0; i < numIngresos; i++){
            System.out.print("Ingresas nombre numero " + (i+1) + ": ");
            listDeAmigos.addNombre(sc.next());/*Eliminamos la variable String "nom" y sustituimos el metodo nextLine(); por el metodo next(); el cual pasamos como
            parámetro en sustitución de la variable "nom"*/
        }
       
        System.out.println("\nEn estos momentos el tamaño de su lista de amigos es de: " + listDeAmigos.getTamaño());
       
        System.out.print(listDeAmigos.getListaDeNombres());
    }
}

clase ListaNombres
Código: [Seleccionar]
import java.util.Scanner;
import java.util.List;
import java.util.ArrayList;
/*En caso de no usar muchas clases de un pakage, es recomendable especificar la/s clase/s a usar y evitar una sintaxis como: import java.util.*; ya que con esta sintaxis
   cargamos todas las clases del pakage y con esto desperdiciamos recursos como memoria y tiempo de respuesta en nuestros programas.*/
/**
 * Write a description of class ListaNombres here.
 *
 * @author (your name)
 * @version (a version number or a date)
 */
public class ListaNombres{
    private String nombreDeLaLista;/*Con esta variable intentas darle un nombre a la lista, pero en realidad no haces uso de esta variable y tampoco es la forma
    correcta de hacer lo que pretendes, el nombre que le has asignado a esta colección es: "listaDeNombres" y en su lugar podrías asignarle como nombre "amigos"
    o "listaDeAmigos" ext.. pero no tratar de vincular una variable como nombre de la lista o coleccion. (te recomiendo eliminar esta variable)*/
    private List<String> listaDeNombres;
   
    public ListaNombres(String nombreDeLaLista){
        this.nombreDeLaLista = nombreDeLaLista;
        listaDeNombres = new ArrayList<String>();
    }
   
    public void addNombre(String nombre){
        listaDeNombres.add(nombre);
    }
   
    public String getNombreABuscar(int i){/*El nombre de este método no es adecuado, un método get o set debe de estar relacionado a una variable de la clase para
        reasignar un valor (en caso de set) o devolver un valor (en caso de get) de x variable. Un nombre adecuado podria ser: buscarNombre(int i); ext..*/
        if(i >= 0 && i < listaDeNombres.size()){
            return listaDeNombres.get(i);
        }else{
            return "No se encuentra el nombre";
        }
    }
   
    public int getTamaño(){//Un nombre mas adecuado podría ser: obtenerTamaño(); tamañoListaDeNombres(); ext..
        return listaDeNombres.size();
    }
   
    public void removerNombre(int i){
        if(i >= 0 && i < listaDeNombres.size()){
            listaDeNombres.remove(i);
        }else{
            System.out.println("Este nombre no existe.");
        }
    }
   
    public List<String> getListaDeNombres(){
        return listaDeNombres;
    }
}

Saludos!

82
Aprender a programar desde cero / Re:System.out.println();
« en: 31 de Octubre 2014, 03:31 »
 Hola Fernando!

Claro que existe un código para que la instrucción System.out.println(); imprima por pantalla tantas lineas como tu desees . Podrías valerte de un bucle para lograr esto, si no tienes conocimientos sobre bucles en java, aquí https://www.aprenderaprogramar.com/index.php?option=com_content&view=article&id=624:tipos-de-bucles-java-bucle-for-operadores-y-sentencia-break-ejemplo-ejercicio-resuelto-cu00658b&catid=68:curso-aprender-programacion-java-desde-cero&Itemid=188 podrás relacionarte con el tema.

Saludos!

83
 A continuación comento tu ejercicio.

Clase SalonCasa: variables, valores iniciales, nombres de métodos, todo correcto.

Clase CocinaCasa: todo correcto.

Clase Casa: Aunque podría ser aceptable, algunos puntos referentes a los metodos setters y getters para los atributos tipo objeto merecen ser comentados.

El nombre del metodo setSalonCasa, no es apropiado. El nombre de un método set o get, ha de ser una combinacion del prefijo "set" o "get" + exactamente el nombre de la variable asociada a este, por ejemplo puesto que la variable relacionada a este método es la variable "salon" un nombre correcto seria setSalon, si el nombre de la variable fuera "salonCasa" pues el nombre que has utilizado seria perfecto. Lo mismo para los métodos getters de los campos (variables) tipo objeto.

Por otra parte, en los métodos setters de los campos tipo objeto es preferible eliminar la siguiente linea de codigo:
Código: [Seleccionar]
salon = new SalonCasa(); (Lo mismo para el metodo set de la variable "cocina") debido a que ya a la variable "salon" se le a asignado un objeto tipo SalonCasa en el constructor de la clase "Casa" y es sobre este objeto que realizaremos los cambios deseados.

Para realizar cambios en este objeto tenemos varias opciones, por ejemplo invocar los métodos setter de los objetos pasandoles como parámetros los valores deseados, o definir en la clase Casa los métodos setters de los campos tipo objeto para que reciban como parámetro un objeto del tipo necesario. Tu tienes una combinación de estas dos opciones donde por ejemplo invocas sobre el campo "salon" métodos (setNumeroDeTvs() y setTipoSalon()) propios de la clase SalonCasa, y usas los valores de un objeto introducido como parámetro del método setSalonCasa
(de la clase Casa) para pasarlos como valores de parámetros en los métodos setNumeroDeTvs() y setTipoSalon() invocados sobre la variable "salon".  Esto se podría decir que es complicado y confuso a la ves.

Algo mas sencillo y eficiente seria definir tu método setSalonCasa así:
Código: [Seleccionar]
public void setSalonCasa(SalonCasa valorSalonCasa)
    {
        Salon = valorSalonCasa;
    }
Donde si creas constructores que reciban parámetros en las clases SalonCasa y CocinaCasa, pues notarias el gran potencial de este tipo de signatura.

Digamos que en la clase SalonCasa tienes el siguiente constructor con parámetros:
Código: [Seleccionar]
//Constructor con parámetros
    public SalonCasa(int valorNumeroDeTvs, String valorTipoSalon){
      numeroDeTvs = valorNumeroDeTvs;
      tipoSalon = valorTipoSalon;
    }
Ahora digamos que creas un objeto de la clase Casa, y que invocas el método
setSalonCasa(SalonCasa valorSalonCasa); donde al invocarlo escribirás como valor de campo:
Código: [Seleccionar]
new SalonCasa(10, "Salon de video juegos"); ahora consulta el valor del campo "salon" y el contenido del objeto que contiene. notas algún cambio?

Sobre tu duda:
Citar
Donde "salonCasa (tipo SalonCasa) y cocina (tipo CocinaCasa)... tienen los perentesis y al igual yo los agregue pero al momento que intentaba compilar me enviaba un error, se deben de poner los paréntesis o solo era para diferenciar lo que se debia colocar...  me confundi un poco.
Es tal y como comenta Fernando, lo que esta dentro de los paréntesis es algo que se supone no debería de ser escrito porque deberias de deducirlo, (pero se escribe para mayor claridad) por eso se pone entre paréntesis, y hace referencia al tipo de la variable.

Sobre lo que comentas:
Citar
Entrego mi ejercicio, seré sincero probe mi ejercicio pero aun no entiendo muy bien si lo que hace esta correcto. Por alguna razon quede bloqueado y no termino de entender la verdadera funcion de las clases que utilizan otras clases en este ejercicio. Si me pudieran decir si lo que hice esta bien ó si me hace falta alguna cosa, cualquier comentario que pueda retroalimentar mi ejercicio.
Hay muchas cosas que las entenderás a su debido tiempo, cosas como por ejemplo: para que una clase utiliza a otra clase? yo podría ponerme a escribir y explicarte para que o porque unas clases utilizan a otras clases, pero algunas respuestas es mejor darlas en su momento oportuno para evitar confusiones, conforme avances en el curso tu mismo seras capas de responderte, por ahora lo importante es que asimiles lo que haces y que continúes avanzando.

Saludos!

84
Hola KillerNemesis!

Estoy verificando tu ejercicio, en breve te comento referente a posibles mejoras!

85
 Hola Susana83!

Al parecer este "error" en tiempo de ejecución lo esta generando el método nextLine(); de la clase Scanner. A continuación dejo tu código editado y comentado en los puntos editados, y por su puesto, también he corregido el error.
Código: [Seleccionar]
import java.util.Scanner;
import java.util.Arrays;
public class Test1
{
    private static final Scanner in = new Scanner(System.in);
    public static void main(String[] args)
    {
        System.out.print("Indique la cantidad de nombres que contendrá el vector: ");
        int n1 = lerTamanho();
        String[] vec1 = new String [n1];
        Arrays.fill(vec1, "default");
        System.out.println("\nContenido inicial del vector:\n");
        for(String obj: vec1)//Mostramos el contenido del vector rellenado por el método fill(Object[] a, Object val); con el (nombre) String "default"
        {
          System.out.println(obj);
        }
        System.out.println("");
        System.out.println("Por favor indique a continuacion los " + vec1.length + " nombres que contendra el vector:\n");
        readVector(vec1);
        System.out.println("\nContenido actual del vector:\n");
        for(int i = 0; i < vec1.length; i++)/*Usamos un for tradicional en ves de un for-each, puesto que el for tradicional incluye un contador o indice (i) el cual
        usamos para enumerar los nombres*/
        {
          String obj = vec1[i];
          System.out.println("Nombre " + (i+1) + ": " + obj);
        }
    }

    private static int lerTamanho()
    {
        int num = in.nextInt();
        while (num <= 0)
        {
            System.out.print("Error! Indique un numero mayor que 0: ");
            num=in.nextInt();
        }
        return num;
    }

    private static void readVector(String vec[]) {
        int cont=0;
        String s;
        do 
        { 
            System.out.print("Nombre " + (cont + 1) + ": ");
            s=in.next();/*El problema de repeticion (Nombre: Nombre:) lo estaba generando el metodo nextLine(); el cual fue sustituido por el metodo next();
            de la clase Scanner*/
            if (validate(s,vec))
            {
                vec[cont]=s;
                cont++;
            } else {
                System.out.println("Ese nombre ya existe, intente con un nombre diferente!");
            }
        } while (cont<vec.length);
    }

    private static boolean validate(String s, String vec[])
    {
        boolean success=false;
        for (int i=0; i<vec.length; i++)
        {
            if (vec[i].equalsIgnoreCase(s))
            {
                return success;
            }
        }
        return !success;
    }
}

Saludos!

86
 Creo que tienes una idea la cual no estas planteando correctamente, intentare hacerte una aclaración para que reconsideres la forma de plantear tu problema.

 Una de las maravillas de la programación es que puedes representar una cosa o situación de la vida real en código, por ejemplo podemos crear un objeto (código) que represente una persona y este objeto podría tener desde un nombre, apellido, edad, ext... hasta un tipo de sangre, ritmo cardíaco,  estado emocional, ext... entre muchas otras cosas que tiene o podría tener una persona real. Pero así como en la vida real existen limitaciones así mismo existen limitaciones (cosas que no pueden ser "por el momento") en la programación, por ejemplo no es posible que en la vida real una persona pueda vivir debajo del agua sin tomar oxigeno, en programación (java) no es posible usar un numero como nombre de variable para contener un valor boleano ni para contener ningún otro tipo de valor, por lo tanto decir
Código: [Seleccionar]
boolean 1 = false; es incorrecto (no es posible) a diferencia de decir
Código: [Seleccionar]
boolean x1 = false; que si es posible. Simplemente un numero no puede ser una variable que contendría o apuntaría a un valor u objeto, a menos que tal numero lleve una letra ante puesta como en el segundo caso.

Es normal que aveces nos compliquemos la vida a la hora de diseñar un código, pero debemos de ser capaces de poder analizar un código y corregir sus deficiencias. Un código corto claro y limpio siempre sera preferido ante un código largo (muchas lineas de código) y confuso, aun cuando ambos códigos realicen la misma funcion. Por tanto, si una linea de código o variable no es del todo necesaria en un código es preferible no incluirla.

En tu anterior código creaste la variable boleana "alquilar" (la cual mantuve en el código respuesta que plantee, para mantener tu idea ) para controlar cuando un auto estaría disponible y cuando estaría alquilado, tomando en cuenta que el usuario elige uno de los tres autos disponibles y que el elegido por el usuario pasaría a la lista de alquilados, pues se podría decir que la variable "alquilar" esta demás y que esta a su ves genera mas código "innecesario". Elimina la variable "alquilar" y sustituye el fragmento de código correspondiente, por el siguiente fragmento de código en el código de la anterior clase AlquilarAuto:
Código: [Seleccionar]
while(it.hasNext())
    {
      String tmpAutDisp = it.next();     
      if(alquilado.equals(tmpAutDisp))
      {
        autoAlquilado[0] = tmpAutDisp;
        it.remove();   
      }
    }
Si te fijas, obtenemos el mismo resultado con menos código.

Respondiendo a tu duda:
Citar
Otra dudita, supongamos que tengo la variable boolean x, y que 1 2 3 son false y 4 5 6 son true, como muestro por un lado los valores true en un lista y por otro los false?
Tendria que quedar asi:

Valores true:
4
5
6
Valores false:
1
2
3

Solución que propongo: Olvida la variable boleana x, crea dos vectores (Valores true, Valores false), arreglos o colecciones diferentes, crea tareas para que los elementos del vector "Valores true" puedan ser eliminados y/o movidos al vector "Valores false" según los criterios definidos en un condicional if. Usa los recursos que creas convenientes para recorrer los elementos de cada vector y mostrarlos por pantalla.

Una ves mas, podrías tomar el siguiente código como material de apoyo.

Clase AlquilarAuto ligeramente modificada:
Código: [Seleccionar]
import java.util.Scanner;
import java.util.Collection;//Importamos la clase padre de todas las colecciones, para asignar como tipo dinamico "Collection" a la coleccion (ArrayList) "listaAutDisp".
import java.util.ArrayList;//Importamos la clase ArrayList para copiar los elementos contenidos en el vector "autoDisponible" en una colección de tipo Arraylist.
import java.util.Iterator;//Importamos esta clase para poder recorrer la colección listaAutDisp al mismo tiempo que la manipulamos (borramos elementos en esta)
public class AlquilarAuto
 {
  public static void main(String[]args)
  {
Scanner teclado=new Scanner(System.in);
    String[ ] autoDisponible = new String[3];
    String[ ] autoAlquilado = new String[1];//En este vector sera copiado el elemento eliminado en la coleccion "autoDisponible"
    for(int x=0;x<autoDisponible.length;x++){//En vez de indicar "3" invocamos el metodo length (sin parentecis) sobre el vector autoDisponible, que devuelve su tama?o
        System.out.print("ingreso de modelos ");        //INGRESO DE DATOS AL VECTOR
        autoDisponible[x]=teclado.next();
    }
    Collection<String> listaAutDisp = new ArrayList<String>();/*Aquí usaremos un tipo "Collection" puesto que al vector autosDisponibles no se le puede aplicar
    el metodo iterator();*/
    for(String obj: autoDisponible)//Rellenamos la coleccion "listaAutDisp" copiando los elementos del vector "autosDisponibles" en esta.
    {
      listaAutDisp.add(obj);
    }
    Iterator<String> it = listaAutDisp.iterator();//Creamos una Copia de "listaAutDisp" que nos permitirá recorrer y manipular la colección "listaAutDisp"
    System.out.print("\fCual de los siguientes autos desea alquilar?\n\n");
    for(String obj: listaAutDisp)
    {
      if(obj != null)
      {
        System.out.println(" " + obj); 
      }     
    }
    System.out.println("");
    String alquilado;
    alquilado = teclado.next();   
    System.out.print("\fAutos disponibles:\n\n");
    while(it.hasNext())
    {
      String tmpAutDisp = it.next();     
      if(alquilado.equals(tmpAutDisp))
      {
        autoAlquilado[0] = tmpAutDisp;
        it.remove();
        tmpAutDisp = null;   
      }
      if(tmpAutDisp != null)
      {
        System.out.println(" " + tmpAutDisp);//Aprovecho el bucle while para mostrar los autos disponibles (reutilizar de código) y evito tener que usar otro bucle.
      }
    }
    System.out.print("\nAuto alquilado:\n\n");
    for(String obj: autoAlquilado)
    {     
      System.out.println(" " +  obj);   
    }
  }
}

Espero que tus dudas queden claras.

Saludos!

87
 Hola  Browwwnnn!

A continuación te dejo mi propuesta como solución al problema que planteas, he tratado de mantener tu idea y he diseñado un código el cual puede ser mejorado, con el fin de que lo edites basándote en un analisis de este.

Por ejemplo, como solucionarías si el problema es que luego de rentar un vehículo y mostrar las dos listas, pues el cliente quiere rentar otro vehículo?  donde tendrías que mostrar un auto disponible y dos alquilados, o mayor aun, que el cliente rente la cantidad de vehículos que el quiera uno a uno y que se vallan actualizando las listas, donde existe la posibilidad de que la lista con autos disponibles se quede vacía (sin autos disponibles).

Pos data: Espero que mi código se acoja a tus expectativas.

Si tienes cualquier duda, no dudes en preguntar.

Saludos! 
Código: [Seleccionar]
import java.util.Scanner;
import java.util.Collection;//Importamos la clase padre de todas las colecciones, para asignar como tipo dinamico "Collection" a la coleccion (ArrayList) "listaAutDisp".
import java.util.ArrayList;//Importamos la clase ArrayList para copiar los elementos contenidos en el vector "autoDisponible" en una colección de tipo Arraylist.
import java.util.Iterator;//Importamos esta clase para poder recorrer la colección listaAutDisp al mismo tiempo que la manipulamos (borramos elementos en esta)
public class AlquilarAuto
 {
  public static void main(String[]args)
  {
Scanner teclado=new Scanner(System.in);
    boolean alquilar = false;
    String[ ] autoDisponible = new String[3];
    String[ ] autoAlquilado = new String[1];//En este vector sera copiado el elemento eliminado en la coleccion "autoDisponible"
    for(int x=0;x<autoDisponible.length;x++){//En vez de indicar "3" invocamos el metodo length (sin parentecis) sobre el vector autoDisponible, que devuelve su tama?o
        System.out.print("ingreso de modelos ");        //INGRESO DE DATOS AL VECTOR
        autoDisponible[x]=teclado.next();
    }
    Collection<String> listaAutDisp = new ArrayList<String>();/*Aquí usaremos un tipo "Collection" puesto que al vector autosDisponibles no se le puede aplicar
    el metodo iterator();*/
    for(String obj: autoDisponible)//Rellenamos la coleccion "listaAutDisp" copiando los elementos del vector "autosDisponibles" en esta.
    {
      listaAutDisp.add(obj);
    }
    Iterator<String> it = listaAutDisp.iterator();//Creamos una Copia de "listaAutDisp" que nos permitirá recorrer y manipular la colección "listaAutDisp"
    System.out.print("\fCual de los siguientes autos desea alquilar?\n\n");
    for(String obj: listaAutDisp)
    {
      if(obj != null)
      {
        System.out.println(" " + obj); 
      }     
    }
    System.out.println("");
    String alquilado;
    alquilado = teclado.next();
    while(it.hasNext())
    {
      String tmpAutDisp = it.next();     
      if(alquilado.equals(tmpAutDisp))
      {
        alquilar = true;
        if(alquilar)
        {
          autoAlquilado[0] = tmpAutDisp;
          it.remove();
        }
      }
    }
    System.out.print("\fAutos disponibles:\n\n");
    for(String obj: listaAutDisp)
    {
      if(obj != null)
      {
        System.out.println(" " + obj); 
      }     
    }
    System.out.print("\nAuto alquilado:\n\n");
    for(String obj: autoAlquilado)
    {     
      System.out.println(" " +  obj);   
    }
  }
}


88
 Hola  BashMind!

Antes que nada te pongo en conocimiento que cuando vayas a introducir código en el foro, antes presiona el botón # (insertar codigo) que se encuentra arriba del campo de escritura, te saldrán las siguientes etiquetas: [code][/code] y a continuación procede a pegar el codigo en medio de esas etiquetas. Ejemplo: [code]aquíElCódigo ...[/cod]. Una vez escrito todo, pulsa el botón previsualizar para comprobar si se ve bien y pulsa publicar cuando estés conforme según la previsualizacion.

Respecto a tu ejercicio:

1ro: El código que has presentado no compila, debido a la falta de la llave (}) de cierre de la clase, me he tomado la libertad de corregir esto agregando dicha llave y a su vez te aconsejo que siempre te asegures de que estas copiando el código de una clase correctamente, así evitas este error en tus futuras publicaciones.

2do: El nombre de tu clase no es adecuado, el nombre de una clase dice lo que es o lo que hace el nombre que le das (IngreseCadena) se correspondería mas con un mensaje mostrado por pantalla (System.out.println("Ingrese cadena"); ) para pedir al usuario que ingrese una cadena de texto. Un nombre correcto para esta clase podria ser public class AnalizadorDeCadena puesto que con un nombre como este, quien lee el nombre de la clase puede deducir que hace la clase, recibe una cadena y analiza si es menor de 5 caracteres, entre 5 y 15 caracteres o si es mayor de 15 caracteres y también analiza si la cadena comienza por la letra "a"  o no. El punto es que el nombre de una clase debe de ser descriptivo de lo que es o lo que hace.

3ro: Tu código presenta una deficiencia, por ejemplo si le pasamos como cadena el String "Hola" este devuelve por pantalla:
Citar
La cadena introducida tiene menos de 5 caracteres
y no comienza con H
donde hay dos puntos a tomar en cuenta, 1ro: dice que NO comienza con la letra "H" cuando se observa que si comienza con la letra "H". y 2do: Que usas dos instrucciones System.out.println(); para mostrar un mensaje por pantalla que se debería de mostrar solo haciendo uso de una sola instrucción System.out.println();

4to: En tu código haces uso un if por cada situación, te recomendaría usar un if seguido de los else if necesarios para así aumentar la eficiencia del código.

En conclusión te recomendaría que mires algunas respuestas de este ejercicio a fin de que analices y replantees este ejercicio usando como apoyo el analisis del código de algunos compañeros en este hilo y corrigiendo los puntos ya comentados.

Saludos!  ;)

89
 Hola Susana83!

El error en java java.lang.NullPointerException
nos indica que estamos intentando realizar una tarea con una variable cuyo valor es "null"
(nulo, sin valor asignado, ext..) y que el jvm (java virtual machine) al ejecutar el programa espera encontrar en dicha variable un valor diferente a "null" por tal motivo cuando en tiempo de ejecución el jvm se encuentra con un valor "null" en vez de un valor esperado, pues lanza este error: java.lang.NullPointerException.

Este es un error muy frecuente principalmente entre nuevos programadores, y este error puede surgir a raíz de diferentes situaciones, como por ejemplo: Cuando definimos una variable tipo objeto pero no la inicializamos, o por ejemplo cuando declaramos un vector he intentamos recorrer su contenido sin antes a ver rellenado dicho vector,
(que por cierto este ultimo es tu caso) y a estos dos casos los cuales para mi son los mas comunes se podrían sumar otros casos mas.

Que hacer ante un error de tipo java.lang.NullPointerException? Lo primero que debemos de hacer es identificar la variable asociada a tal error, en bluej esto nos resulta un tanto "sencillo" puesto que bluej resalta en amarillo la linea de código donde interviene dicha variable. Una vez identificamos la variable pues procedemos a hacer que esta deje de referenciar a un objeto o valor "null" Como? pues asignándole un valor, y lógicamente dicho valor tiene que coincidir con el tipo de variable.

En tu código el error se encuentra en el siguiente fragmento de código:
Código: [Seleccionar]
private static boolean validate(String s, String vec[]) {
    boolean success=true;
    for (int i=0; i<vec.length; i++) {
        if (vec[i].equalsIgnoreCase(s)) {
            return !success;
        }
    }
    return success;
}
Donde por parámetros se deben introducir un String y un vector de String, hasta aquí todo esta bien, el problema surge en esta linea:
Código: [Seleccionar]
if (vec[i].equalsIgnoreCase(s)) { donde nunca se cumplirá esta condición porque el vector "vec" no contiene elementos (su valor contenido es null) por tanto tampoco contiene el valor de "s".

Una posible solución seria que asignes un valor (rellenar el vector vec) según lo necesario para que tu programa responda como esperas.

Espero que desde ahora puedas dominar un java.lang.NullPointerException. Y por supuesto, si tienes alguna duda no dudes en preguntar.

Saludos!

90
 Hola Monroe!

Respecto a tu duda:
Citar
cuando se usa set para definir la variable tiene que ir seguida de la primera letra mayuscula?
Ejemplo: public void setAutor(String valorAutor)
Lo correcto seria preguntar algo mas o menos asi: Cuando se usa un metodo set para asignar o reasignar el valor de una variable, este tiene que ir seguida de la primera letra mayúscula?  La respuesta es SI.

Una variable es definida por un tipo, ejemp: String titulo; Hasta aqui tenemos una variable definida del tipo String, luego en el constructor de la clase se asigna el valor inicial de dicha variable (inicializar variable/s) normalmente a cada variable se le signa su valor por defecto, cosa que has hecho correctamente en este ejercicio a excepción de la variable digital, cuyo valor inicial le has asignado "true", normalmente los valores de variables boleanas (boolean) han de ser "false" inicialmente. Siguiendo con tu duda, has puesto un ejemplo (public void setAutor(String valorAutor) totalmente correcto, Esto no es obligatorio para el correcto funcionamiento del codigo pero se concidera una buena practica entre programadores, donde a su vez respetas una regla o convenio entre programadores. Esta es la regla o estilo camelCase, exactamente su variación lowerCamelCase http://es.wikipedia.org/wiki/CamelCase donde se usan palabras o frases compuestas, y donde la primera palabra (en este caso la palabra set) se escribe en letras minúsculas y cada primera letra de las posibles siguientes palabras se escriben en mayúsculas. Ejemplo:
public void setNumeroDeCanciones. Esta regla se aplica tanto a nombres de metodos como a nombres de variables. Para nombre/s de clase/s se usa la variación "UpperCamelCase": La primera letra de cada una de las palabras es mayúscula. Ejemplo: public class EjemploDeUpperCamelCase.

En fin, tu ejercicio es correcto y puedes continuar adelante ;).

Saludos!

91
 Hola  ZSCFCP!

Estuve mirando tu código y me parece un buen trabajo, (aunque mejorable) importas las clases necesarias, creas he inicializas variables correctamente y me pareció muy oportuno el uso del método descendingIterator(); de la clase TreeSet, para devolver por pantalla los objetos tipo Integer exactamente en el orden en que los pide el enunciado del ejercicio.

Te hago los siguientes comentarios enfocados en la mejoría de tu código (que no esta mal)

En java, cosas como:
Código: [Seleccionar]
int primitivo = 10;
Integer objeto = primitivo;
Son posibles gracias a los procesos automáticos propios del compilador java "Boxing" y "UnBoxing" lo que podríamos traducir como "envuelto" (referente a un tipo objeto) y "suelto o desenvuelto" (referente a un tipo primitivo). En tu codigo podemos encontrar el siguiente fragmento de código:
Código: [Seleccionar]
contenedorDeNumeros.add(new Integer(2)); el cual podemos sustituir de forma mas sencilla por una sintaxis como:
Código: [Seleccionar]
contenedorDeNumeros.add(2); donde se esta agregando un tipo primitivo, pero el compilador lo envuelve automáticamente (Boxing) debido a que la colección contenedorDeNumeros solo admite tipos Integer.

Referente a las variables de tipo String "coma" y "punto", si te fijas el uso que le das a estas genera un error lógico, puesto que por pantalla se muestra algo no muy apropiado. Para corregir esto, cree la variable tipo String "comaOPunto" cuyo valor estará sujeto a un condicional if, en conjunto de un contador tipo int y del metodo size() aplicado de las colecciones "contenedorDeCadenas" y "contenedorDeNumeros".

También sustituí el método getName(); por el método getSimpleName(); para mayor claridad en lo que se muestra por pantalla, puesto que este solo devuelve el nombre de la clase (ejemp: TreeSet) y no la ruta de la clase
(ejemp: java.util.TreeSet) como lo hace el método getName();

A continuación dejo tu código editado. Trate de no variar mucho tu código, para mantener tu idea.
Código: [Seleccionar]
import java.util.Set;
import java.util.List;
import java.util.ArrayList;
import java.util.HashSet;
import java.util.TreeSet;
import java.util.Iterator;

public class Polimorfismo
{
    public static void main(String [] args )
    {
        //DECLARACION ATRIBUTOS.
        List<Set> miLista                  = new ArrayList<Set>();
        Set<Integer>   contenedorDeNumeros = new TreeSet<Integer>();
        Set<String>    contenedorDeCadenas = new HashSet<String>();
        //RELLENO DE LOS 2 SETS.
        //Usamos Una forma mas sencilla de agregar los objetos tipo Integer gracias al proceso automatico que realiza el compilador conocido como "Boxing"
        contenedorDeNumeros.add(2);
        contenedorDeNumeros.add(8);
        contenedorDeNumeros.add(5);       
        contenedorDeCadenas.add("sol");
        contenedorDeCadenas.add("luna");
        contenedorDeCadenas.add("saturno");
        //CARGA DE LOS SETS DENTRO DEL ARRAYLIST.
        miLista.add(contenedorDeCadenas);
        miLista.add(contenedorDeNumeros);
        //CREACION DE ITERACIONES Y ELEMENTOS AUXILIARES.
        Iterator<Set> it1 = miLista.iterator();
        Iterator      it2 = null;
        Set           tmpSet;
        Object        tmpObj;
        String        comaOPunto = "";       
        while (it1.hasNext())
        {
            tmpSet = it1.next();
            int i = 1;//Contador que se utilizara para controlar el valor de la variable tipo String comaOPunto
            /** Discriminar tipo de datos en ArrayList para mostrar su contenido */
            // en caso de que la clase instanciada sea un Hashset.
            if (tmpSet instanceof HashSet) /*Se reduce la sintaxis y se mantiene la misma eficiencia, al sustituir "tmpSet instanceof java.util.HashSet" por
            "tmpSet instanceof HashSet"*/
            {
                System.out.println ("\nEl objeto leido del ArrayList es del tipo: " +
                tmpSet.getClass().getSimpleName() + //Se sustituye el metodo getName(); por el metodo getSimpleName();
                " y contiene los elementos: \n");
                it2 = tmpSet.iterator();
            }
            // en caso de que la clase instanciada sea un TreeSet, en este caso tenemos que ordenar el iterador descendentemente.
            else if (tmpSet instanceof TreeSet)
            {
                System.out.println ("\n\nEl objeto leido del ArrayList es del tipo: " + tmpSet.getClass().getSimpleName() + " y contiene los elementos: \n");
                TreeSet tmpTS = (TreeSet)tmpSet;
                it2 = tmpTS.descendingIterator();
            }
            while (it2.hasNext())
            {               
                tmpObj= it2.next();
                if (i < tmpSet.size()) {comaOPunto = ", ";}else{comaOPunto = ".";}               
                System.out.print (tmpObj+comaOPunto);
                i++;
            }
            i = 1;
        }
    }
}
Espero que encuentres algo util.

Saludos!

92
Aprender a programar desde cero / Re:CU00686B
« en: 17 de Octubre 2014, 02:00 »
 Hola de nuevo momo!

El objetivo de cada ejercicio es implementar lo que se a aprendido en la unidad correspondiente a cada ejercicio, y si lo complementamos con los conocimientos previamente adquiridos en unidades y ejercicios anteriores pues mucho mejor.

El objetivo en este ejercicio es aprovechar las ventajas que tenemos cuando una clase hereda de otra clase, puesto que en esta entrega estamos trabajando con lo que es la herencia (extends).

Este ejercicio pide crear tres objetos de los de los tipos ProductoFresco, ProductoRefrigerado y ProductoCongelado, (uno de cada tipo) y mostrar la información de cada objeto, por pantalla.

Tu has decidido que el usuario elija el producto que desea y también que este indique los valores de los campos de dicho objeto, esto se considera una variación en el ejercicio, la cual es aceptable siempre y cuando se mantenga en lo que es el objetivo del ejercicio. Yo podría decir que tu variación de ejercicio es aceptable de cara a tu intención, la cual es al fin y al cabo mostrar la información del o los objetos (ya que usas un bucle para repetir si se desea) por pantalla. Ahora bien, hay unos cuantos puntos a comentar y que te comento a continuación:

Clase Productos: El nombre de la clase no es adecuado por razones que ya te he comentado en este hilo: https://www.aprenderaprogramar.com/foros/index.php?topic=1479.0 (no usar plural)

Por otra parte no has creado el método que se encargaría de mostrar la información de un objeto tipo Productos, lo que restara eficiencia al programa y mas adelante veras porque.

Clase ProductoFresco: En el constructor con parámetros de esta clase, solo has declarado dos parámetro pertenecientes a las variables que esta clase hereda de su super clase. No es que este mal, pero seria mas recomendable que cuente con los parámetros necesarios para inicializar los valores de las variables que esta hereda de su super clase + los parámetros que inicializarian el valor de sus variables propias (4 parámetros) Idem para las clases "ProductoRefrigerado" y "ProductoCongelado"

Aquí ya nos comienza a hacer falta el método que mostraría la información de un objeto tipo Productos, supongamos que en tu clase Productos disponemos de un método "verDatosProductos()" que muestra los datos de un objeto tipo Productos. Esto nos seria util para diseñar de manera mas eficiente el método que muestra los datos en esta clase, (ProductoFresco) así sustituiríamos la fracción de código:
Código: [Seleccionar]
public void mostrarProductoFresco()
    {
        System.out.println("Fecha de Envasado :"+getFechaEnvasado()+"\n"+"Fecha Caducidad :"+getFechaCaducidad()+"\n"+"Numero de Lote :"+
        getNumeroLote()+"\n"+"Pais Origen :"+getPaisOrigen());   
    }
por:
Código: [Seleccionar]
public void mostrarProductoFresco()
    {
        super.verDatosProductos();
        System.out.println("Fecha de Envasado :"+getFechaEnvasado()+"\n"+"Pais Origen :"+getPaisOrigen());   
    }
Idem para las clases "ProductoRefrigerado" y "ProductoCongelado".

Clase ProductoRefrigerado: Lo mismo que la clase "ProductoFresco".

Clase ProductoCongelado: Lo mismo que la clase "ProductoFresco".

Clase ProductosAgroAlimentario Una sentencia como: "import java.util.*;" mayor mente es buena usarla si vamos a utilizar la gran mayoría de las clases que contenga este package, en tu caso solo usas la clase Scanner del package util y estas cargando todas las demás clases de este package (y te puedo decir que son muchas) sin necesidad y mal gastando recursos como memoria.

En una clase con el método main, pueden coexistir otros métodos a parte del metodo main, cuyo objetivo serian servir al método main, en tu clase se puede observar un método main muy cargado al cual se les pueden hacer muchas mejoras. Por ejemplo en tu clase con main yo he creado un metodo "entradaTeclado()" el cual es utilizado por el método main, fíjate en todas las lineas de codigo que nos hemos ahorrado solo con crear y usar ese metodo.

Hay algunos conceptos que debemos tener presentes siempre a la hora de diseñar un codigo, uno de estos es el concepto de reutilizar codigo, con esto lo que se busca es hacer algo utilizando un mismo recurso varias veces siempre y cuando se pueda, antes de crear mas recursos, por ejemplo lo que aquí haces con 4 lineas:
Código: [Seleccionar]
System.out.println("Menu  Productos de Empresa Agropecuaria ");
            System.out.println("1. Producto Frescos");
            System.out.println("2. Productos Refrigerados");
            System.out.println("3. Productos Congelados");
Aqui lo hacemos con una:
Código: [Seleccionar]
System.out.println("Menu  Productos de Empresa Agropecuaria\n1. Producto Frescos\n2. Productos Refrigerados\n3. Productos Congelados");
Tu codigo da la opción al usuario de continuar o salir del bucle, "s/n" pero igual sale si le pasamos una "s" mayúscula, para solucionar esto usamos el método "equalsIgnoreCase()":
Código: [Seleccionar]
if(entrada.equalsIgnoreCase("s"))
            {
                volver=true;
            }else{volver=false;}
Para concluir, tu codigo tiene muchas cosas mas que comentar y mejorar, yo he hecho unas ligeras mejoras en dos de las clases para que las analices:
Código: [Seleccionar]
/*Se plantea desarrollar un programa Java que permita la gestión de una empresa agroalimentaria
 * que trabaja con tres tipos de productos: productos frescos, productos refrigerados y productos
 * congelados. Todos los productos llevan esta información común: fecha de caducidad y número de lote.
 * A su vez, cada tipo de producto lleva alguna información específica. Los productos frescos deben
 * llevar la fecha de envasado y el país de origen. Los productos refrigerados deben llevar el código
 * del organismo de supervisión alimentaria. Los productos congelados deben llevar la temperatura de
 * congelación recomendada. Crear el código de las clases Java implementando una relación de herencia
 * desde la superclase Producto hasta las subclases ProductoFresco, ProductoRefrigerado y
 * ProductoCongelado. Cada clase debe disponer de constructor y permitir establecer (set)
 * y recuperar (get) el valor de sus atributos y tener un método que permita mostrar la información
 * del objeto. Crear una clase testHerencia2 con el método main donde se cree un objeto de cada tipo
 * y se muestren los datos de cada uno de los objetos creados.

Puedes comprobar si tu respuesta es correcta consultando en los foros aprenderaprogramar.com.

 
   
   */

 public class Producto
 {
     private String fechaCaducidad;
     private int numeroLote;
   
     public Producto(String valorFechaCaducidad,int valorNumeroLote)
    {
        fechaCaducidad=valorFechaCaducidad;
        numeroLote=valorNumeroLote;
   
    }
    public Productos()
    {
        fechaCaducidad="";
        numeroLote=0;
    }
    public void setFechaCaducidad(String valorFechaCaducidad)
    {
        fechaCaducidad=valorFechaCaducidad;
    }
    public void setNumeroLote(int valorNumeroLote)
    {
        numeroLote=valorNumeroLote;
    }
   
    public void verDatosProductos()
    {
      System.out.println("Fecha de caducidad: " + fechaCaducidad + "\nNumero de lote: " + numeroLote);
    }
    public String getFechaCaducidad(){return fechaCaducidad;}
    public int getNumeroLote(){return numeroLote;}
 }

Código: [Seleccionar]
import java.util.Scanner;
public class ProductosAgroAlimentario
{
    public static void main(String []args)
    {
        boolean volver=true;
        do{
            ProductoFresco productoFresco=new ProductoFresco();
            ProductoRefrigerado productoRefrigerado=new ProductoRefrigerado();
            ProductoCongelado productoCongelado=new ProductoCongelado();
       
            System.out.println("Menu  Productos de Empresa Agropecuaria\n1. Producto Frescos\n2. Productos Refrigerados\n3. Productos Congelados");
            String entrada=entradaTeclado();
            Integer menu=Integer.valueOf(entrada);
            if(menu==1)
            {
                System.out.println("---------");
                System.out.println("| Datos |");
                System.out.println("---------");
                System.out.println("Fecha de Caducidad :");
               
                productoFresco.setFechaCaducidad(entradaTeclado());
                System.out.println("Numero Lote :"); 
             
 
                productoFresco.setNumeroLote(Integer.valueOf(entradaTeclado()));
                System.out.println("Fecha Envasado :");

                productoFresco.setFechaEnvasado(entradaTeclado());
                System.out.println("Pais Origen :");
                   
                productoFresco.setPaisOrigen(entradaTeclado());
                System.out.println("-------------------");
                System.out.println("| Datos  a Mostrar|");
                System.out.println("-------------------");
                productoFresco.mostrarProductoFresco();
            }else if(menu==2)
            {
                System.out.println("---------");
                System.out.println("| Datos |");
                System.out.println("---------");
                System.out.println("Fecha de Caducidad :");
         
                productoRefrigerado.setFechaCaducidad(entradaTeclado());
                System.out.println("Numero Lote :"); 
     
               
                productoRefrigerado.setNumeroLote(Integer.valueOf(entradaTeclado()));
                System.out.println("Codigo Organismo :");
               
                productoRefrigerado.setCodigoOrganismo(entradaTeclado());
                System.out.println("Supervision Alimentaria :");
               
                productoRefrigerado.setSupervisionAlimentaria(entradaTeclado());
                System.out.println("-------------------");
                System.out.println("| Datos  a Mostrar|");
                System.out.println("-------------------");
                productoRefrigerado.mostrarProductoRefrigerado();

            }else if(menu==3)
            {
                System.out.println("---------");
                System.out.println("| Datos |");
                System.out.println("---------");
                System.out.println("Fecha de Caducidad :");
               
                productoCongelado.setFechaCaducidad(entradaTeclado());
                System.out.println("Numero Lote :"); 
             
           
                productoCongelado.setNumeroLote(Integer.valueOf(entradaTeclado()));
                System.out.println("Temperatura Recomendada para Congelar :");
                entrada=entradaTeclado();
                productoCongelado.setTemperaturaCongelacion(entradaTeclado());
                System.out.println("-------------------");
                System.out.println("| Datos  a Mostrar|");
                System.out.println("-------------------");
                productoCongelado.mostrarProductoCongelado();

            }else {System.out.println("Introdusiste un Numero Fuera del Rango del Menu Vuelta a Intentar");}
            System.out.println("Volver al Menu Principal s/n");
            entrada=entradaTeclado();
            if(entrada.equalsIgnoreCase("s"))
            {
                volver=true;
            }else{volver=false;}
        }while(volver);
        System.out.println("El Sistema se ha Cerrado...");
    }
   
    public static String entradaTeclado()
    {
      Scanner sc = new Scanner(System.in);
      return sc.nextLine();
    }
}
Te recomiendo que estudies este ejercicio https://www.aprenderaprogramar.com/foros/index.php?topic=1179.0 donde tal vez puedas encontrar algo util.

Saludos!

93
Aprender a programar desde cero / Re:CU00684B
« en: 16 de Octubre 2014, 23:44 »
 Intentare explicarte el porque no es recomendable pluralizar el nombre de una clase en POO.
(Programación Orientada  a Objetos)

El poder comprender el "porque?" Es algo de logica. Imagina que estas trabajando con una clase "Personas"  y que necesitas un objeto de esta clase "Personas" por lo cual mediante una sentencia: Personas persona1 = new Personas(); creas dicho objeto.

Ahora te hago las siguientes preguntas:

1: Si el nombre de la clase es "Personas", porque el nombre del objeto no es "personas1"?

2: Cuantos objetos tipo Personas se pueden crear a su vez usando la palabra clave new?

3: Aunque podemos crear cuantos objetos tipo Personas queramos. Se crean todos juntos o uno por uno e independientemente?

Lo que se debe de entender es que una clase define un objeto a la vez
(un nuevo objeto en cada invocación a un constructor mediante la palabra clave new) y que se crea un objeto Persona, no varios objetos Personas, por lo tanto lo lógico seria asignar como nombre el singular de la palabra "Personas" ("Persona")

Esto podría confundir, pero no te preocupes si no lo entiendes ahora, según crecemos como programadores algunas dudas que generamos se responden prácticamente "solas"

Respecto a tu ejercicio correspondiente a la entrega CU00686B, lo estoy verificando  ;)

Saludos!

94
Aprender a programar desde cero / Re:CU00684B
« en: 16 de Octubre 2014, 21:34 »
 El diagrama se ve bien estructurado en relación al uso y a la herencia (extends) de clases.

Entre lo poco a comentar están los nombres de clases:

ProductosAgroalimentario - seria mas apropiado ProductoAgroalimentario. (No es recomendable usar plural).

CongeladoPorAgua, CongeladoPorAire y CongeladoPorNitrogeno. Es preferible indicar que también se trata de un Producto, algunos ejemplos de nombres correctos podrían ser:  ProdCongeladoPorAgua, ProdAgricCongeladoPorAire PACongeladoPorNitrogeno

Saludos!

95
Aprender a programar desde cero / Re:CU00683B
« en: 16 de Octubre 2014, 20:56 »
 Hola momo!

Veo que has hecho un copy/paste del código de la clase Test de este ejercicio, donde no has incluido ningún cambio o solución. Lo correcto seria identificar los errores (tiene mas de un error) en este código y solucionarlos para poner en practica lo que has aprendido con relación al tema. Esto no es obligatorio pero si recomendable, al fin y al cabo lo importante es que lo tengas claro, tal y como manifiestas:
Citar
bueno aclare mis dudas sobre este tema revisando el siguiente...
Saludos!  ;)

96
Aprender a programar desde cero / Re:CU00682B
« en: 16 de Octubre 2014, 20:29 »
 Hola momo!

Tu respuesta a este ejercicio esta correcta.

Algunos puntos a tomar en cuenta son:

Clase Piedras: Tienes una constante (pesoPiedra) de tipo "float" y un método get (getPesoPiedra) declarado como "double" cuya funcion es devolver el valor de la constante pesoPiedra. El punto es, que tienes una diferencia de tipos entre esta constante y este método, (float constante, double método) me parece extraño que esto no genere un error en compilación, pero aun así lo mejor es que mantengas la costumbre de declarar un método del mismo tipo que la variable o constante de la cual cuyo valor sera devuelto.

Clase TestPesoPiedra: Dentro de una instrucción del tipo System.out.println("..."); no es necesario incluir el metodo toString(); puesto que la misma instrucción System.out.println("..."); se encarga de convertir a String el valor de las variables que estén dentro de la instrucción. Si tomas esto en cuenta podrías sustituir tu fragmento de codigo
Código: [Seleccionar]
+ objeto.toString() + " " + "||   Peso Palet :" por
Código: [Seleccionar]
+ objeto + " " + "||   Peso Palet :"Otros pequeños detalles como, concatenar la cadena " kg" para indicar el tipo de unidad de peso en que se expresa el peso de cada palet, y declarar
Código: [Seleccionar]
Peso Palet: + (pesoPalet * (float) objeto.getPesoPiedra())); en lugar de
Código: [Seleccionar]
Peso Palet : + (pesoPalet * (float) objeto.getPesoPiedra())); donde la simple posición del punto doble ":" afecta lo que es la interface o visualización de lo que muestra tu código, también debes de tomarlos en cuenta.

Saludos!

97
 Hola Cabanota!

Tu ejercicio cumple al 100% con lo que se requiere en el enunciado de este, solo te hago una pequeña aclaración referente al nombre de la clase.

La palabra "text" en ingles traduce "texto" al español, a diferencia de la palabra "test" cuya traducción al español es "prueba". Una corrección logica al nombre de tu clase "TextFor" seria nombrarla "TestFor" que se podría interpretar como "PruebaFor" (Probar bucle fo,r ext...)

Saludos!  ;)

98
 Hola KillerNemesis!

El objetivo en este ejercicio es dominar la declaración de diferentes tipos de constructores,
(Constructor general o sin parámetros y Constructor/es con parámetros) cosa que has dominado muy bien en tu propuesta como solución a este ejercicio. Has decido excluir la declaración de los posibles parámetros que inicializarian el valor de las variables de tipo boolean (esCasado y esEspecialista) y has decidido asignar su valor por defecto directamente, este tipo de situaciones es opcional por ejemplo podríamos poner el mismo escenario que has planteado. En resumen, tus dos constructores están correctos. Sin embargo te comentare algunas cosas que debes corregir en cuanto al código en general.

1ro: El nombre de un método get o método set, debe de ser relativo al nombre de la variable con que dicho método ínter actúe, la formar correcta de definir un nombre para un método get o set es usando exactamente el mismo nombre de la variable + la palabra set o get ante puesta a este, así tu método getNombreProfesor() quedaría correctamente así: getNombre() (idem para todos los demás métodos get y set) También te ha faltado incluir los getters correspondientes a las variables de tipo boolean.

2do: Veo que has decidido no incluir los métodos setters, (o tal vez lo has olvidado) en cualquiera de los casos debes tener en cuenta que un constructor con parámetros no sustituye el trabajo u objetivo de un método set, como harías para cambiar la edad de un profesor que has contratado ayer, con 34 años de edad pero que hoy esta de cumpleaños?  He aquí la importancia de un método set, por lo tanto, como buena practica te aconsejo que en todos tus códigos incluyas tanto los métodos setters como los métodos getters.

Estos son los puntos que debes reforzar.

Saludos!

100
 Mucho mejor!

Este nuevo código si esta cumpliendo con lo que se requiere en el enunciado, no obstante hay un punto el cual te comentare nuevamente sobre el condicional "if".

Estas anidando un condicional "if" dentro de otro prácticamente sin necesidad, a la hora de diseñar un código tenemos que optar porque este sea lo mas corto, claro y eficiente posible.

Te sugiero que analices el siguiente codigo a modo para que veas como podrías hacer un uso correcto del condicional "if"
Código: [Seleccionar]
import java.util.Scanner;
public class TestPedirDatosPorConsola
{
    public static void main(String []args)
    {
        System.out.println(" Hola!\nPor favor introduce un texto");
        String cadena = "";
        Scanner sc = new Scanner(System.in);
        cadena = sc.nextLine();
        int numeroCaracteres = cadena.length();
        if(numeroCaracteres < 5 && cadena.substring(0,1).equalsIgnoreCase("a"))
        {
            System.out.println("El texto introducido consta de menos de 5 caracteres y comienza con la letra \"" + cadena.substring(0,1) + "\".");
        }
        else if(numeroCaracteres < 5)
        {
            System.out.println("El texto introducido consta de menos de 5 caracteres y no comienza con la letra \"" + "a" + "\".");
        }
        else if(numeroCaracteres >=5 && numeroCaracteres <=15 && cadena.substring(0,1).equalsIgnoreCase("a"))
        {
            System.out.println("El texto introducido consta de entre 5 y 15 caracteres y comienza con la letra \"" + cadena.substring(0,1) + "\".");
        }
        else if(numeroCaracteres >=5 && numeroCaracteres <=15)
        {
            System.out.println("El texto introducido consta de entre 5 y 15 caracteres y no comienza con la letra \"" + "a" + "\".");
        }
        else if(numeroCaracteres >= 16 && cadena.substring(0,1).equalsIgnoreCase("a"))
        {
            System.out.println("El texto introducido consta de entre 5 y 15 caracteres y comienza con la letra \"" + cadena.substring(0,1) + "\".");
        }
        else if(numeroCaracteres >=16)
        {
            System.out.println("El texto introducido consta de mas de 15 caracteres y no comienza con la letra \"" + "a" + "\".");
        }
        else{}
    }
}
De mi parte considero que puedes continuar avanzando con el curso teniendo estos consejos pendientes.

Saludos!

Páginas: 1 2 3 4 [5] 6 7 8 9 10 ... 13

Sobre la educación, sólo puedo decir que es el tema más importante en el que nosotros, como pueblo, debemos involucrarnos.

Abraham Lincoln (1808-1865) Presidente estadounidense.

aprenderaprogramar.com: Desde 2006 comprometidos con la didáctica y divulgación de la programación

Preguntas y respuestas

¿Cómo establecer o cambiar la imagen asociada (avatar) de usuario?
  1. Inicia sesión con tu nombre de usuario y contraseña.
  2. Pulsa en perfil --> perfil del foro
  3. Elige la imagen personalizada que quieras usar. Puedes escogerla de una galería de imágenes o subirla desde tu ordenador.
  4. En la parte final de la página pulsa el botón "cambiar perfil".