Warum macht man "if(true)"

GilbertGrape

Bekanntes Mitglied
Hallo,

eigentlich ist es keine java-spezifische Frage, aber egal.

Ich versuche gerade, mittels Sonar, unsere Entwickler ein bißchen für Software-Qualität zu sensibilisieren.

Dabei bin ich auf eine Violation gestoßen, die nicht selten auftritt, nämlich: "Unconditional If Statement"
Also einfach sowas hier:

Java:
if (true){
blabla
}

Es gibt ja einige Dinge, die man nicht machen soll, bei denen ich aber verstehe warum das gemacht wurde, aber bei diesem irgendwie gar nicht.

Warum macht man sowas? Das soll jetzt nicht irgendwie verurteilen oder so, ich möchte das einfach nur mal wissen.

Gruß
GilbertGrape
 
F

Firephoenix

Gast
Ich könnte mir vorstellen, das sowas entsteht wenn man aufräumt und irgendwann den Fall hat das die Bedingung immer eintritt und sie irgendwann durch true ersetzt.
Da
Java:
if (true){
blabla
}
aber äquivalent ist zu
Java:
blabla
(zumindest solange sich die semantik von true nicht ändert - was aber wohl eher unwahrscheinlich ist),
gehört das einfach aus dem Code rausgeräumt, das sind 2 Zeilen Altlast die beim Arbeiten stören.

Gruß
 
T

Tomate_Salat

Gast
Ich schreibe solche Konstrukte manchmal für Entwicklungs-/Testcode der eine bestehende Methode erweitert [aber eigentl. nur dann, wenn diese eine längere Ausführungszeit hat]. Dann schaut das aber i.d.R so aus:
Java:
if(true) { // wobei ich hier meistens true durch eine Variable ersetze, die true ist und ggf als Schalter funktionieren kann.
  //... code der ausgeführt werden soll
  return;
}

// ... code der i.d.R lange zum ausführen braucht und somit das Testen stört.

Wenn aber der Code in der Bedingung fertig und funktionsfähig ist, entferne ich das if-konstrukt.
 
F

Firephoenix

Gast
@Tomate_Salat
ohne eine ausgelagerte variable wie z.b.
Java:
public static final boolean REMOVE_AFTER_TESTS = true;

und dann
Java:
if(REMOVE_AFTER_TESTS){
//...
return;
}

sähe das aber ziemlich gefährlich aus, zumindest wenn man das mal in 3 Methoden gleichzeitig macht und dann eine vergisst wenn man fertig ist mit Testen ;)

Gruß
 

parabool

Bekanntes Mitglied
weiterer Grund:
Wenn du eine Methode vorzeitig mittels return verlassen willst (beim Testen, um irgendwas nach dem return auszublenden)

if(true)return;

ansonsten Fehler: Unreachable code

Edit: Tomate_Salat hats schon geschrieben
 
Zuletzt bearbeitet:

Marco13

Top Contributor
Das ist eine Möglichkeit zum schnellen Ein/Ausschalten von blocks - entsprechend einem #ifdef in C. Ein "echtes" Auskommentieren kann unerwünschte Folgen haben (/* Nested /* comments */ */, "unused variable"-Warnungen, "unreachable statement"-Fehler). Ich bevorzuge für sowas aber eher
Java:
boolean doSomeDebuggingTest = false;
doSomeDebuggingTest = true;
if (doSomeDebuggingTest) 
{
....
}
weil man dann erstens "den Block benennen" kann (ah, das ist ein debugging-Test), und zweitens durch ein/auskommentieren einer einzigen Zeile den Block ein/ausschalten kann.

Wie das Beispiel aber schon zeigt verwende ich das in erster Linie für debugging-Tests oder sehr spezielle (z.B. experimentelle oder verläufige) Teile, und wenn sowas exzessiv in "Production Code" auftaucht wäre das schon suspekt...
 
S

SlaterB

Gast
für Normalcode fällt mir nichts ein, aber das Beispiel von Tomate_Salat möchte ich auch bekräftigen,

ein einfaches return;, wenn man mal einen anderen Ablauf haben will, gibt Compilerfehler mit Code dahinter,
if (true) ist nette Möglichkeit das doch zu erlauben,

könnte der Compiler eigentlich auch erkennen, hinter
while(true) {}
läßt er schließlich auch keinen Code zu,
und if (true) mit return drin kann genausowenig danach noch fortgesetzt werden,
und normales return erkennt der Compiler ja auch und und und ;)
 
Zuletzt bearbeitet von einem Moderator:

AlexSpritze

Bekanntes Mitglied
für Normalcode fällt mir nichts ein, aber das Beispiel von Tomate_Salat möchte ich auch bekräftigen,

