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 楼答案
这个循环没有结束
变化