subjektive Klausurfragen

ThommyTom

Aktives Mitglied
Hallo,
ich habe hier zwei Klausurfragen, wo ich mir mit der Antwort nicht sicher bin:
1) Was ist zur Übersetzingszeit bereits feststellbar und relevant?
-Die Quelltextkonventionen wurden eingehalten

2) Wenn der Compiler den Lesezugriff auf Variable zulässt, dann erhält man garantiert einen wohldefinierten Wert.

Es soll immer mit wahr oder falsch geantwortet werden.

Zu 1)
Feststellbar ist es. Ist es aber relevant? Kommt ja drauf an für wen. Dem Compiler ist es z.B. ziemlich egal.

Zu 2) Die Frage verstehe ich überhaupt nicht.

Ich hoffe, ihr tut hier mal eure Meinung kund :)
Vielen Dank!
 

Gucky

Top Contributor
Zu 2: Ich glaube damit ist gemeint, dass in der Variable etwas richtiges drinstehen wird und nicht, dass da noch etwas drinsteht, was jemand anders da hingeschrieben hat aber nicht mehr benötigt. Besonders bei Objekten wäre das fatal.

Zu 1: Das verstehe ich nicht :D
 

Ruzmanz

Top Contributor
1) Was ist zur Übersetzingszeit bereits feststellbar und relevant?
-Die Quelltextkonventionen wurden eingehalten

Ist falsch. Nach meiner Auffassung ist eine Quelltextkonvention nur eine "anerkannte, aber nicht bindende Vereinbarung zwischen Entwicklern". Zum Übersetzungszeitpunkt kann man feststellen, dass die Quelltextkonventionen nicht eingehalten wurde, aber das interessiert den Compiler nicht:

Java:
public class nEUEKLASSE_ {
  public void HausaufgabenGIB() {
    return "abc";
  }
}

2) Wenn der Compiler den Lesezugriff auf Variable zulässt, dann erhält man garantiert einen wohldefinierten Wert.

Da ich "null" als wohldefinierten Wert anerkenne, trifft diese Aussage zu. Wobei ich die Definition von "wohldefiniert" nicht kenne.
 

Gucky

Top Contributor
In älteren Programmiersprachen oder in welchen, die den Programmierer nicht so an die Hand nehmen, wie Java (bitte keinen Flamewar) kann es sein, dass man eine Variable deklariert hat, sie einen Speicherplatz bekommen hat, an diesem Ort aber noch etwas steht, was nicht als dieses Objekt oder NullPointer interpretierbar ist, weil man die Variable nicht definiert hat. Das kann zu ernsten Problemen führen, wenn man lesend auf diese Variable zugreift. Bei primitiven Datentypen ist das noch kein allzu großes Problem. Dann steht da halt etwas komisches drin. Bei Objekten ist das schon schlimmer. Dann steht an dem Ort vielleicht ein Bild aber der Prozessor versucht dieses Bild "auszuführen", was in der Regel zum Absturz des Programmes führt.
 

ThommyTom

Aktives Mitglied
@Ruzmanz
Magst du das bitte noch einmal kurz erläutern? Was wohldefiniert in diesem Zushg. bedeutet, weiß ich auch nicht. Haben wir nie definiert.
 

Gucky

Top Contributor
Ich glaube, mit "wohldefiniert" ist ein Wert gemeint, der zu diesem Variablentyp passt. Bei Objekten ein
Code:
null
oder eine Referenz. Bei Zahlen irgendwas, da alle Binärdaten als Zahlen interpretierbar sind. In einer String-Variable kann aber nur etwas stehen, was auch zu einem String passt, sonst versucht der Prozessor, wie gesagt, etwas auszuführen, was in dem Kontext nicht hinhaut und baut so nur S******.
 

Ruzmanz

