if (obj == null || obj.isEmpty())

Status
Nicht offen für weitere Antworten.

Rock Lobster

Bekanntes Mitglied
Servus,

gibt es eigentlich eine Garantie, daß ein Konstrukt wie dieses...
Code:
if (obj == null || obj.isEmpty())
...immer von links nach rechts ausgewertet wird, sodaß ich unbesorgt nach dem || eine Methode des Objekts aufrufen kann, weil dieser Aufruf ja, sofern es null ist, sowieso nicht getätigt wird, da die If-Abfrage bereits nach dem "== null"-Vergleich rausspringt?

Oder könnten das andere Compiler auch genau andersrum machen, wodurch es dann unter Umständen zu einer NullPointerException kommen kann?
 

The_S

Top Contributor
Verwende den Compiler von Sun und auch dieselbe VM und du solltest das Problem nicht haben (zumal ich aber auch bezweifle, dass ein anderer Compiler die Argumente umdreht ...).
 
S

SlaterB

Gast
jeder Compiler kann es machen wie es will, aber wenn er sowas macht, dann kann er auch gleich die Festplatte formatieren,
ein anständiger Compiler ist verpflichtet, von links nach rechts auszuwerten,

das gilt schon für |, aber gerade || hat ja die besondere Bedeutung, dass rechts nicht ausgewertet wird wenn links true ergibt,
darauf verlassen sich alle Programmierer
 

Rock Lobster

Bekanntes Mitglied
Okay das wollte ich hören. Natürlich kann ein Compiler Mist bauen, aber ich meinte das jetzt mehr von der Richtung "ist das so in den Java-Standards / Java-Richtlinien definiert".

Wenn Du sagst, daß || die von Dir angesprochene "besondere Bedeutung" hat, dann wird das wohl so sein ;)

Ich nehme an, unter C/C++ gelten dann die gleichen Regeln?
 

function

Bekanntes Mitglied
Es gibt leider keine wirklichen Java-standarts. Es ist grundsätzlich jedem Compilerentwickler freigestellt, wie er die sprach elemente umsetzt. Allerdings ist mir keine programmiersprache bekannt bei der if abfragen nicht von links nach rechts gelesen werden. Vorallem bei || und &&, ansonsten wären diese beiden elemente sinnlos.
 

Murray

Top Contributor
Java-Language-Specification hat gesagt.:
15.24 Conditional-Or Operator ||
The || operator is like | (§15.22.2), but evaluates its right-hand operand only if the value of its left-hand operand is false.
Also: eine VM, die sich hier anders verhält, wäre nicht spezifikationskonform; insofern kann man sich darauf verlassen, dass solche Konstrukte funktionieren.
 

Rock Lobster

Bekanntes Mitglied
Es gibt leider keine wirklichen Java-standarts. Es ist grundsätzlich jedem Compilerentwickler freigestellt, wie er die sprach elemente umsetzt.

Naja klar, aber ein paar Regelungen gibt es ja schon, z.B. kann ja ein Compilerentwickler nicht einfach die Bedeutung von "private" und "public" vertauschen. Okay, er könnte es, aber der Compiler würde dann nicht als "gültiger Java-Compiler" bezeichnet werden können. So meinte ich das mit den "Standards" ;) und Sun-Richtlinien gibt's ja schon immer wieder zu lesen.
 

Murray

Top Contributor
function hat gesagt.:
Es gibt leider keine wirklichen Java-standarts. Es ist grundsätzlich jedem Compilerentwickler freigestellt, wie er die sprach elemente umsetzt.
Das stimmt m.E. nicht; ein Compiler muss zumindest die JLS einhalten, um sich wirklich "Java"-Compiler nennen zu können.
 

tfa

Top Contributor
function hat gesagt.:
Es gibt leider keine wirklichen Java-standarts. Es ist grundsätzlich jedem Compilerentwickler freigestellt, wie er die sprach elemente umsetzt. Allerdings ist mir keine programmiersprache bekannt bei der if abfragen nicht von links nach rechts gelesen werden. Vorallem bei || und &&, ansonsten wären diese beiden elemente sinnlos.

"Java-Standarts" gibt es wirklich nicht. Der Standard für Java nennt sich JLS und legt das Verhalten des ||-Operators genau fest:
java.sun.com/docs/books/jls/third_edition/html/expressions.html#15.24

tfa
 

Kim Stebel

Bekanntes Mitglied
Sun setzt seine Markenrechte an "Java" so ein, dass sich kein Java-Compiler so nennen darf, wenn er die Standards, namentlich die Java Language Specification nicht einhält.
 

me1357

Mitglied
Rock Lobster hat gesagt.:
Ich nehme an, unter C/C++ gelten dann die gleichen Regeln?
In C++ kannst du Operatoren überladen. Und wenn man den ||-Operator überlädt, dann werden afaik immer beide Seiten ausgewertet, man kann sich also in C++ nicht generell darauf verlassen.
 

Jango