ein einfaches return;, wenn man mal einen anderen Ablauf haben will, gibt Compilerfehler mit Code dahinter,
if (true) ist nette Möglichkeit das doch zu erlauben,

könnte der Compiler eigentlich auch erkennen, hinter
while(true) {}
läßt er schließlich auch keinen Code zu,

Weiß jemand, wieso der Compiler hinter dem if kein unreachable Code sieht, hinter dem while aber schon? Das ist mir schon häufiger aufgefallen, aber ich kann es mir nicht erklären.
 

Paddelpirat

Bekanntes Mitglied
Weiß jemand, wieso der Compiler hinter dem if kein unreachable Code sieht, hinter dem while aber schon? Das ist mir schon häufiger aufgefallen, aber ich kann es mir nicht erklären.

Weil die Bedingung für das if nur einmal abgefragt wird und man bei while(true) eine endlosschleife hat.
bei if(true) ist der Code dahinter ja nur nicht mehr erreichbar, wenn in dem if-Block ein return steht.
 

Rudolf

Bekanntes Mitglied
Man sollte bei Sprachen, die Polymorphismus unterstützen, auf Conditionals wie möglich verzichten, boolean gehören dazu.

Außerdem kenne ich eine if(true)-Kondition, wenn Code generiert wird. Irgendwann ändert sich der Generatorcode und dann ist es am einfachsten eine Condition durch if(true) zu ersetzen.
 

AlexSpritze

Bekanntes Mitglied
Weil die Bedingung für das if nur einmal abgefragt wird und man bei while(true) eine endlosschleife hat.
bei if(true) ist der Code dahinter ja nur nicht mehr erreichbar, wenn in dem if-Block ein return steht.

Ich hätte es expliziter schreiben sollen:

Java:
if(true) {
return;
}
System.out.println("Never to be executed?");

Java:
while(true) {
}
System.err.println("Never to be executed!");


Man sollte bei Sprachen, die Polymorphismus unterstützen, auf Conditionals wie möglich verzichten, boolean gehören dazu.
Quelle?
 

AlexSpritze

Bekanntes Mitglied
Ah okay, in dem Fall würde ich mal raten, dass es damit zu tun hat, dass du aus dem while(true) von selbst nicht raus kommst, während sich dein Programm durch das if(true) return nicht aufhängt, sondern nur einen anderen Rückgabewert liefert.

Trotzdem hängt hinter beiden Konstrukten "Unreachable code" von daher verstehe ich nicht, wieso das bei
Code:
if
okeh ist aber bei
Code:
while
einen Fehler beim Kompilierer auslöst.

Egal was ich hinter
Code:
if(true)return;
schreibe, das wird nie ausgeführt...
 
S

SlaterB

Gast
hier noch ein Beispiel
Java:
methodA() {
   if(true) return;
}

methodB() {
   // Code weiter hinten in der Datei
}

"hinter if" ist schon sehr genau belegt, im gleichen Block, ohne solche Spielereien

edit:
ok, hätte Scherz auch für sich stehen lassen..,
lese zu oft tatsächliches Besserwissen ;)
 
N

nillehammer

Gast
Noch mal zur Ursprungsfrage: Möglicherweise handelt es sich auch um den kläglichen Rest von "conditional compiling" Mit sonem Konstrukt hier kann man nämlich dafür sorgen, dass Quellcode nicht oder eben doch (je nach dem ob true oder false) im Bytecode auftaucht:
Java:
static final boolean COMPILE= true;

