在Java中遇到返回变量范围的麻烦

时间:2019-01-22 18:31:46

标签: java

我想返回一个以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");
    }
}

1 个答案:

答案 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();