问:好的,这似乎在编译器中可以正常工作,但是当我将代码复制粘贴并尝试通过此代码挑战时,它声明“糟糕!再试一次!” 并将其放在输出字段中:
线程“主”中的异常java.lang.OutOfMemoryError:java.io处java.io.ByteArrayOutputStream.grow(ByteArrayOutputStream.java:113)处java.util.Arrays.copyOf(Arrays.java:3236)处的Java堆空间。 ByteArrayOutputStream.ensureCapacity(ByteArrayOutputStream.java:93)at java.io.ByteArrayOutputStream.write(ByteArrayOutputStream.java:140)at java.io.PrintStream.write(PrintStream.java:480)at sun.nio.cs.StreamEncoder.writeBytes (sun.nio.cs.StreamEncoder.implFlushBuffer(StreamEncoder.java:291)处的StreamEncoder.java:221)sun.nio.cs.StreamEncoder.flushBuffer(StreamEncoder.java:104)处的java.io.OutputStreamWriter.flushBuffer( java.io.PrintStream.write(PrintStream.java:527)处的OutputStreamWriter.java:185)java.io.PrintStream.append(PrintStream.java :)处java.io.PrintStream.print(PrintStream.java:669)处1065)的java.io.PrintStream.append(PrintStream.java:57)的java.util.Formatter $ FixedString.print(Formatter.java:2595)的java.util.Formatter.format(Formatter.java:2508)的com.teamtreehouse.Prompter上的java.io.PrintStream.printf(PrintStream.java:871)上的java.io.PrintStream.format(PrintStream.java:871)com.teamtreehouse.Prompter处的com.teamtreehouse.Prompter.promptForWord(Prompter.java:84) com.teamtreehouse.com的.promptForWords(Prompter.java:60).JavaTester.run(JavaTester.java:77)的com.teamtreehouse.Main.main(Main.java:32)的Prompter.run(Prompter.java:38)在JavaTester.main(JavaTester.java:39)970),位于com.teamtreehouse.Prompter.promptForWord(Prompter.java:84)的com.teamtreehouse.Prompter.promptForWords(Prompter.java:60)的java.io.PrintStream.printf(PrintStream.java:871)上。 teamtreehouse.Prompter.run(Prompter.java:38)位于com.teamtreehouse.Main.main(Main.java:32)位于JavaTester.run(JavaTester.java:77)在JavaTester.main(JavaTester.java:39)970),位于com.teamtreehouse.Prompter.promptForWord(Prompter.java:84)的com.teamtreehouse.Prompter.promptForWords(Prompter.java:60)的java.io.PrintStream.printf(PrintStream.java:871)上。 teamtreehouse.Prompter.run(Prompter.java:38)位于com.teamtreehouse.Main.main(Main.java:32)位于JavaTester.run(JavaTester.java:77)在JavaTester.main(JavaTester.java:39)
我查看了源代码,它试图在崩溃的那一行上所做的就是“ System.out.printf(”尝试一个。%n“);” 这以某种方式进入了一个无限循环,直到它消耗了所有可用内存,该循环才结束。我做错什么了吗?
com / teamtreehouse / Prompter.java
/ **
*提示用户输入空白。保证值不在被检查词列表中。
*
* @param短语应该提示用户的单词。例如:形容词,专有名词,名称
* @return用户响应的内容
* /
public String hintForWord (字符串短语)抛出IOException { String retWord = “” ; 而(retWord 。的isEmpty ()){系统。出来。printf (“输入%s:”
, 短语);
retWord = mReader 。readLine (); 如果(retWord ==空|| retWord 。修剪()的isEmpty ()|| mCensoredWords 。包含(retWord 。修剪())){系统。出来。printf (“再尝试一次。%n” );retWord = “” ; } }返回retWord ; } }
我的意思是,如果它通过了触发异常的异常或意外的测试用例,那么我可能会理解一个错误,但是该特定的printf行不涉及任何用户输入,因此无论传递了什么,它都不应在那儿超载在。
有趣的是,如果我注释掉该printf行,则除了上一个printf行之外,还会再次发生确切的错误。测试用例可能试图无限期地输入错误答案,并且永远不会退出while循环,但是我不确定为什么测试用例会那样做而又不希望出现任何问题。或为什么仅从打印到System.out就会耗尽内存。
或者可能是代码挑战期望某些精确的输入和输出格式在某处变得未对齐,但是我不确定它在试图在幕后输入什么。
答:通常,OutOfMemory错误是由无限循环引起的,它可能在我编写的用于测试并向您的程序提供信息的代码中。伪造非常困难System.in,System.out因此我可能有一个错误。
您还记得main方法中的代码如何工作吗?也许我可以帮助防止其他人遇到同样的问题。