Tengo una clase, Botella, y tengo que crear un objeto de esa clase, pero añadiéndole un par de propiedades más.
El problema es que cuando me creo otra clase "Vaso" que deriva de Botella
para poder crearme ahí un objeto "v", me sale un error tal que así : Unreported exception Exception in default constructor
El error me sale al principio de todo cuando creo la clase Vaso:
public class Vaso extends Botella1{ }
Aqui dejo el código de la clase principal ("Botella1"):
Código:
public class Botella1 extends Thread{ public enum Material { PLASTICO, VIDRIO, METAL; }; private float capacidad, contenido; private Material material; public Botella1(float capacidad, float contenido, Material material) throws Exception { this.setBotella(capacidad, contenido, material); } public Botella1(float capacidad) throws Exception{ this.setBotella(capacidad, contenido, material); } public Botella1(float capacidad, float contenido) throws Exception{ this.setBotella(capacidad,contenido,Material.PLASTICO); } public Botella1(Botella1 b) throws Exception{ this.setBotella(b.capacidad,b.contenido,b.material); } public Botella1() throws Exception{ this.setBotella(0); } /*GETTER's & SETTER's*/ public Material getMaterial() { return material; } public void setMaterial(Material material) { this.material = material; } public float getCapacidad() { return capacidad; } public void setCapacidad(float capacidad) { this.capacidad = capacidad; } public synchronized float getContenido() { return contenido; } public synchronized void setContenido(float contenido) throws Exception { if(contenido>capacidad || contenido<0){ throw new Exception("Se supera la capacidad"); } this.contenido = contenido; } public final synchronized void setBotella(float capacidad, float contenido, Material material) throws Exception { if(capacidad<0){ throw new Exception("Error:Botella(float, float, Material) Capacidad negativa (" + capacidad + ")"); } this.capacidad = capacidad; if(contenido<0 || contenido>capacidad){ throw new Exception("Error:Botella(float, float, Material) Contenido negativa (" + contenido + ")"); } this.contenido = contenido; this.material = material; } public final synchronized void setBotella(float capacidad) throws Exception{ setBotella(capacidad,0,Material.PLASTICO); } public final synchronized void setBotella(float capacidad, float contenido) throws Exception{ setBotella(capacidad,contenido,Material.PLASTICO); } public final synchronized void Botella(Botella1 b) throws Exception{ setBotella(b.capacidad,b.contenido,b.material); } public final synchronized void Botella() throws Exception{ setBotella(0); } public void rellenar(){ try{ setContenido(capacidad); }catch(Exception e){ System.out.println("Error: rellenar(): Contenido incorrecto (" + capacidad+ ")"); } } public synchronized void rellenar( float litros) throws Exception{ setContenido(getContenido() + litros); } public void vaciar() throws Exception{ setContenido(0); } public void vaciar( float litros) throws Exception{ //No es sincronizado xq llama al rellenar que si lo es rellenar(-litros); } public void contenido(){ System.out.println("El contenido actual de la botella es de " + getContenido() + " litros"); } public static void main(String[] args) throws Exception{ int hilos=100; Thread []miBotellaLL= new Thread[hilos]; Thread []miBotellaV= new Thread[hilos]; float capacidad= 100, contenido = 50; int posicion=1; Botella1 b = new Botella1(capacidad, contenido); float Cr= (float)0.2; float Cv= (float)0.2; for (int i = 0; i < hilos; i++) { System.out.println(posicion + ")"); miBotellaLL[i]=new Thread(b); miBotellaLL[i].start(); b.rellenar(Cr); miBotellaV[i]=new Thread(b); miBotellaV[i].start(); b.vaciar(Cv); posicion+=1; } for (int i = 0; i < hilos; i++) { miBotellaLL[i].join(); miBotellaV[i].join(); } //Comprobacion final b.contenido(); } }
Este es el enunciado del ejercicio:
Crear un objeto "Vaso" derivado de "Botella", con las siguientes características adicionales:
propiedades (acceso privado):
boolean agitado (true / false). Representa si hemos agitado nuestra bebida o no.
métodos (acceso público). REUTILIZAR TODO LO QUE SE PUEDA DE LA SUPERCLASE
agitar(): setAgitado(true). Agitar debe dormir el hilo durante 3 segundos. No tiene sentido agitar un vaso vacio (Excepción)
reposar(): setAgitado(false). Reposar debe dormir el hilo durante 10 segundos.
beber(): Debe poder beberse cuando la bebida no esté agitada, y debe poder beberse cualquier cantidad existente en el vaso.
constructores:
Con todos los argumentos (capacidad, contenido, material, agitado)
Pasando como argumento solamente la capacidad: reutiliza el constructor anterior, pero deja el vaso vacio, de PLÁSTICO, y sin agitar
Pasando como argumento solamente la capacidad y el contenido inicial, creará un vaso de plástico con el contenido indicado, sin agitar.
Constructor por copia: recibe un vaso y crea otro con las mismas propiedades.
Un saludo y gracias por adelantado.