当前位置: 首页 > 知识库问答 >
问题:

Java中带定时器的IndexOutOfBoundsException

仲孙昊焱
2023-03-14

我有一个问题,希望需要一个简单明了的解决方案,我似乎想不出来。好的,所以我在玩斐波那契序列:我想提示用户输入一个整数。然后它将运行该序列,将每个元素添加到ArrayList中。然后,我想使用计时器将数组列表中的每个元素显示到控制台--每秒显示序列中的每个元素--我用一个简短的方法来完成。

public class Sequence {

static int seconds = 0;
static Timer timer;
static ArrayList<Integer> fibList = new ArrayList<Integer>();

public static void main(String[] args) {

    boolean noError = true; 
    Scanner sc = new Scanner(System.in);

    //will store sum of evens
    int tmp = 0;

    //timer variables
    int delay = 1000;
    int period = 1000;
    timer = new Timer();

    //enter user input, try catch to eliminate invalid input
    do{
        try{
            System.out.println("Please enter a number: ");
            int input = Integer.parseInt(sc.nextLine());

            //add to arraylist from user input
            for (int i=0; i<=input; i++){
                   fibList.add(fib(i));

                   //sum even numbers
            if(fib(i)%2 == 0){
                tmp += fib(i);
            }

            }

        }catch(Exception e){
            System.out.println("Not a valid Number!");

        }

        noError = false;
    }while(noError);

     System.out.println(fibList);
     System.out.println("Sum of Even Numbers is: "+tmp);


     timer.scheduleAtFixedRate(new TimerTask() {

            public void run() {      

                System.out.print(fibList.get(setInterval())+ ",");
            }
        }, delay, period);

}

    //This is where I count up through my ArrayList and probably cause the Error
//counts up for every element through the array
public static final int setInterval() {

    if (seconds >= fibList.size())
        timer.cancel();
    return seconds++;


}

//does fibonacci sequence
public static int fib(int n) {
    if (n < 2) {
         return n;
      }
      else {
   return fib(n-1)+fib(n-2);
      }

共有1个答案

华烈
2023-03-14

顺便说一句,Iluxa的方法更好。逻辑清晰,避免混淆。

但是,如果您只想修复测试条件,请将if更改为

if (seconds == fibList.size() - 1)
 类似资料:
  • 我想用Java模拟TCP。 我找到了System.nanotime()方法,但是没有方法可以在指定的微秒或纳秒内阻塞线程。如果有这样的方法,那么请让我知道。system.nanotime()只是给出了以纳秒为单位的相对时间间隔。 我可以使用System.nanotime()在使用busy-loop的线程中执行纳秒级延迟,但这将浪费CPU时间,而CPU本来可以用于接收数据线程或处理线程。 另一个令人

  • 我正在尝试编写一个简短的Java程序,它使用多个线程来创建计时器。当计时器达到7秒或15秒时,它将打印一条消息。 我需要创建一个共享计数器。时间打印线程将计数器递增1,并从执行开始每秒打印其值。一个消息打印线程每15秒打印一条消息,另一个消息打印线程每7秒打印一条不同的消息。这两个线程需要在不修改时间打印线程的情况下完成。 所有这些线程都需要共享每秒更新的计数器对象。每次更新计数器对象时,时间打印

  • 问题内容: 当日期中包含EDT / EST时,我们是否有任何API可以验证日期是否有效。我已经尝试过用Java Java SimpleDateFormat进行Joda,但是我无法解析日期。 下面是我正在获取“ 2017/09/25 16:18:15.099 -0400 EDT”的示例格式。 任何帮助表示赞赏。 谢谢,sk 问题答案: 您是否尝试阅读文档? 从以下文档中: 区域名称 :这将输出时区I

  • 我在试着验证Mockito的记录器信息。 但是,我不能运行我的junit类来覆盖所有代码行。 你知道为什么吗? 需要但未调用:mockappender.doappend();->在AppTest.TestWithover3Element(AppTest.java:52)实际上,与这个模拟没有任何交互。

  • 本文向大家介绍Java定时器Timer简述,包括了Java定时器Timer简述的使用技巧和注意事项,需要的朋友参考一下 概述 主要用于Java线程里指定时间或周期运行任务。Timer是线程安全的,但不提供实时性(real-time)保证。 构造函数 Timer() 默认构造函数。 Timer(boolean) 指定关联线程是否作为daemon线程。 Timer(String) 指定关联线程的名称。

  • 我试图用这个功能构建一个命令行界面:如果用户插入一个输入(在本例中是一个整数)需要15秒以上的时间,该函数会做出一个默认选择(0)。下面的代码是我到目前为止写的,它工作正常。 问题是我想添加一个新功能:如果用户写错了数字( 然而,当控制台打印消息时,计时器应该仍然运行,并在15秒后结束此循环,以防用户继续插入错误的数字。如果用户最终得到一个正确的数字,它应该立即打破循环。 这是我的代码,但我对如何