有没有办法避免 "null" return?

Is there a way to avoid the "null" return?

我正在研究一种使用星号绘制矩形的方法。我的方法 return 需要的矩形,但它迫使我添加一个带有“空”值的 return 语句。我怎样才能摆脱这个“空”值?在方法中使用“void”而不是“String”无效。

我的代码如下:

public class Rectangle {
   
    int width;
    int height;
    
    public Rectangle() {
        this.width = 0;
        this.height = 0; 
    }

    public String draw() {
        for(int i = 1; i <= this.height; i++){
            for(int j = 1; j <= this.width; j++){
                System.out.print("* ");
            }
            System.out.print("\n");   
        }      
        return null;
    }

    public String toString() {
        return draw();
    }
}

通过运行这个代码:

public class Essay {
    public static void main(String[]args) {
        Rectangle rectangle = new Rectangle(5, 3);

        System.out.println(rectangle.toString());
    }
}

结果是:

最简单的解决方案是让 Draw() return 空字符串 return "" 以确保不打印“null”一词。

public String draw() {
    for(int i = 1; i <= this.height; i++){
        for(int j = 1; j <= this.width; j++){
            System.out.print("* ");
        }
        System.out.print("\n");   
    }      
    return "";
}

toString 实现应该 return 代表对象的字符串值而不是直接打印它,因为不能保证方法的调用者会想要打印它。想象一下,例如,您想将 toString 的结果写入一个文件——如果它只是打印到控制台并且 return 什么也没做,您会怎么做?

解决此问题的最佳方法是修改 toString 的实现,将星号矩形构建为字符串,并 return 不打印任何内容。但是如果你只是想解决这个问题,你可以 return 一个空字符串而不是 null。

所以,draw 实际上 return 没有任何东西(有用),相反你只是将星星直接打印到输出流。

相反,您应该(可能)做的是在 draw 方法中构建一个 String,例如可以 returned 给调用者...

public String draw() {
    StringJoiner outter = new StringJoiner("\n");
    for (int i = 1; i <= this.height; i++) {
        StringJoiner inner = new StringJoiner(" ");
        for (int j = 1; j <= this.width; j++) {
            inner.add("*");
        }
        outter.add(inner.toString());
    }
    return outter.toString();
}

现在,为了简单起见,我使用 StringJoiner(而且因为我很懒,它只是一个了不起的 class),但您同样可以使用 StringBuilder ,但您需要自己注入额外的属性。

然后调用 System.out.println(rectangle.toString()); 实际上会打印 draw 方法

的 return 结果

可运行示例...

import java.util.StringJoiner;

public class Test {

    public static void main(String[] args) {
        new Test();
    }

    public Test() {
        Rectangle rectangle = new Rectangle(5, 3);

        System.out.println(rectangle.toString());
    }

    public class Rectangle {

        int width;
        int height;

        public Rectangle(int width, int height) {
            this.width = width;
            this.height = height;
        }

    public String draw() {
        StringJoiner outter = new StringJoiner("\n");
        for (int i = 1; i <= this.height; i++) {
            StringJoiner inner = new StringJoiner(" ");
            for (int j = 1; j <= this.width; j++) {
                inner.add("*");
            }
            outter.add(inner.toString());
        }
        return outter.toString();
    }

        public String toString() {
            return draw();
        }
    }
}