我想返回一个由大字母 E 组成的 String/StringBuilder,并用 E 填充,这样我会得到如下所示的结果:
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");
}
}
最佳答案
您在循环内声明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();
关于java - java中返回变量作用域遇到问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54314443/