有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java为扫描器的输入生成字符序列

我对我在Java4e332页上尝试的BruceEckels思考的一个练习感到困惑

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

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

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

布鲁斯的代码(作品):

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)

共 (1) 个答案

  1. # 1 楼答案

    这个循环没有结束

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

    变化

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