2014-02-22 142 views
0

尝试运行学校项目时出现此错误消息。如果这很有帮助,我需要编写一个代码,用于从用户处获取字符串并计算它们输入的#的数量。内存不足异常java

这里是我的项目代码:

package edu.bsu.cs121.albeaver; 

    import java.util.*; 

    public class HashTagCounter { 
     public static void main(String args[]){ 
      boolean go = true; 
      System.out.println("Please tweet your tweets: "); 
      Scanner twitterInput = new Scanner(System.in); 

      String tweet = twitterInput.next(); 
      ArrayList<String> tweets = new ArrayList<String>(); 


      while(go == true){ 
       tweets.add(tweet); 
       if(tweet == "done"){ 
        go = false; 
       } 
      } 
      System.out.println(tweets); 
      twitterInput.close(); 
     } 

    } 

Exception in thread "main" java.lang.OutOfMemoryError: Java heap space 
    at java.util.Arrays.copyOf(Unknown Source) 
    at java.util.Arrays.copyOf(Unknown Source) 
    at java.util.ArrayList.grow(Unknown Source) 
    at java.util.ArrayList.ensureCapacityInternal(Unknown Source) 
    at java.util.ArrayList.add(Unknown Source) 
    at edu.bsu.cs121.albeaver.HashTagCounter.main(HashTagCounter.java:16) 

我不知道该怎么办...

+0

'tweet ==“done”'从来都不是真的,因为在Java中,'=='比较字符串的引用,而不是它们的值。此外,您必须阅读循环内的下一条推文* –

+0

使用等于而不是“==”,而您的比较两个字符串 – Mani

回答

4

由于您总是检查相同的推文,因此您正在永久循环(即使在纠正==错误之后)。这可能会更好地工作:

List<String> tweets = new ArrayList<String>(); 

while (true) { 
    String tweet = twitterInput.next(); 
    if ("done".equals(tweet)) break; 
    tweets.add(tweet); 
} 
+0

是的,他永远添加相同的字符串,所以堆空间耗尽 – mangusta

+0

谢谢你,帮助了很多 – user3340932

1

你永远设置gotrue因为String比较从未成功。 请勿将字符串与==进行比较。使用equals()方法代替。所以改变:

if(tweet == "done"){ 

到:

if(tweet.equals("done")){ 

但是,这不能完全解决你的问题。您还需要更新循环内的tweet变量,否则您将始终与相同的String进行比较。有关代码示例,请参阅assylias的答案。

+0

这不会解决问题... – assylias

+1

非常感谢您 – user3340932

+0

@MartinDinov如果推文在进入循环时没有“完成”,它将是一个无限循环(即使在你修正之后)。 – assylias

1
 while(go == true){ 
      tweets.add(tweet); 
      if(tweet.equals("done")) { // this line should be changed 
       go = false; 
      } 
     } 

在你的情况,tweet == "done"是永远不会执行,因此while循环到达无限循环。这导致Null Pointer Exception

1

问题是,您首先阅读推文,然后启动一个while循环,一遍又一遍地添加相同的推文,直到内存不足。添加

System.out.println(tweets.size()); 

背后

tweets.add(tweet); 

得到发生了什么更好的把握。

+0

oooohhhhh非常感谢你。 – user3340932

0

有你应该从这个学习经历几个项目:

  1. 有比较对象(看他们是否是同一个对象),并比较之间的差异对象的字符串值。对于字符串比较,你通常要使用的形式String1.equalsIgnoreCase(String2)(如果情况的问题,那么一个使用String1.equals(String2的)。)
  2. 对于涉及从什么地方得到的输入回路,你可能想使用的形式

    line = [get input] 
    while (!line.equealsIgnoreCase([end string]) { 
        [ do work on line ] 
        line = [get input] 
    }