Falsches Warning in IntelliJ?

Thallius

Top Contributor
Hi,

dieser Code

Code:
if(!avoidAllFEUsed || !(allFeUsed = checkAllFEUsed(group, allFEList, preferredFE)))
{
      if(checkToolsForJob(group))
      {
                if( allFeUsed)
                {

produziert ein IDE Warning

Condition 'allFeUsed' is always 'false'

Übersehe ich da was oder hat er unrecht?

Gruß

Claus
 
if(!avoidAllFEUsed || !(allFeUsed = checkAllFEUsed(group, allFEList, preferredFE))) { if(checkToolsForJob(group)) { if( allFeUsed) {
Wenn die Eingangsbedingung
Java:
!(allFeUsed = checkAllFEUsed(group, allFEList, preferredFE)))
erfüllt ist, kann die zweite Bedingung
Java:
if( allFeUsed)
nie erfüllt sein. --> Die Warnung ist korrekt.
 
Ist das nicht egal? Es wird ja in der If intialisiert wenn avoidAllFEUsed true ist
Ne, initialisiert wird's vorher, und im if wird's eben nur nur zugewiesen, wenn avoidAllFEUsed wahr ist, dann ist ist die gesamte Bedingung aber nur wahr, wenn allFeUsed falsch ist.

Wenn avoidAllFEUsed wahr ist, muss allFeUsed falsch sein, damit die Bedingung zutrifft - das innere if spielt also keine Rolle.
Wenn avoidAllFEUsed falsch ist, wird allFeUsed nicht neu zugewiesen und der Initialwert im inneren if genutzt.

(Und btw, solche Zuweisungen sind scheiße 😛 )
 
Ne, initialisiert wird's vorher, und im if wird's eben nur nur zugewiesen, wenn avoidAllFEUsed wahr ist, dann ist ist die gesamte Bedingung aber nur wahr, wenn allFeUsed falsch ist.

Wenn avoidAllFEUsed wahr ist, muss allFeUsed falsch sein, damit die Bedingung zutrifft - das innere if spielt also keine Rolle.
Wenn avoidAllFEUsed falsch ist, wird allFeUsed nicht neu zugewiesen und der Initialwert im inneren if genutzt.

(Und btw, solche Zuweisungen sind scheiße 😛 )

Ok aber ich wüßte jetzt nicht wie ich es "schöner" machen sollte. Das Abfragen vobn allFEUsed innen ist nur um ein Warning in den Log zu schreiben. Dieses Warning darf aber nur kommen wenn checkTools nicht fehlschlägt.
 
Nur mir dem Code-Stück schlecht zu sagen, was man anders machen könnte.

Für den Anfang u.U. allFEUsed sinnvoll initialisieren, das aktuelle scheint ja nicht gewünscht zu sein (zumindest wird ja aktuell nie geloggt). Vielleicht kann man auch die Zuweisung erstmal daraus ziehen (je nachdem, ob die Methode aufgerufen werden darf oder ob das zu Problemen führt). Falls die innere Bedingung einen Fehlerzustand loggen soll, kann man das möglicherweise auch vorher schon abfangen. Schwierig, da irgendwas konkretes zu empfehlen...
 
Nur mir dem Code-Stück schlecht zu sagen, was man anders machen könnte.

Für den Anfang u.U. allFEUsed sinnvoll initialisieren, das aktuelle scheint ja nicht gewünscht zu sein (zumindest wird ja aktuell nie geloggt). Vielleicht kann man auch die Zuweisung erstmal daraus ziehen (je nachdem, ob die Methode aufgerufen werden darf oder ob das zu Problemen führt). Falls die innere Bedingung einen Fehlerzustand loggen soll, kann man das möglicherweise auch vorher schon abfangen. Schwierig, da irgendwas konkretes zu empfehlen...

Initialisierung von allFEUsed erfolgt genau eine Zeile über dem Code den ich gepostet habe. boolean allFEUsed = false;
checkAllFEUsed sollte nur aufgerufen werden wenn die erste Bedingung fehlschlägt, da das ein Codestück aus dem inneren einer sehr komplexen Berechnung ist (Deshalb auch nur das kleine Codestück) und dort jede unnötige Berechnung gespart werden muss.
 
So habe jetzt das Loggin in die checkAllFEUsed gepackt. Muste dafür zwar paar zusätzliche Parameter an die Methode geben die dummerweise echt nur fürs Loggin gebraucht werden aber ich glaube ich trotzdem der sauberer Weg.

Danke für die Hilfe

Claus
 
Kommt drauf an, Dinge weiterreichen nur für's Logging ist nicht unbedingt der saubere Weg - die Methode loggt ja dann Dinge, die sie eigentlich nicht kennt.

u.U. kann man das sinnvoll umstrukturieren, etwa das erste if aufzulösen und den zweiten Teil vorher separat machen
 

Neue Themen


Zurück
Oben