Problema con le Eccezioni

di il
15 risposte

Problema con le Eccezioni

Buongiorno a tutti, ho il seguente problema. Voglio creare un programma che calcoli il perimetro di un triangolo in un piano cartesiano dati 3 punti. Solo che che mi dà un eccezione ma non ne capisco il motivo le classi sono le seguenti: (Grazie mille anticipatamente)
public class Punto {
private int x=0;
private int y=0;

public Punto(int x,int y){ (QUESTA è LA CLASSE PUNTO)
this.setX(x);
this.setY(y);

}
public Punto(){
this(0,0);
}
public Punto(int x){
this(x,0);
}

public int getX() {
return x;
}

public void setX(int x) {
this.x = x;
}

public int getY() {
return y;
}

public void setY(int y) {
this.y = y;
}

}

public class Triangolo { (QUESTA LA CLASSE TRIANGOLO)
protected double base=0;
protected double altezza=0;
protected double lato1=0; private double lato2=0; private double lato3=0;
private Punto p1=null;
private Punto p2=null;
private Punto p3=null;

public Triangolo(int x1,int y1,int x2,int y2, int x3,int y3){

}

public Triangolo(Punto p1, Punto p2, Punto p3){
this (p1.getX(),p2.getY(),p2.getX(),p2.getY(),p3.getX(),p3.getY());
}



public double PerimetroTriangolo(){
double lato1; double lato2; double lato3;

lato1= Math.sqrt(Math.pow(p1.getX()+p2.getY(), 2)+ Math.pow(p2.getX()+p2.getY(), 2));
return lato1;}




}

