Okay, doch womit kann ich das Programm diesen Fehler abfangen lassen?
try...catch ?
Wenn ich die try catch Methode einbaue kann der compiler die variablen array 1 2 3 nicht mehr finden :/
public class FormenTest{
public static GeometrischeForm erzeuge(String[] array) throws IndexOutOfBoundsException{
String objektName = array[0];
double array1 = Double.parseDouble(array[1]);
double array2 = Double.parseDouble(array[2]);
double array3 = Double.parseDouble(array[3]);
try{
objektName = array[0];
array1 = Double.parseDouble(array[1]);
array2 = Double.parseDouble(array[2]);
array3 = Double.parseDouble(array[3]);
}
catch(IndexOutOfBoundsException e1){
System.out.println("Fehler");
}
GeometrischeForm form;
if(objektName == "Kreis"){
form = new Kreis(array1);
}
else if(objektName == "Quadrat"){
form = new Quadrat(array1);
}
else if(objektName == "Rechteck"){
form = new Rechteck(array1, array2);
}
else if(objektName == "Dreieck"){
form = new Dreieck(array1, array2, array3);
}
else{
return null;
}
return form;
}
public static void main(String[] args){
String[] array0 = {"Dreieck", "3.0", "4.0", "5.0"};
String[] array1 = {"Quadrat", "3.0"};
String[] array2 = {"3eck", "3.0", "4.0", "5.0"};
String[] array3 = {"Dreieckeck", "3.0", "4.0"};
erzeuge(array0);
erzeuge(array1);
erzeuge(array2);
erzeuge(array3);
}
}
Jetzt beschwert der Compiler sich, dass die Variablen nicht initialisiert sind,
aber wie soll ich sie initialisieren, ohne wenn das durch einen String gemacht wird, der einen Fehler auslöst?
double a = 0.0;
Edit 2: Das liegt daran, dass die Zuweisung im try-Block stattfindet, aber dieser ja fehlschlagen kann. In diesem Fall würden die Variablen tatsächlich uninitialisiert bleiben.
double a = 0.0;
Wenn du die Variablen wieder mit einem Aufruf des Arrays initialisierst, dann wirst du auch wieder eine Exception erhalten.
Edit: Ich warne dich gleich mal vor; es gibt noch einiges, dass nicht so funktionieren wird, wie du es dir vorstellst. Aber mach erst mal weiter, dass kriegen wir schon hin![]()
Implementieren Sie in FormenTest eine main-Methode. Sie soll mit den Arrays
{"Dreieck", "3.0", "4.0", "5.0"}
{"Quadrat", "3.0"}
{"3eck", "3.0", "4.0", "5.0"}
{"Dreieck", "3.0", "4.0"}
mit erzeuge geometrische Objekte erzeugen und dann die geoText, die flaeche und die umfang- Methode verwenden, um Informationen über das Objekt auszugeben. Bei einer ungültigen Eingabe, also wenn die erzeuge-Methode null zurückgegeben hat, soll eine entsprechende Meldung ausgegeben werden (Hinweis: Abfangen der NullPointerException).
public static void main(String[] args){
String[] array0 = {"Dreieck", "3.0", "4.0", "5.0"};
String[] array1 = {"Quadrat", "3.0"};
String[] array2 = {"3eck", "3.0", "4.0", "5.0"};
String[] array3 = {"Dreieckeck", "3.0", "4.0"};
GeometrischeForm form1 = erzeuge(array0);
GeometrischeForm form2 = erzeuge(array1);
GeometrischeForm form3 = erzeuge(array2);
GeometrischeForm form4 = erzeuge(array3);
String formA = geoText(form1);
String formB = geoText(form2);
String formC = geoText(form3);
String formD = geoText(form4);
}
Wenn ich das Programm jetzt so ausführe, dann spuckt er für die beiden ungültigen Objekte aus der Aufgabenstellung schonmal zwei Fehlermeldungen aus.
public String geoText(){
return "Es handelt sich um ein Rechteck mit den Seitenlaengen "+getA()+" und "+getB()+".";
}
Es erscheint nur 2 mal "Fehler" auf der Konsole und in der Aufgabenstellung sind 2 fehlerhafte Objekte gegebenBist du dir da sicher?
Für welche der vier Objekte wird denn die Fehlermeldung ausgegeben?
Es erscheint nur 2 mal "Fehler" auf der Konsole und in der Aufgabenstellung sind 2 fehlerhafte Objekte gegeben
Ich habe verschiedene geoText() Methoden in den Klassen Kreis.java, Quadrat.java, usw. stehen, aber nicht in GeometrischeForm oder FormenTest. Beispiel:
Java:public String geoText(){ return "Es handelt sich um ein Rechteck mit den Seitenlaengen "+getA()+" und "+getB()+"."; }
Nimm dir deine main() und kommentiere jeweils drei der vier Objekte aus, so dass nur eines davon erzeugt wird. Damit kannst du feststellen, welches genau einen Fehler erzeugt.
Es sollte dir zu denken geben, dass bei einem ungültigen Objektnamen keine Fehlermeldung erscheinen dürfte, sondern nur NULL zurück gegeben werden müsste.
Dann ruf die doch einfach auf!
Die Objekte 2 und 4 sind das, also die richtigen (Y)
GeometrischeForm.geoText(); -> "The method geoText() is undefined for the type Geometrische Form"
Kreis.geoText(); -> "Cannot make a static reference to the non-static method geoText() from the type Kreis"
Objekt 2 = form2 ?
Das sollte ein Quadrat mit einer Seitenlänge sein. Passt doch.
Hast Recht. Es wird nur beim ersten Objekt kein Fehler ausgegeben.
Und weißt du auch warum?
Denke daran, der Fehler wird ausgegeben, wenn es zu einer IndexOutOfBounds Exception kommt.
Naja, weil das erste Objekt das einzige ist, welches das Array komplett füllt. Dennoch habe ich keine Idee, wie ich dennoch ein Quadrat erstellen könnte.
GeometrischeForm form;
if(objektName == "Kreis"){
form = new Kreis(array1);
}
else if(objektName == "Quadrat"){
form = new Quadrat(array1);
}
else if(objektName == "Rechteck"){
form = new Rechteck(array1, array2);
}
else if(objektName == "Dreieck"){
form = new Dreieck(array1, array2, array3);
}
else{
return null;
}
return form;
GeometrischeForm form = null;
if(objektName.equals("Kreis")) {
form = new Kreis(array1);
}
if(objektName.equals("Quadrat")) {
form = new Quadrat(array1);
}
if(objektName.equals("Rechteck")) {
form = new Rechteck(array1, array2);
}
if(objektName.equals("Dreieck")) {
form = new Dreieck(array1, array2, array3);
}
return form;
public class FormenTest{
public static GeometrischeForm erzeuge(String[] array){
GeometrischeForm form = null;
try{
String objektName = array[0];
double array1 = Double.parseDouble(array[1]);
if(objektName.equals("Kreis")){
form = new Kreis(array1);
}
if(objektName.equals("Quadrat")){
form = new Quadrat(array1);
}
if(objektName.equals("Rechteck")){
double array2 = Double.parseDouble(array[2]);
form = new Rechteck(array1, array2);
}
if(objektName.equals("Dreieck")){
double array2 = Double.parseDouble(array[2]);
double array3 = Double.parseDouble(array[3]);
form = new Dreieck(array1, array2, array3);
}
}
catch(IndexOutOfBoundsException e1){
System.out.println("Fehler");
}
return form;
}
public static void main(String[] args){
String[] array0 = {"Dreieck", "3.0", "4.0", "5.0"};
String[] array1 = {"Quadrat", "3.0"};
String[] array2 = {"3eck", "3.0", "4.0", "5.0"};
String[] array3 = {"Dreieck", "3.0", "4.0"};
GeometrischeForm form1 = erzeuge(array0);
GeometrischeForm form2 = erzeuge(array1);
GeometrischeForm form3 = erzeuge(array2);
GeometrischeForm form4 = erzeuge(array3);
}
}
Ist die Anforderung wirklich die Index out of bounds exception zu catchen? Mit if die Länge zu prüfen wäre sonst vorzuziehen.
public class FormenTest{
public static GeometrischeForm erzeuge(String[] array){
GeometrischeForm form = null;
try{
String objektName = array[0];
double array1 = Double.parseDouble(array[1]);
if(objektName.equals("Kreis")){
form = new Kreis(array1);
}
if(objektName.equals("Quadrat")){
form = new Quadrat(array1);
}
if(objektName.equals("Rechteck")){
double array2 = Double.parseDouble(array[2]);
form = new Rechteck(array1, array2);
}
if(objektName.equals("Dreieck")){
double array2 = Double.parseDouble(array[2]);
double array3 = Double.parseDouble(array[3]);
form = new Dreieck(array1, array2, array3);
}
}
catch(IndexOutOfBoundsException e1){
System.out.println("Fehler");
}
return form;
}
public static void main(String[] args){
String[] array0 = {"Dreieck", "3.0", "4.0", "5.0"};
String[] array1 = {"Quadrat", "3.0"};
String[] array2 = {"3eck", "3.0", "4.0", "5.0"};
String[] array3 = {"Dreieck", "3.0", "4.0"};
GeometrischeForm form1 = erzeuge(array0);
GeometrischeForm form2 = erzeuge(array1);
GeometrischeForm form3 = erzeuge(array2);
GeometrischeForm form4 = erzeuge(array3);
form1.geoText();
}
public String geoText(){
return "Es handelt sich um ein Dreieck mit den Seitenlaengen "+getA()+", "+getB()+" und "+getC()+".";
}
Okay, aber was soll da rein? In Kreis, Rechteck, etc. wird ja ein String ausgegeben, der dann sagt, um welches Objekt es sich handelt. Bei GeometrischeForm kann man das ja alles sein.Die Methode muss es in GeometrischeForm schon auch geben.
Wobei man dazusagen sollte: @Prokyon114 mach das nicht.Ansonsten kannst Du natürlich auch auf alle Klassen prüfen ... also für jede Klasse prüfen, ob form1 instanceOf der Klasse ist um dann ggf. einen cast zu der Klasse zu machen und die Methode dann aufzurufen,
Ja, genau deswegen gilt, was @kneitzel schrieb: GeometrischeForm ist abstrakt, denn die GeometrischeForm kann alles sein, die GeometrischeForm gibt es nicht.Bei GeometrischeForm kann man das ja alles sein.
Wobei man dazusagen sollte: @Prokyon114 mach das nicht.
public class GeometrischeForm{
private double umfang;
private double flaecheninhalt;
public double getUmfang(){
return umfang;
}
public double getFlaecheninhalt(){
return flaecheninhalt;
}
public GeometrischeForm(){}
public String geoText(){
return null;
}
public double berechneUmfang(){
return 0.0;
}
public double berechneFlaecheninhalt(){
return 0.0;
}
}
@Prokyon114 Man muss dazu sagen, dass @kneitzel s Beiträge den Anspruch erheben, Gesetz zu sein... Dass dabei gelegentlich auch mal durch ihn ins Klo gegriffen wird, wird dabei gerne verschwiegen...Wobei man dazusagen sollte: @Prokyon114 mach das nicht.
Also ich habe hier noch keinen erlebt, der diesen Anspruch erheben würde.Man muss dazu sagen, dass @kneitzel s Beiträge den Anspruch erheben, Gesetz zu sein...
Java:public abstract class GeometrischeForm{ public abstract String geoText(); public abstract double berechneUmfang(); public abstract double berechneFlaecheninhalt(); }
Mal wieder: Wenn du nichts als dumme Pöbeleien beizutragen hast, halt dich bitte aus Themen raus.@Prokyon114 Man muss dazu sagen, dass @kneitzel s Beiträge den Anspruch erheben, Gesetz zu sein... Dass dabei gelegentlich auch mal durch ihn ins Klo gegriffen wird, wird dabei gerne verschwiegen...
public abstract class GeometrischeForm{
private double umfang;
private double flaecheninhalt;
public double getUmfang(){
return umfang;
}
public double getFlaecheninhalt(){
return flaecheninhalt;
}
public GeometrischeForm(){}
public abstract String geoText(){
}
public abstract double berechneUmfang(){
}
public abstract double berechneFlaecheninhalt(){
}
}
public class Kreis extends GeometrischeForm{
private double r;
public double getR(){
return r;
}
public void setR(double r){
if(r < 0){
r = -r;
}
this.r = r;
}
public Kreis(double r){
this.r = r;
}
public String geoText(){
return "Es handelt sich um einen Kreis mit dem Radius "+getR()+".";
}
public double berechneUmfang(){
double umfang = 2*Math.PI*getR();
return umfang;
}
public double berechneFlaecheninhalt(){
double flaecheninhalt = Math.PI*getR()*getR();
return flaecheninhalt;
}
}
public class Quadrat extends GeometrischeForm{
private double a;
public double getA(){
return a;
}
public void setA(double a){
if(a < 0){
a = -a;
}
this.a = a;
}
public Quadrat(double a){
this.a = a;
}
public String geoText(){
return "Es handelt sich um ein Quadrat mit der Seitenlaenge "+getA()+".";
}
public double berechneUmfang(){
double umfang = 4*getA();
return umfang;
}
public double berechneFlaecheninhalt(){
double flaecheninhalt = getA()*getA();
return flaecheninhalt;
}
}
public class Rechteck extends Quadrat{
private double b;
public double getB(){
return b;
}
public void setB(double b){
if(b < 0){
b = -b;
}
this.b = b;
}
public Rechteck(double a, double b){
super(a);
this.b=b;
}
public String geoText(){
return "Es handelt sich um ein Rechteck mit den Seitenlaengen "+getA()+" und "+getB()+".";
}
public double berechneUmfang(){
double umfang = 2*getA()+2*getB();
return umfang;
}
public double berechneFlaecheninhalt(){
double flaecheninhalt = getA()*getB();
return flaecheninhalt;
}
}
public class Dreieck extends Rechteck{
private double c;
public double getC(){
return c;
}
public void setC(double c){
if(c < 0){
c = -c;
}
this.c = c;
}
public Dreieck(double a, double b, double c){
super(a, b);
this.c = c;
}
public String geoText(){
return "Es handelt sich um ein Dreieck mit den Seitenlaengen "+getA()+", "+getB()+" und "+getC()+".";
}
public double berechneUmfang(){
double umfang = getA()+getB()+getC();
return umfang;
}
public double berechneFlaecheninhalt(){
double s = 0.5*(getA()+getB()+getC());
double flaecheninhalt = Math.sqrt(s*(s-getA())*(s-getB())*(s-getC()));
return flaecheninhalt;
}
}
public class FormenTest{
public static GeometrischeForm erzeuge(String[] array){
GeometrischeForm form = null;
try{
String objektName = array[0];
double array1 = Double.parseDouble(array[1]);
if(objektName.equals("Kreis")){
form = new Kreis(array1);
}
if(objektName.equals("Quadrat")){
form = new Quadrat(array1);
}
if(objektName.equals("Rechteck")){
double array2 = Double.parseDouble(array[2]);
form = new Rechteck(array1, array2);
}
if(objektName.equals("Dreieck")){
double array2 = Double.parseDouble(array[2]);
double array3 = Double.parseDouble(array[3]);
form = new Dreieck(array1, array2, array3);
}
}
catch(IndexOutOfBoundsException e1){
System.out.println("Fehler");
}
return form;
}
public static void main(String[] args){
String[] array0 = {"Dreieck", "3.0", "4.0", "5.0"};
String[] array1 = {"Quadrat", "3.0"};
String[] array2 = {"3eck", "3.0", "4.0", "5.0"};
String[] array3 = {"Dreieck", "3.0", "4.0"};
GeometrischeForm form1 = erzeuge(array0);
GeometrischeForm form2 = erzeuge(array1);
GeometrischeForm form3 = erzeuge(array2);
GeometrischeForm form4 = erzeuge(array3);
try{
form1.geoText();
form2.geoText();
form3.geoText();
form4.geoText();
form1.berechneFlaecheninhalt();
form2.berechneFlaecheninhalt();
form3.berechneFlaecheninhalt();
form4.berechneFlaecheninhalt();
form1.berechneUmfang();
form2.berechneUmfang();
form3.berechneUmfang();
form4.berechneUmfang();
}
catch(NullPointerException n1){
System.out.println("Null");
}
}
}
Ja, weil z. Bjetzt heißt es "abstract methods do not define a body"
public abstract String geoText(){
}
public abstract String geoText();
Was soll so eine Aussage? Wo habe ich so etwas jemals behauptet? Aber nein - der Herr wird auch jetzt hier garantiert unfähig sein, Argumente zu bringen, daher ist es einfach sinnlos.@Prokyon114 Man muss dazu sagen, dass @kneitzel s Beiträge den Anspruch erheben, Gesetz zu sein... Dass dabei gelegentlich auch mal durch ihn ins Klo gegriffen wird, wird dabei gerne verschwiegen...