Top Contributor
Nehmen wir die Anweisung
Code:
int i;
. Als Java-Entwickler weis ich, dass
Code:
i == 0
ist. Wird die Anweisung hingegen in C geschrieben, dann kann ich nicht mit Sicherheit sagen, dass
Code:
i == 0
ist. i verweist nur auf eine Speicherstelle, wo z.B. 1694 stehen könnte. Also ist i in C nicht wohl definiert. Wenn ich mich richtig erinnere, dann sind alle Werte in Java wohl definiert, weil man zu jedem Zeitpunkt mit 100% Sicherheit sagen kann, welchen Inhalt eine Variable besitzt. Kenne aber genügend Leute die in Java
Code:
int i = 0
schreiben und dann nochmal betonen: "Man kann ja nie wissen.". Deshalb könnte man sicherlich auch über folgenden Code 1-2 Bücher verfassen:

Java:
public class Java() {
  public int i;
}

PS: Ich gehe in einem Java-Forum von einer Java-Klausur aus.
 

ThommyTom

Aktives Mitglied
Ja genau, es ist eine Java-Klausur ;) Danke für die Erklärung :)

Könnt ihr das nun einmal mit der Frage verbinden? Ich kann das nicht miteinander verbinden.
 

Gucky

Top Contributor
Der Java Compiler ist schlau genug und passt auf, dass einer Variable immer vor dem ersten lesenden Aufruf initialisiert wurde. Also: man kann (und muss) davon ausgehen, dass in einer Variable, wenn der Compiler das Lesen zulässt, ein Wert steht, der auf diesen Typ passt oder mit anderen Worten der Speicherplatz mit diesem Objekt beschrieben wurde.
 

JavaMeister

Gesperrter Benutzer
Diese Aussage ist falsch.

1. Müssen Objektvariablen nicht intialisiert werden. Sie bekommen dann einen für ihren Typ passenden Defaultwert.

2. In einem Objekt muss nicht unbedingt der erwartete Typ zur Laufzeit drin sein. Wenn das so wäre, hätten wir niemals ClassCastExceptions.
 

Gucky

Top Contributor
ClassCastExceptions hat man auch, wenn du eine Klasse A und zwei Klassen B und C, die beide von A Erben und du versuchst C nach B zu casten, wenn C in einer Variable vom Typ A steht.
Dann versuch doch mal einen String in einen Integer zu schreiben.

Ich weiß nicht, was du für einen Compiler hast aber meiner meckert immer, wenn ich eine Variable nicht initialisiert habe, aber lesend drauf zugreife.
 
Zuletzt bearbeitet:

JavaMeister

Gesperrter Benutzer
ClassCastExceptions hat man auch, wenn du eine Klasse A und zwei Klassen B und C, die beide von A Erben und du versuchst C nach B zu casten, wenn C in einer Variable vom Typ A steht.

Stimmt auch nicht 100 % aber wäre Haarspalterei. Muss nicht unbedingt etwas mit Vererbung zu tun haben.

Dann versuch doch mal einen String in einen Integer zu schreiben.

Hmm "geht nicht" ohne weiters. Aber habe ich auch nie bezweifelt.

Du hast was ganz anderes geschrieben.

Ich weiß nicht, was du für einen Compiler hast aber meiner meckert immer, wenn ich eine Variable nicht initialisiert habe, aber lesend drauf zugreife.

Würde bedeuten, dass das nicht kompilierbar wäre bei dir?

Java:
public class Test {

	public String meinString;
	
	public int meinInt;
	
	public void print() {
		System.out.println(meinString);
		System.out.println(meinInt);
	}
	
	public static void main(String[] args) {
		new Test().print();
	}
}

Beachte bitte den feinen unterschied zwischen Objektattributen und lokalen Variablen.
 

Gucky

Top Contributor
Ich habe auch gesagt, dass sie initialisiert wurde. Von wem und ob es im Code steht ist was anderes. ;)

Was habe ich denn beschrieben?
 

Ähnliche Java Themen

Neue Themen


Oben