Gesperrter Benutzer
me1357 hat gesagt.:
In C++ kannst du Operatoren überladen. Und wenn man den ||-Operator überlädt, dann werden afaik immer beide Seiten ausgewertet, man kann sich also in C++ nicht generell darauf verlassen.
Zeig mir mal bitte, wie man in C++ logische Operatoren überlädt.
 

me1357

Mitglied
Jango hat gesagt.:
Zeig mir mal bitte, wie man in C++ logische Operatoren überlädt.
Nicht anders, als man dass bei allen anderen Operatoren auch macht.
Code:
#include <iostream>
using namespace std;

class foo {
	public:
		void operator||(bool)
		{
			cout << "Hello, world!" << endl;
		}
};

int main ()
{
	foo a;
	a || true;
}
 

Saxony

Top Contributor
Hiho,

man kann sich das natürlich auch ganz sicher hinschreiben:

Code:
int i = 0;

if (obj == null) {

    i = 1;
} else if (obj.isEmpty()) {

    i = 1;
}

if (i & 1) {

    // jetzt mache das was bei "obj == null || obj.isEmpty()" gemacht werden soll
}

Sieht aber etwas gestelzt und unschön aus. :D
Zudem hat man nun ein und draus gemacht. :)

bye Saxony
 

Murray

Top Contributor
Saxony hat gesagt.:
Sieht aber etwas gestelzt und unschön aus. :D
Zudem hat man nun ein und draus gemacht. :)
Außerdem hat man
- eine überflüssige Variable i
- ein bis zwei überflüssige Zuweisungen( i=0, i=1)
- eine Bedingung, deren Semantik nicht aus der Anweisung allein erschließt ( if ( i & 1))

Letzeren Nachteil kann man mit einer sinnvoll benamten Bool'schen Hilfvariablen vermeiden:
Code:
boolean empty = false;
if (obj == null) {
    empty = true;
} else if (obj.isEmpty()) {
    empty = true;
}

if ( empty) {
    // jetzt mache das was bei "obj == null || obj.isEmpty()" gemacht werden soll
}

Sinvoll ist das alles aber eigentlich nicht: wie oben schon mehrfach erwähnt wurde, ist das in Rede stehende Konstrukt (verflucht, hier schleicht sich gerade Versicherungssprech ein) hinreichend sicher.
 

Kim Stebel

Bekanntes Mitglied
das ist nicht nur hinreichend sicher, dass ist genau so ein Bestandteil der Sprache Java wie "If-else-Blöcke. Wenn ihr dem Compiler bei ersterem nicht trauen wollt, wieso dann bei letzterem?
 

jPat

Bekanntes Mitglied
x

[edit] xx [/edit]

Bei eurem problem spielt doch die linksassoziativität des Operators || eine Entscheisdene Rolle.
Da kann man sich IMMER drauf verlassen.
 

Jango

Gesperrter Benutzer
Hobbit_Im_Blutrausch hat gesagt.:
Da hat aber jemand sein geballtes Wissen in einem einzigen Post entladen ...
...und trotz der immensen Fülle an Infos, immer noch sehr übersichtlich gehalten. So, dass man es sofort versteht... :lol:
 
Status
Nicht offen für weitere Antworten.
Ähnliche Java Themen
  Titel Forum Antworten Datum
