ecoCode
ecoCode copied to clipboard
UnnecessarilyAssignValuesToVariables NullPointerException
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);
}
} `
I have the same bug here (NullPointerException on UnnecessarilyAssignValuesToVariables.java:152)