Methode aufrufen bei java

Neue Frage »

Auf diesen Beitrag antworten »
Lycaner Methode aufrufen bei java

Hallo,
ich habe folgene Klasse (bei Java) geschrieben und wollte im Hauptprogramm testen, ob meine berechneNote-Methode funktioniert aber ich wei? nicht wie ich es aufrufen soll. Normaler weise ruft man die so auf z.B.

Fach mathe1=new Fach("Mathe1",4,96);
mathe1.zeigeInfo();

Aber bei berechneNote funktioniert es nicht. Ich dache es liegt daran, dass es ein double als Rückgabewert hat aber das hat mcih nicht viel weiter gebracht(

Danke für die Hilfe


public class Fach {

private String name;
private int ects;
private int maxPunkte;
private int istPunkte;
public Fach(String name, int ects, int punkte){
this.ects=ects;
this.name=name;
this.maxPunkte=punkte;
}
public void setPunkte(int istPunkte){
this.istPunkte=istPunkte;
}
private double berechneProzent(int istPunkte){
return(double)istPunkte/(double)this.maxPunkte*100.0;
}
public void zeigeInfo(){
System.out.println("Name: "+name+" ects "+ects+" MaxPunkte "
+maxPunkte+" Punkte "+istPunkte);
}
private double berechneNote(int istPunkte){
double istNote=5;
double istProzent=this.berechneProzent(istPunkte);
double prozent[]={95,90,85,80,75,70,65,60,55,50};
double note[]={1, 1.3, 1.7, 2, 2.3, 2.7, 3, 3.3, 3.7 ,4};
for(int i=0;i<=istProzent;i++){
if(istProzent==prozent[i]){
istNote=note[i];}
}
return istNote;

}

}
 
Auf diesen Beitrag antworten »
Airblader

Bitte formatiere Code entsprechend indem du ihn zwischen [ code ] und [ /code ] platzierst (ohne die Leerzeichen), sonst ist es relativ mühsam, den Code zu lesen.

Es gibt bei deinem Code erstmal ein paar Ungereimtheiten. Deine Klasse hat eine private Variable "istPunkte", für die du auch eine set-Methode hast, dann aber nie verwendest. Entweder solltest du sie entfernen, oder du arbeitest bei berechneNote und berechneProzent einfach damit.

Desweiteren wird deine berechneNote-Funktion nicht funktionieren, sondern mit einer OutOfBounds-Exception auf die Nase fallen. Das Problem ist, dass i in der Schleife bis isProzent geht, d.h. potenziell bis zu einem Wert zwischen 0 und 100. Du nutzt i aber als Index der Arrays und die haben ja keine 101 Elemente.
Hier ist die Logik aber auch falsch. Du solltest lieber über das prozent-Array iterieren und dann schauen, ob istProzent diesen Wert erreicht oder nicht. Und du musst auch aufpassen, in welcher Reihenfolge du iterierst, da dein prozent-Array von oben nach unten sortiert ist.
Außerdem hast du berechneNote privat gemacht, wodurch du sie von außen sowieso nicht aufrufen könntest. Wenn du das willst, dann musst du sie als public markieren.
Ich schreibe dir das Ganze jetzt mal um:

code:
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
34:
35:
36:
37:
38:
39:
40:
41:
42:
43:
package com.tngtech.java.junit.dataprovider;

public class Fach {

	private String name;
	private int ects;
	private int maxPunkte;
	private int istPunkte;

	public Fach(String name, int ects, int punkte) {
		this.ects = ects;
		this.name = name;
		this.maxPunkte = punkte;
	}

	public void setPunkte(int istPunkte) {
		this.istPunkte = istPunkte;
	}

	private double berechneProzent(int istPunkte) {
		return (double) istPunkte / (double) this.maxPunkte * 100.0;
	}

	public void zeigeInfo() {
		System.out.println("Name: " + name + " ects " + ects + " MaxPunkte "
				+ maxPunkte + " Punkte " + istPunkte);
	}

	public double berechneNote() {
		double istProzent = berechneProzent(istPunkte);
		double prozent[] = { 95, 90, 85, 80, 75, 70, 65, 60, 55, 50 };
		double note[] = { 1, 1.3, 1.7, 2, 2.3, 2.7, 3, 3.3, 3.7, 4 };

		for (int i = 0; i < prozent.length; i++) {
			if (istProzent >= prozent[i]) {
				return note[i];
			}
		}

		return 5;
	}

}


Ein Beispielaufruf sieht dann so aus:

code:
1:
2:
3:
4:
5:
6:
Fach mathe = new Fach("Mathematik", 4, 96);
mathe.setPunkte(70);

System.out.println("Erreichte Note: " + mathe.berechneNote()); // Erreichte Note: 2.7
Auf diesen Beitrag antworten »
Lycaner

Ok habe verstanden.
Ich habe da aber noch eine Frage, wenn eine Methode in einer Klasse nicht rot untersstrichen ist und auch keine rote Zeichen für Fehler am Rand hat, heißst es noch lange nicht, dass die Methode funktioniert.
Und wenn die Methode nicht funkioniert, kann ich die in der Hauptklasse nicht aufrufen?
Auf diesen Beitrag antworten »
Lycaner

Achso, ich musste die private Methode verwenden, es war die Vorgabe in der Klausur. Jetzt verstehe ich, wieso ich dann folgende Methode schreiben sollte)

public double berechneNote(){
double ergebnis;
ergebnis=berechneNote(istPunkte);
return ergebnis;
}
 
Auf diesen Beitrag antworten »
Airblader

Zitat:
Original von Lycaner
Jetzt verstehe ich, wieso ich dann folgende Methode schreiben sollte)


Das kann natürlich sein. Dann musst du aus der public-Methode eben die private-Methode mit der Klassenvariable aufrufen.

code:
1:
Ich habe da aber noch eine Frage, wenn eine Methode in einer Klasse nicht rot untersstrichen ist und auch keine rote Zeichen für Fehler am Rand hat, heißst es noch lange nicht, dass die Methode funktioniert.


Natürlich nicht. Das Anzeigen solcher Fehler/Probleme ist eine reine Nettigkeit deiner IDE, die dir möglichst früh mitzuteilen versucht, wenn du was falsch machst. Die IDE kann aber natürlich nur Dinge wie Syntaxfehler und ähnliches erkennen: Also zum Beispiel, wenn du dich bei einer Variable vertippt hast (z.B. "istPunke"), die es dann nicht gibt; wenn Variablen den falschen Typ haben; wenn Variablen nicht initialisiert wurden; oder auch wenn du auf Methoden zugreifen willst, die nicht sichtbar sind.
Die Logik des Programms kann die IDE aber ja nicht kennen, das wäre zuviel verlangt. Wenn du also die Note falsch berechnest, dann kann die IDE dir das nicht mitteilen.

Um sicherzugehen, dass ein Programm tatsächlich wie gewünscht funktioniert, gibt es in der professionellen Welt Tests, die man parallel zum eigentlichen Programm schreibt. Damit sieht man sofort, ob es tut, was es soll, und viel wichtiger, man sieht bei späteren Änderungen schnell, ob man versehentlich dadurch irgendetwas "kaputtgemacht" hat. Das aber nur als Information.

code:
1:
Und wenn die Methode nicht funkioniert, kann ich die in der Hauptklasse nicht aufrufen?


Aufrufen schon, aber es wird halt nicht funktionieren.
Auf diesen Beitrag antworten »
Lycaner

Vielen Danke für die schnelle Antworten und Hilfe.
 
Neue Frage »
Antworten »


Verwandte Themen

Die Beliebtesten »
Die Größten »
Die Neuesten »