我想返回一个以E填充的大字母E的String / StringBuilder,这样我就得到了这样的东西:
EEEEEE
E
E
E
EEEEEE
E
E
E
EEEEEE
我现在遇到的问题是,我有一个StringBuilder值sb
,在嵌套的for循环期间应该更新该值。要使函数drawLetters
返回sb
,我可以做什么,以便可以在main()
函数中打印它?
我得到的错误是drawLetters
缺少返回语句。我试图将sb
移到for循环之外,但是for循环不会更新变量,因为它在for循环范围之外。
tl; dr-对范围和sb
变量应该放在哪里感到困惑,以便我的函数drawLetters
返回sb
public class MCVE {
public static String drawLetters(String string) {
// Create BufferedImage object called "background".
BufferedImage background = new BufferedImage(144, 32, BufferedImage.TYPE_INT_RGB);
// Creates a Graphics2D object called "g" by calling the method get.Graphics() on the background
Graphics g = background.getGraphics();
// This decides what is drawn.
g.drawString(string, 6, 12);
StringBuilder sb = new StringBuilder();
for (int y = 0; y < 32; y++) {
for (int x = 0; x < 144; x++)
sb.append(background.getRGB(x, y) == -16777216 ? " " : background.getRGB(x, y) == -1 ? string : "*");
if (sb.toString().trim().isEmpty())
continue;
}
return sb.toString();
}
public static void main(String[] args) {
System.out.println(drawLetters("E"));
//drawLetters("J");
//drawLetters("K");
}
}
答案 0 :(得分:2)
您在循环内声明sb
:
for (int y = 0; y < 32; y++) {
StringBuilder sb = new StringBuilder();
//...
} //Scope of sb ends here
因此它超出了外部for循环的范围。现在,您正在尝试在for
循环内返回它,该循环有效,但不是您想要的。在循环外声明它:
StringBuilder sb = new StringBuilder();
for (int y = 0; y < 32; y++) {
for (int x = 0; x < 144; x++)
sb.append(background.getRGB(x, y) == -16777216 ? " " : background.getRGB(x, y) == -1 ? string : "*");
if (sb.toString().trim().isEmpty())
continue;
}
return sb;
如果您要打印sb
,请使用toString()
方法,然后在返回之前执行此操作;否则,这是无法到达的声明。
如果我是你,我将返回String
,而不是StringBuilder
。否则,每次调用该方法并尝试打印该方法时,都必须添加一个toString()
调用。您可以将方法签名更改为:
public static String drawLetters(String string)
然后在您的退货单中
return sb.toString();