【问题标题】:Index out of range error with exception in thread main索引超出范围错误,线程主线程中出现异常
【发布时间】:2013-12-09 17:11:21
【问题描述】:

我是一名学习 Java 编程的初学者。我编写了一个程序,它从文件中读取单词并打印它们之间的空格,除了它们存在于文件中。当我运行我的程序时,我收到一个错误,表示“线程主线程中的异常”。

任何帮助将不胜感激!

谢谢!

我正在读取的文件:

APPLE
ELABORATE
FUTURE
PROOF
LOGICAL

我的程序:

//imports
import java.awt.*;
import java.util.*;
import java.io.*;

class Untitled {
    public static void main(String[] args) throws IOException {

        //variables
        String filePath = "/Users/cameronburgess/Programming/I:O/words.txt";
        String word = "";
        int cv = 0;
        String spacedWord = "";

        //objects
        BufferedReader readBot = new BufferedReader(new FileReader (filePath));

        //user facing
        System.out.println("This program will read from a File at :" + filePath);
        System.out.println();
        while (readBot.readLine() != null) {
            word = readBot.readLine();

            //spliter
            while (word.length() != cv) {   
                    spacedWord = spacedWord + " " + word.charAt(cv);
                    cv = cv + 1;
                }   
                System.out.println(word + " OR " + spacedWord);
        }
    }       
}

控制台返回:

This program will read from a File at :/Users/cameronburgess/Programming/I:O/words.txt

ELABORATE OR  E L A B O R A T E
Exception in thread "main" java.lang.StringIndexOutOfBoundsException: String index out of range: 9
    at java.lang.String.charAt(String.java:686)
    at Untitled.main(Strings6.java:36)

【问题讨论】:

  • 您应该使用StringBuilder 而不是连接运算符来重复连接字符串。

标签: java string file-io bufferedreader coderunner


【解决方案1】:

您应该在每次阅读您的行时将您的 cv 计数器重新初始化为 0:

word = readBot.readLine();
// Add this:
cv = 0
while (word.length() != cv) {   
    spacedWord = spacedWord + " " + word.charAt(cv);
    cv = cv + 1;
}   
System.out.println(word + " OR " + spacedWord);

【讨论】:

  • 至少还有另外两个问题。
【解决方案2】:

尝试对 while 循环进行一些更改,

当您尝试拆分单词时,您需要将值重置为cv =0; spacedWord="";

喜欢,

 while ((word=readBot.readLine()) != null) {
        //spliter
        cv =0;
        spacedWord="";
        while ( cv <word.length()) {   
                spacedWord = spacedWord + " " + word.charAt(cv);
                cv = cv + 1;
            }   
            System.out.println(word + " OR " + spacedWord);
    }

你会得到如下结果:

This program will read from a File at :TEST.txt

APPLE OR  A P P L E
ELABORATE OR  E L A B O R A T E
FUTURE OR  F U T U R E
PROOF OR  P R O O F
LOGICAL OR  L O G I C A L

【讨论】:

  • 将这些值重置为 0 是有意义的,我更新了代码以反映您的建议。但我仍然收到这个:ELABORATE OR E L A B O R A T E PROOF OR P R O F Exception in thread "main" java.lang.NullPointerException at Untitled.main(Strings6.java:37)
  • 您尝试逐一读取文件内容的方式不正确。也改变它。从 while (readBot.readLine() != null) { word = readBot.readLine();到 while ((word = readBot.readLine()) != null) { 和另外。请将第二个 while-contion 更改为 //spliter while (cv
  • 我能够让它工作,但我不需要更改第二个 while 条件来这样做。谢谢!
【解决方案3】:

如果你不想在最后处理单词的长度,那么使用foreach循环和一个字符数组如下

    char[] charactersArray = word.toCharArray();
    for (char character : charactersArray) {
            //do whatever you want to with the 'character'
    }

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-06-19
    • 2013-01-20
    • 1970-01-01
    • 2019-03-11
    • 2014-01-27
    • 2015-06-30
    • 2012-07-27
    • 2012-11-27
    相关资源
    最近更新 更多