Zrebna Wieso sollte man Null-Prüfungen nicht mit Optional-Objekten nutzen? Allgemeine Java-Themen 13
Zrebna SonarLint: Warum kein Null-Referencing-CodeSmell-Hint hier? Allgemeine Java-Themen 23
OnDemand Java String in Hashmap als Key NULL Allgemeine Java-Themen 27
8u3631984 Argument Captor liefert NULL zurück Allgemeine Java-Themen 2
E Class.getResourceAsStream() gibt null zurück Allgemeine Java-Themen 2
Zrebna Gibt es eine Möglichkeit eine NPE zu vermeiden, wenn null returned wird? Allgemeine Java-Themen 3
J Zahlen Abstand zur Null bestimmen Allgemeine Java-Themen 11
C javax.mail.Message message.setreplyto() null setzen (keine replyto Adresse) Allgemeine Java-Themen 25
S An internal error occurred during: Launching null argument Allgemeine Java-Themen 1
S Validation Null aber nicht Blank und muss Email sein Allgemeine Java-Themen 22
L Google Guice Field Injection returns null Allgemeine Java-Themen 2
E RMI NULL-Pointer-Exeception wenn der RMI-Proxy eine Methode deligiert Allgemeine Java-Themen 2
J Java Objekte = null, Garbagecollector Allgemeine Java-Themen 12
N MsgPack - Null Check Allgemeine Java-Themen 5
T JasperReports mit Null Pointer Allgemeine Java-Themen 3
DanielsLPecke Compiler-Fehler Warum ist der String null? Allgemeine Java-Themen 10
M Warten bis Variabel nicht null ist Allgemeine Java-Themen 18
Thallius Simple JSON Parser Error null Allgemeine Java-Themen 6
M Null byte in verschiedenen charsets Allgemeine Java-Themen 2
S Lambda Ausdrücke: @FunctionalInterface Instanzen auf null prüfen Allgemeine Java-Themen 9
B [Android] EditText-Object ist null - Nimmt nicht den Wert des enthaltenen Textfeldes ein Allgemeine Java-Themen 2
D Java Process OutputStream ist null Allgemeine Java-Themen 4
O log4j, Problem bei Ausgabe null-Wert Allgemeine Java-Themen 0
T InvalidClassException - Read null attempting to read class descriptor for object Allgemeine Java-Themen 8
D Problem mit führender Null bei Schlüsselerzeugung Allgemeine Java-Themen 5
T Variablenübergabe liefert immer null Allgemeine Java-Themen 13
K Image beim catchen ist immer null Allgemeine Java-Themen 9
B Load of Known null Value Allgemeine Java-Themen 9
W Kleine Frage zu Null-Pinter-Exception Allgemeine Java-Themen 21
T Array Sortieren (null Werte ans Ende) Allgemeine Java-Themen 2
S Null Pointer Exception bei BufferedReader Allgemeine Java-Themen 4
M Objekt prüfen auf null ->Invocation Target Exception??? Allgemeine Java-Themen 2
Tobse Vererbung null aus Elternklasse "dominant"? Allgemeine Java-Themen 15
E Queue: Wie kann hier ein null-Pointer Exception auftreten?! Allgemeine Java-Themen 11
I newInstance() liefert null zurück Allgemeine Java-Themen 4
R Attribut null Allgemeine Java-Themen 6
C Regex: Zahl ohne führende Null Allgemeine Java-Themen 13
E rückgabewert ist immer null Allgemeine Java-Themen 2
N List auf null prüfen Allgemeine Java-Themen 2
TiME-SPLiNTER Von Unix, InputStreams und Null Bytes Allgemeine Java-Themen 2
R dateFormat - Uhr fängt nicht bei null an Allgemeine Java-Themen 2
P Null in ArrayList Allgemeine Java-Themen 3
N Strings mit null wiedergabe Splitten Allgemeine Java-Themen 4
mongole Formatter + null Allgemeine Java-Themen 4
X Prozess-Objekt nach Ausführung der destroy-Methode null oder nicht null ? Allgemeine Java-Themen 10
A Umgang mit null Allgemeine Java-Themen 16
L Object = null? Allgemeine Java-Themen 16
L null pointer exception Allgemeine Java-Themen 10
nrg Leere Objektreferenz mit != null vergleichen Allgemeine Java-Themen 4
J Null Pointer in der compare-Methode des Comparators? Allgemeine Java-Themen 18
T Set.contains() auch false wenn value == null? Allgemeine Java-Themen 4
D Matrix, ArrayList, null-Zellen Allgemeine Java-Themen 6
F Hibernate speichern - Null Allgemeine Java-Themen 5
knuckles12 null pointer exception bei arrays Allgemeine Java-Themen 6
T WeakHashMap: Wie "null" effizient abfangen? Allgemeine Java-Themen 5
N Null Durchblick in Java, Jobwechsel? Allgemeine Java-Themen 19
M nichtreferenzierte Objekte auf NULL setzen -> Performance Allgemeine Java-Themen 4
S JFreeChart LineChart Punkte über NULL Werte hinweg verbinden Allgemeine Java-Themen 5
N Array mit null Werten filtern Allgemeine Java-Themen 5
S Combobox --> liefer null? Allgemeine Java-Themen 3
A java.net.UnkownHostException: null bei jar-File Allgemeine Java-Themen 16
B Null Pointer Exception bei Canvas-objekt-Aufruf Allgemeine Java-Themen 12
H NullPointerException trotz Abfangen von null? Allgemeine Java-Themen 9
P <null> in einer DB abfragen Allgemeine Java-Themen 4
G Nicht abgefangene Null-Pointer-Exception Allgemeine Java-Themen 2
P Image auf einem Panel mit null-Layout Allgemeine Java-Themen 8
M getResourceAsStream immer null Allgemeine Java-Themen 4
R Array komplett auf null setzen Allgemeine Java-Themen 10
A JasperReport Detail bringt null bei Datenübergabe Allgemeine Java-Themen 4
S Null Pointer Exception Allgemeine Java-Themen 10
S instanceof und null Allgemeine Java-Themen 7
M Führende Null in einem Datum Allgemeine Java-Themen 3
L null != null ? Allgemeine Java-Themen 16
Redfrettchen Rückgabe nicht sinnvoll: Exception oder null zurück? Allgemeine Java-Themen 9
B Null- oder IllegalArgumentException Allgemeine Java-Themen 12
C ImageIO die read-Methode liefert mir ein null- Wert zurück Allgemeine Java-Themen 10
K Exception im Konstruktor / Objekt == null Allgemeine Java-Themen 7
Z bedeutung (übersetzung) von null? Allgemeine Java-Themen 5
T Exception im Constructor -> null-Referenz zurückgeben Allgemeine Java-Themen 6
C Objekte null setzen? Allgemeine Java-Themen 7
E Welche Java-Version kennt isEmpty() ? Allgemeine Java-Themen 2
T List.isEmpty() klappt nicht?!?!? Allgemeine Java-Themen 5

Ähnliche Java Themen

Neue Themen


Oben