if(COMPILE) {
  // do sth.
}
So ein Konstrukt funktioniert mit Konstanten (also static final). Wahrscheinlich hat ein Entwickler das Konstrukt nicht verstanden und daraus ein
Code:
if(true)
gemacht. Könnte man über eine Versionshistorie in Eurem Quellcode-Repo nachvollziehen.
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
berserkerdq2 Jemand einen Tipp wie man ein Javafx-Hintergrund "dynamisch" macht Allgemeine Java-Themen 3
N Division macht Probleme Allgemeine Java-Themen 14
berserkerdq2 IJVM, ich tue auf meinen Stack 100 und 120 rein, danach subtrahiere ich, macht die Maschine 100-120 oder 120-100? Allgemeine Java-Themen 8
OnDemand Anzeigen was eine Applikation macht Allgemeine Java-Themen 1
H Swing HashMap zu Tabelle macht mir Probleme Allgemeine Java-Themen 4
M 4 Gewinnt KI macht nicht, was sie soll.. Allgemeine Java-Themen 1
P Eclipse Projekt anlegen macht Problem Allgemeine Java-Themen 1
WetWer Was bedeutet/macht ein Exit-Code Allgemeine Java-Themen 1
O OOP Wie macht man das am besten OO? Allgemeine Java-Themen 8
Thallius Macht das Sinn? Allgemeine Java-Themen 30
F Java Native/Shared Library (.so) laden macht Probleme Allgemeine Java-Themen 3
X Was macht folgender Code!? Allgemeine Java-Themen 6
J Doppelte Buchstaben löschen - letztes Wort macht er nicht Allgemeine Java-Themen 2
J if else Anweisung macht nicht was es soll. Wieso? Allgemeine Java-Themen 10
M Google App Engine macht Probleme Allgemeine Java-Themen 4
C Klassen Was macht diese Java-Mathe-Klasse? Allgemeine Java-Themen 2
S Erste Schritte Exception beendet Schleife nicht - Methode macht trotz throw weiter? Allgemeine Java-Themen 9
S Javadoc 3d einbinden macht probleme Allgemeine Java-Themen 10
B Unix-Timestamp > Date macht Probleme. Allgemeine Java-Themen 3
T Ausdruck mit pdfBox macht Probleme Allgemeine Java-Themen 2
B jar File macht probleme wegen einer Methode! Allgemeine Java-Themen 5
alderwaran jaxb xsd schema, min/maxoccurs macht was? Allgemeine Java-Themen 7
S AWT StringBuffer macht nicht, was ich erwarte Allgemeine Java-Themen 2
E Timer class macht einfach garnichts :/ Allgemeine Java-Themen 6
N Vokabelprogramm - Wer macht mit? Allgemeine Java-Themen 58
S Anschauen was der Compiler macht..? Allgemeine Java-Themen 5
bj99 ImageIO.write() macht Probleme Allgemeine Java-Themen 7
I Was macht static { ... } ? Allgemeine Java-Themen 8
N Für welche Art von Berechnungen macht JCUDA Sinn? Allgemeine Java-Themen 12
P JMF macht mich verrückt Allgemeine Java-Themen 3
R PDF Formular mit JPod ausfüllen macht Probleme Allgemeine Java-Themen 4
G Wie kriegt Klasse2 die Info, was Klassse1 gerade "macht Allgemeine Java-Themen 7
Escorter was macht createHorizontalGlue() Allgemeine Java-Themen 2
T Serialisierung: Wie macht RMI das so schnell? Allgemeine Java-Themen 14
J Was macht dieser Code? Allgemeine Java-Themen 13
S Was macht der Java-Verifier? Allgemeine Java-Themen 4
T Problem, warum macht der das so(finde kein titel.) Allgemeine Java-Themen 3
I Irre Website-Wie macht man sowas? Allgemeine Java-Themen 6
U if Abfrage macht etwas falsch Allgemeine Java-Themen 2
G javadoc macht probleme Allgemeine Java-Themen 2
A equals() macht nicht, was es soll Allgemeine Java-Themen 4
B Vergleichen von arrays macht Probleme Allgemeine Java-Themen 2
M JBoss macht Probleme Allgemeine Java-Themen 6
P Wie macht Sun Gewinn mit Java? Allgemeine Java-Themen 3
Maximum '.' in String ersetzen macht Schwierigkeiten Allgemeine Java-Themen 2
T Klassen samt Methoden aus Jar-Archiv laden macht Problem Allgemeine Java-Themen 9
M True or false Verständnis Allgemeine Java-Themen 5
S Algorithmus welcher True-Werte in einem Array findet und auswertet. Allgemeine Java-Themen 5
K Methoden Arrays auf true Werte prüfen Allgemeine Java-Themen 4
C SwingWorker.cancle(true) tötet alle Worker Allgemeine Java-Themen 3
S isDirectory() bei Dateien manchmal true Allgemeine Java-Themen 6
X JTable mit Checkboxen -> Setzen (true/false) der Checkboxen per Mouseklick... Allgemeine Java-Themen 3
D Wie fragt man Booleans auf true oder false ab? Allgemeine Java-Themen 18
J Konsolen Anwendung mit while(true) Allgemeine Java-Themen 6
S instanceof liefert true, aber cast funktioniert nicht! Allgemeine Java-Themen 6
B Window.setAlwaysOnTop(true) - Fokusverlust Allgemeine Java-Themen 4
ARadauer zuweisung ergibt doch true, oder? Allgemeine Java-Themen 17
F While(true)-Schleife im JPanel Allgemeine Java-Themen 9
H ganze zahl true / false Allgemeine Java-Themen 3
N Bekomme NIE ein TRUE obwohl ich es bekommen müsste :( Allgemeine Java-Themen 10

Ähnliche Java Themen

Neue Themen


Oben