java - 生成用于输入到扫描仪的字符序列

标签 java

我对 Bruce Eckels Thinking In Java 4E 第 332 页中的一个练习感到困惑。

问题要求创建一个生成字符序列的类。调整此类,使其可以作为 Scanner 对象的输入(即实现 Readable)。

我的问题是我编写的代码与 Bruce 在他的书中给出的示例非常相似。但他的榜样奏效了,而我的则不然。我做错了什么?

注意:这不是家庭作业(这只是本书的个人学习,不是类作业)。下面是 Bruce 的代码,它有效,然后是我基于他的练习题的答案,但它无效。当然,我看到有一个缓冲区溢出异常,但我不明白为什么会发生在我身上而不是 Bruce(缓冲区似乎是由 Scanner 类提供的,因为它没有在任何地方声明......但我正在在那一点上迷路了)。

Bruce 的代码(WORKS):

import java.nio.*;
import java.util.*;

//based on example in Bruce Eckels Thinking in Java 4th edition
//see page 332: "adapting to an interface".

public class RandomWords implements Readable {

  //random number generator
  private static Random rand = new Random(47);

  //an array of lowercase letters
  private static final char[] lowers =
    "abcdefghijklmnopqrstuvwxyz".toCharArray();

  //number of words to generate
  private int count;

  //constructor
  public RandomWords(int count) { this.count = count; }

  //read method (required to implement Readable)
  public int read(CharBuffer cb) {

    if(count-- == 0)
      return -1; // Indicate end of input

    //ten letter random word
    for(int i = 0; i < 9; i++) {
      cb.append(lowers[rand.nextInt(lowers.length)]);
    }
    cb.append(" "); //separate tokens with a space ?
    return 10; // Number of characters appended
  }

  public static void main(String[] args) {
    Scanner s = new Scanner(new RandomWords(8));
    while(s.hasNext())
      System.out.println(s.next());
  }

}

现在这是我的代码(不起作用)

import java.nio.*;
import java.util.*;

public class RandomWord implements Readable {

    //length of random word to be generated
    private int count;

    //Random number generator
    private static Random rand = new Random(47);

    //Array of letters to choose from
    private  static final char[] letters =
                "abcdefghijklmnopqrstuvwxyz".toCharArray();

    //Constructor
    RandomWord(int count) {
        this.count = count;
    }

    //read method (required to implement Readable)
    public int read(CharBuffer cb){

        //no input
        if(count == 0)
          return -1;

        //generate letters
        for(int i = 0; i < count; ++count)
            cb.append(letters[rand.nextInt(letters.length)]);

        //separate tokens with a space ?
        cb.append(" ");

        //return number of letters generated
        return count;
    }

    public static void main(String[] args) {
        Scanner s = new Scanner(new RandomWord(8));
            System.out.println(s.next());
            //also no joy:
            //if (s.hasNext())
            //  System.out.println(s.next());
    }

}

输出:

Exception in thread "main" java.nio.BufferOverflowException
    at java.nio.Buffer.nextPutIndex(Buffer.java:513)
    at java.nio.HeapCharBuffer.put(HeapCharBuffer.java:163)
    at java.nio.CharBuffer.append(CharBuffer.java:1375)
    at RandomWord.read(RandomWord.java:30)
    at java.util.Scanner.readInput(Scanner.java:849)
    at java.util.Scanner.next(Scanner.java:1414)
    at RandomWord.main(RandomWord.java:41)


------------------
(program exited with code: 1)

最佳答案

这个循环没有结束...

for(int i = 0; i < count; ++count)

改变

for(int i = 0; i < count; i++)

关于java - 生成用于输入到扫描仪的字符序列,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27472193/

相关文章:

java - 将 Maven WAR 插件与配置文件结合使用

java - Shift-JIS 编码字符串的不同字体

java - 具有以固定速率运行的可运行对象的 Java 项目可以在一段时间后停止吗?我的在大约 40 小时后仍然卡住

java - 带有 Optional 的 Null 安全方法链接

java - 导出: `C:/Java/jdk1.7.0_65':不是有效的标识符

java - 将上下文从服务类传递到另一个服务类

java - 重新初始化ArrayList的迭代器不起作用

java - 如何使用 apache poi XSSF 获取 xlsx 文件的文件名?

javascript - 在 Adob​​e CQ 5.6 中手动安装模块

java - 如何检测类是否可注入(inject)