有没有办法避免 "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();
}
}
}
我正在研究一种使用星号绘制矩形的方法。我的方法 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
方法
可运行示例...
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();
}
}
}