Out of Memory异常java

时间:2014-02-22 15:05:24

标签: 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)

我不知道该怎么做......

5 个答案:

答案 0 :(得分:4)

您正在永远循环(即使在纠正==错误后),因为您总是检查相同的推文。这可能会更好:

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

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

答案 1 :(得分:1)

您永远不会将go设置为true,因为String比较永远不会成功。 不要将字符串与==进行比较。请改用equals()方法。所以改变:

if(tweet == "done"){

为:

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

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

答案 2 :(得分:1)

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

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

答案 3 :(得分:1)

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

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

后面

tweets.add(tweet);

更好地掌握正在发生的事情。

答案 4 :(得分:0)

您应该从这个学习经历中学到几个项目:

  1. 比较对象(查看它们是否是同一个对象)和比较对象的String值之间存在差异。对于字符串比较,您通常需要使用String1.equalsIgnoreCase(String2)形式(如果大小写,则使用String1.equals(String2)。)
  2. 对于涉及从某处获取输入的循环,您可能需要使用表单

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