ecoCode icon indicating copy to clipboard operation
ecoCode copied to clipboard

UnnecessarilyAssignValuesToVariables NullPointerException

Open wokier opened this issue 2 years ago • 1 comments

Hi

We observe a stack during analysis

Sonar 9.4 Maven 3.8.6 sonar-maven-plugin 3.8.0.2131 Java 18

[ERROR] Unable to run check class fr.cnumr.java.checks.UnnecessarilyAssignValuesToVariables - S63 on file 'fr/cnumr/java/sample/pdf/commons/Item.java', To help improve the SonarSource Java Analyzer, please report this problem to SonarSource: see https://community.sonarsource.com/

java.lang.NullPointerException: Cannot invoke "Object.toString()" because the return value of "org.sonar.plugins.java.api.tree.ReturnStatementTree.expression()" is null

at fr.cnumr.java.checks.UnnecessarilyAssignValuesToVariables$CheckUseVariableVisitor.visitReturnStatement(UnnecessarilyAssignValuesToVariables.java:152)

at org.sonar.java.model.statement.ReturnStatementTreeImpl.accept(ReturnStatementTreeImpl.java:70)

at org.sonar.plugins.java.api.tree.BaseTreeVisitor.scan(BaseTreeVisitor.java:40)
`package fr.cnumr.java.sample.pdf.commons.template;

import com.fasterxml.jackson.annotation.JsonIgnore; import com.fasterxml.jackson.annotation.JsonSubTypes; import com.fasterxml.jackson.annotation.JsonTypeInfo; import fr.cnumr.java.sample.pdf.commons.engine.Document; import fr.cnumr.java.sample.pdf.commons.template.*; import fr.cnumr.java.sample.pdf.commons.template.enums.Alignment; import fr.cnumr.java.sample.pdf.commons.template.enums.Display; import fr.cnumr.java.sample.pdf.commons.template.enums.ItemType; import fr.cnumr.java.sample.pdf.commons.template.enums.Positioning;

import java.io.IOException; import java.util.List; import java.util.Map; import java.util.Optional;

import static com.google.common.collect.Lists.newArrayList; import static fr.cnumr.java.sample.pdf.commons.template.enums.Alignment.NONE; import static fr.cnumr.java.sample.pdf.commons.template.enums.Alignment.TOP_LEFT; import static fr.cnumr.java.sample.pdf.commons.template.enums.Display.ALWAYS; import static fr.cnumr.java.sample.pdf.commons.template.enums.Positioning.ABSOLUTE;

@JsonTypeInfo(use = JsonTypeInfo.Id.NAME, property = "type", visible = true) @JsonSubTypes({ @JsonSubTypes.Type(value = Box.class, name = "BOX"), @JsonSubTypes.Type(value = Break.class, name = "BREAK"), @JsonSubTypes.Type(value = Cab2d.class, name = "CAB2D"), @JsonSubTypes.Type(value = Circle.class, name = "CIRCLE"), @JsonSubTypes.Type(value = Field.class, name = "FIELD"), @JsonSubTypes.Type(value = Image.class, name = "IMAGE"), @JsonSubTypes.Type(value = Label.class, name = "LABEL"), @JsonSubTypes.Type(value = Line.class, name = "LINE"), @JsonSubTypes.Type(value = ListItems.class, name = "LIST"), @JsonSubTypes.Type(value = Page.class, name = "PAGE"), @JsonSubTypes.Type(value = Rectangle.class, name = "RECTANGLE"), @JsonSubTypes.Type(value = Segment.class, name = "SEGMENT"), @JsonSubTypes.Type(value = Text.class, name = "TEXT"),@JsonSubTypes.Type(value = ConcatenatedFields.class, name = "CONCATENATED_FIELDS") }) public abstract class Item { private String id;

private ItemType type;

protected Display display = ALWAYS;

protected List<String> conditions = newArrayList();

protected Position position = new Position();

protected Size size = new Size();

@JsonIgnore
private boolean drawable;

public String getId() {
    return id;
}

public void setId(String id) {
    this.id = id;
}

public ItemType getType() {
    return type;
}

public void setType(ItemType type) {
    this.type = type;
}

public Display getDisplay() {
    return display;
}

public void setDisplay(Display display) {
    this.display = display;
}

public List<String> getConditions() {
    return conditions;
}

public void setConditions(List<String> conditions) {
    this.conditions = conditions;
}

public Position getPosition() {
    return position;
}

public void setPosition(Position position) {
    this.position = position;
}

public Size getSize() {
    return size;
}

public void setSize(Size size) {
    this.size = size;
}

public boolean isDrawable() {
    return drawable;
}

public void setDrawable(boolean drawable) {
    this.drawable = drawable;
}

public abstract void draw(Document document, Optional<Box> parent, Optional<Item> previous) throws IOException;

public abstract void initItem(Document document, Optional<Box> parent, Optional<Item> previous) throws IOException;

/**
 * Permet d'initialiser un élément dans un document.
 *
 * @param document : document auquel est rattaché l'élément.
 * @param parent   : boîte parente qui contient l'élément à initialiser.
 * @param previous : élément précédent l'élément à initialiser.
 * @throws IOException
 */
public void init(Document document, Optional<Box> parent, Optional<Item> previous) throws IOException {
    initItem(document, parent, previous);
    drawable = isDrawable(document.getValues());
}

/**
 * Permet de calculer les coordonnées en points de l'élément en fonction de la boîte parente et de l'élément précédent.
 *
 * @param parent   : boîte parente qui contient l'élément à initialiser.
 * @param previous : élément précédent l'élément à initialiser.
 */
public void calculateCoordinates(Optional<Box> parent, Optional<Item> previous) {
    Alignment alignment = position.getAlignment();
    Positioning positioning = position.getPositioning();

    float x = 0, y = 0;

    if (alignment == NONE) {
        if (previous.isEmpty() && positioning != ABSOLUTE) {
            position.setAlignment(TOP_LEFT);
            position.setPositioning(ABSOLUTE);
            calculateCoordinates(parent, previous);
            return;
        }

        Item i = previous.orElse(null);
        x = positioning.getX(this, i);
        y = positioning.getY(this, i);
    } else {
        if (parent.isEmpty()) {
            return;
        }

        Box b = parent.get();
        x = alignment.getX(this, b);
        y = alignment.getY(this, b);
    }

    // Set text coordinates calculated above
    position.setX(x);
    position.setY(y);
}

/**
 * Permet de définir si un élément est dessinable en fonction de conditions d'affichage.
 *
 * @param values : liste des couples clé/valeur qui permettent de renseigner le document.
 * @return
 */
public boolean isDrawable(Map<String, String> values) {
    return display.check(conditions, values);
}

} `

wokier avatar Jul 01 '22 13:07 wokier

I have the same bug here (NullPointerException on UnnecessarilyAssignValuesToVariables.java:152)

durandx avatar Sep 20 '22 14:09 durandx