15 Risposte

  • Re: Problema con le Eccezioni

    sauzer90 ha scritto:


    Voglio creare un programma che calcoli il perimetro di un triangolo in un piano cartesiano dati 3 punti. Solo che che mi dà un eccezione ma non ne capisco il motivo
    Non hai precisato quale eccezione (potrei presumere NullPointerException ?).

    Comunque, la classe Punto è ok, strutturalmente è corretta. La classe Triangolo no, è incompleta. Hai messo 2 costruttori che alla fine non fanno nulla di utile. Quindi le 3 variabili di istanza p1/p2/p3 restano a null.
    Il fatto di tenere anche base/altezza/lato1/ec... come variabili di istanza è invece dubbio. Nel senso che per farlo correttamente dovresti tenere allineate le cose rispetto ai 3 punti.

    Quindi:
    a) Tieni solo p1/p2/p3
    b) Non sparpagliare/ripetere i Math.sqrt e Math.pow, fai la cosa sensata: che Punto sia in grado di fornire la distanza da un altro Punto
  • Re: Problema con le Eccezioni

    andbin ha scritto:


    sauzer90 ha scritto:


    Voglio creare un programma che calcoli il perimetro di un triangolo in un piano cartesiano dati 3 punti. Solo che che mi dà un eccezione ma non ne capisco il motivo
    Non hai precisato quale eccezione (potrei presumere NullPointerException ?).

    Comunque, la classe Punto è ok, strutturalmente è corretta. La classe Triangolo no, è incompleta. Hai messo 2 costruttori che alla fine non fanno nulla di utile. Quindi le 3 variabili di istanza p1/p2/p3 restano a null.
    Il fatto di tenere anche base/altezza/lato1/ec... come variabili di istanza è invece dubbio. Nel senso che per farlo correttamente dovresti tenere allineate le cose rispetto ai 3 punti.

    Quindi:
    a) Tieni solo p1/p2/p3
    b) Non sparpagliare/ripetere i Math.sqrt e Math.pow, fai la cosa sensata: che Punto sia in grado di fornire la distanza da un altro Punto
    Grazie ancora Andrea! sì è NullPointerException comunque io avevo creato la classe segmento e ho cambiato in questa maniera...ma l'eccezione rimane la stessa:


    public class Segmento {
    private static Punto p1= null;
    private static Punto p2= null;

    public Segmento(int x1, int y1, int x2, int y2)
    {
    p1= new Punto(x1,y1);
    p2=new Punto(x2,y2);

    }
    public Segmento(int x2, int y2){
    this(0,0,x2,y2);

    }
    public Segmento(Punto p1, Punto p2){
    this(p1.getX(),p1.getY(),p2.getX(),p2.getY());
    }

    public Segmento(){
    this(0,0,0,0);
    }

    public double Lunghezza(){
    return Math.sqrt(Math.pow(p1.getX()-p2.getX(),2)+Math.pow(p1.getY()+p2.getY(), 2));
    }
    {

    }


    }
    public class Triangolo {
    private Punto p1=null;
    private Punto p2=null;
    private Punto p3=null;



    public Triangolo(Punto p1, Punto p2, Punto p3){

    }



    public double PerimetroTriangolo(){

    Segmento lato1= new Segmento(p1,p2);
    Segmento lato2= new Segmento(p1,p3);
    Segmento lato3=new Segmento(p2,p3);
    return lato1.Lunghezza()+lato2.Lunghezza()+lato3.Lunghezza();}




    }
  • Re: Problema con le Eccezioni

    Ps* preferisci Foto dello schermo piuttosto che mero copia e incolla?
  • Re: Problema con le Eccezioni

    Il problema è sempre lo stesso, l'hai solo spostato: chiami un metodo di un oggetto non istanziato.

    Segui il consiglio di andbin per la classe Punto, compreso il metodo distanza.

    Io ti consiglio di fare un unico costruttore per classe triangolo - quello di sei parametri. Altrimenti se non sai fare i delegate constructors ti blocchi sul nulla, come in questo caso. Capisco che le guidelines ti dicano di farlo, ma secondo me uno devi usarli solo quando sa usarli
  • Re: Problema con le Eccezioni

    Ciao! Fare il costruttore con 6 variabili credo di saperlo fare...io la cosa che vorrei comprendere è l'errore, per poter capire di più e poter imparare. Fondamentalmente non capisco dove sia l'errore...la cosa che è go capito è che l'eccezione c'è perchè le variabili di istanza del triangolo rimangono null, ma non capisco perchè. Comunque grazie mille per le risposte
  • Re: Problema con le Eccezioni

    sauzer90 ha scritto:


    Ciao! Fare il costruttore con 6 variabili credo di saperlo fare...io la cosa che vorrei comprendere è l'errore, per poter capire di più e poter imparare. Fondamentalmente non capisco dove sia l'errore...la cosa che è go capito è che l'eccezione c'è perchè le variabili di istanza del triangolo rimangono null, ma non capisco perchè. Comunque grazie mille per le risposte
    Nel primo codice avevi messo in Triangolo 2 costruttori:
    public Triangolo(int x1,int y1,int x2,int y2, int x3,int y3){
    
    }
    
    public Triangolo(Punto p1, Punto p2, Punto p3){
    this (p1.getX(),p2.getY(),p2.getX(),p2.getY(),p3.getX(),p3.getY());
    }
    Il secondo invoca il primo ma .. il primo è vuoto, non imposta un bel nulla! Quindi p1/p2/p3 restano a null. E non li puoi usare nei metodi, altrimenti NullPointerException.

    Quindi ecco cosa dovresti fare:

    - classe Punto che ha un metodo es.:

    public double calcolaDistanza(Punto altroPunto)

    - classe Triangolo che ha:
    1) variabili di istanza p1, p2 e p3 di tipo Punto
    2) un costruttore che riceve i 3 punti e li assegna ai campi
    3) il metodo che calcola il perimetro usa i 3 punti sfruttando il calcolaDistanza per determinare i 3 lati che banalmente sommerà.
  • Re: Problema con le Eccezioni

    Ci sono riuscito!!! ho fatto così:
    allora la classe punto è rimasta uguale ho aggiunto:
    public double Distanzapunto(Punto altro){
    double distanza=0;
    distanza= Math.sqrt(Math.pow(x+altro.x, 2)+Math.pow(y+altro.y, 2));
    return distanza;
    }
    }

    e il costruttore del triangolo ho fatto così
    public Triangolo(Punto p1, Punto p2, Punto p3){
    this.p1=p1;
    this.p2=p2;
    this.p3=p3;
    }



    public double PerimetroTriangolo(){
    double perimetro=0;
    perimetro= p1.Distanzapunto(p2)+p2.Distanzapunto(p3)+p3.Distanzapunto(p1);
    return perimetro;
    }
    }
    Ho provato e così viene!!!! quindi avevo sbagliato il this in pratica.... comunque grazie mille a tutti quanti =) davvero gentilissimi
  • Re: Problema con le Eccezioni

    Bene per il costruttore, ma la distanza è sbagliata
    
    public double Distanzapunto(Punto altro){
    return Math.sqrt(Math.pow(x-altro.x,2)+Math.pow(y-altro.y, 2));
    }
    
  • Re: Problema con le Eccezioni

    Weierstrass ha scritto:


    Bene per il costruttore, ma la distanza è sbagliata
    
    public double Distanzapunto(Punto altro){
    return Math.sqrt(Math.pow(x-altro.x,2)+Math.pow(y-altro.y, 2));
    }
    
    dove?
  • Re: Problema con le Eccezioni

    Avevi messo (x+altro.x) e (y+altro.y). Ci vuole il meno
  • Re: Problema con le Eccezioni

    Appunto, bisogna fare il "delta" x e "delta" y (la differenza) ... non la somma.
  • Re: Problema con le Eccezioni

    Weierstrass ha scritto:


    Avevi messo (x+altro.x) e (y+altro.y). Ci vuole il meno
    ah giusto... che stupido. XD ...grazie...
  • Re: Problema con le Eccezioni

    andbin ha scritto:


    Appunto, bisogna fare il "delta" x e "delta" y (la differenza) ... non la somma.
    eh però ricontrollando così non viene....costruisco il triangolo formato dai punti
    Punto p1= new Punto(0,0);
    Punto p2= new Punto(0,3);
    Punto p3= new Punto(4,0);

    Il perimetro deve venire 12...invece mi viene 6.
    public double PerimetroTriangolo(){
    double perimetro=0;
    perimetro= p1.Distanzapunto(p2)+p1.Distanzapunto(p3)+p2.Distanzapunto(p3);
    return perimetro;

    public double Distanzapunto(Punto altro){

    return Math.sqrt(Math.pow(x-altro.x, 2)+Math.pow(y-altro.y, 2));

    }
    deve esserci qualcosa di sbagliato in queste due parti
  • Re: Problema con le Eccezioni

    Ho risolto così public double PerimetroTriangolo(Punto p1,Punto p2, Punto p3){
    double perimetro=0;
    perimetro= p1.Distanzapunto(p2)+p1.Distanzapunto(p3)+p2.Distanzapunto(p3);
    return perimetro;
    }
Devi accedere o registrarti per scrivere nel forum
15 risposte