Falsches Warning in IntelliJ?

Diskutiere Falsches Warning in IntelliJ? im IDEs und Tools Bereich.
Thallius

Thallius

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
 
Blender3D

Blender3D

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.
 
F

fhoffmann

Die Zuweisung an allFeUsed im oder wird nur ausgeführt, wenn die erste Bedingung (vor dem oder) falsch ist.
 
mrBrown

mrBrown

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 :p )
 
Thallius

Thallius

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 :p )
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.
 
mrBrown

mrBrown

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...
 
Thallius

Thallius

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.
 
mrBrown

mrBrown

Initialisierung von allFEUsed erfolgt genau eine Zeile über dem Code den ich gepostet habe. boolean allFEUsed = false;
Na dann ist doch klar, dass innerhalb des if's allFEUsed niemals wahr ist :) Würd das innere if einfach wegnehmen, kann ja nie zutreffen, und dann ist auch die Variable überflüssig...
 
Thallius

Thallius

Na dann ist doch klar, dass innerhalb des if's allFEUsed niemals wahr ist :) Würd das innere if einfach wegnehmen, kann ja nie zutreffen, und dann ist auch die Variable überflüssig...
Hmm ok, jetzt ist der Knoten geplatz. Die Loggerausgabe muss kommen wenn avoidAllFEUsed = false ist und allFEUsed = true, aber den Zustand bekomme ich ja gar nicht.
 
Thallius

Thallius

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
 
mrBrown

mrBrown

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
 
Thema: 

Falsches Warning in IntelliJ?

Passende Stellenanzeigen aus deiner Region:
Anzeige

Neue Themen

Anzeige

Anzeige
Oben