# Falsches Warning in IntelliJ?



## Thallius (28. Aug 2019)

Hi,

dieser 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 (28. Aug 2019)

Thallius hat gesagt.:


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


Wenn die Eingangsbedingung 
	
	
	
	





```
!(allFeUsed = checkAllFEUsed(group, allFEList, preferredFE)))
```
erfüllt ist, kann die zweite Bedingung

```
if( allFeUsed)
```
nie erfüllt sein. --> Die Warnung ist korrekt.


----------



## mrBrown (28. Aug 2019)

Wie ist `allFeUsed` denn initialisiert?


----------



## Thallius (28. Aug 2019)

mrBrown hat gesagt.:


> Wie ist `allFeUsed` denn initialisiert?



Ist das nicht egal? Es wird ja in der If intialisiert wenn avoidAllFEUsed true ist

Gruß

Claus


----------



## mrBrown (28. Aug 2019)

Blender3D hat gesagt.:


> Wenn die Eingangsbedingung


Die Eingangsbedingungen sind verodert, die gesamte Bedingung kann also auch mit wahrem `allFeUsed` zutreffen


----------



## Blender3D (28. Aug 2019)

mrBrown hat gesagt.:


> Die Eingangsbedingungen sind verodert, die gesamte Bedingung kann also auch mit wahrem `allFeUsed` zutreffen


Stimmt


----------



## fhoffmann (28. Aug 2019)

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


----------



## mrBrown (28. Aug 2019)

Thallius hat gesagt.:


> 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  )


----------



## Thallius (28. Aug 2019)

mrBrown hat gesagt.:


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



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 (28. Aug 2019)

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 (28. Aug 2019)

mrBrown hat gesagt.:


> 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 (28. Aug 2019)

Thallius hat gesagt.:


> 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 (28. Aug 2019)

mrBrown hat gesagt.:


> 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 (28. Aug 2019)

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 (28. Aug 2019)

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


----------

