繁体   English   中英

内存不足异常Java

[英]Out of Memory exception 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)

我不确定该怎么办...

您将永远循环(即使在更正==错误之后也是如此),因为您始终检查同一条Tweet。 这可能会更好地工作:

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

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

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

if(tweet == "done"){

至:

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

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

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

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

问题是,您首先阅读该tweet,然后启动一个while周期,一次又一次地添加相同的tweet,直到内存用完。

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

背后

tweets.add(tweet);

以便更好地了解正在发生的事情。

您应该从此学习经历中选择几个项目:

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM