IndexOf(),字符串索引超出范围:-1

时间:2015-01-04 02:30:47

标签: java indexoutofboundsexception

我不知道发生了什么。我有一个产品列表以及一个用标签分隔的数字。当我使用indexOf()查找标签时,我得到String index out of bounds error,并且index为-1。这是代码:

package taxes;

import java.util.*;
import java.io.*;

public class Taxes {

    public static void main(String[] args) throws IOException {
        //File aFile = new File("H:\\java\\PrimeNumbers\\build\\classes\\primenumbers\\priceList.txt");
        File aFile = new File("C:\\Users\\Tim\\Documents\\NetBeansProjects\\Taxes\\src\\taxes\\priceList.txt");
        priceChange(aFile);
    }

    static void priceChange(File inFile) throws IOException {
        Scanner scan = new Scanner("priceList.txt");
        char tab = '\t';
        while (scan.hasNextLine()) {
            String line = scan.nextLine();
            int a = line.indexOf(tab);
            String productName = line.substring(0,a);
            String priceTag = line.substring(a);
        }
    }
}

这是输入:

Plyer set   10
Jaw Locking Plyers  10
Cable Cutter    7
16 oz. Hammer   5
64 oz. Dead Blow Hammer 12
Sledge Hammer   20
Cordless Drill  22
Hex Impact Driver 50
Drill Bit Set   30
Miter Saw   200
Circular Saw    40

6 个答案:

答案 0 :(得分:3)

 Scanner scan = new Scanner("priceList.txt");

这行代码错了。此Scanner实例将扫描字符串"priceList.txt"。它没有包含标签,因此indexOf会返回-1

将其更改为:

 Scanner scan = new Scanner(inFile);

使用method参数,即 priceList.txt 的所需文件实例。

答案 1 :(得分:1)

如果找不到实例,

String.indexOf(char)将返回-1。

在继续a不是否定之前,您需要先检查一下。

您可以详细了解indexOf方法herehere

答案 2 :(得分:1)

因为您在while循环的每次迭代中检查int a = line.indexOf(tab),所以在文档的每一行中都必须有标签才能防止错误。 当您的while (scan.hasNextLine())循环遇到没有标签的行时,索引将为-1,并且在尝试获取StringIndexOutOfBoundsException时获得line.substring(0,a),{{1是-1。

答案 3 :(得分:0)

while (scan.hasNextLine()) {
    String line = scan.nextLine();
    int a = line.indexOf(tab);
    if(a!=-1) {
        String productName = line.substring(0,a);
        String priceTag = line.substring(a);
    }
}

答案 4 :(得分:0)

如果您仔细查看已发布的输入行,您将会看到

Jaw Locking Plyers  10
...
Cordless Drill  22
Hex Impact Driver 50
Drill Bit Set   30

" Hex Impact Driver" line的前后两行中右边的两个字符的价格。这表明" 50"不是从标签位置开始而是" 10"处于这样的位置,接下来是#34; 22"和" 30"。

Q& A编辑器确实保留了TAB,因此您的编辑器也会保留它们,并且您的程序应该能够识别输入行中的TAB。

那就是说,手工输入的TAB(!)对于分隔符来说是一个非常糟糕的选择。正如您所经历的那样,文本文件显示无法显示。使用产品名称中没有出现的特殊字符会好得多。合理的选择是' |','#'和' \'。

另一个好方法是使用模式匹配来查找行末的数字价格 - 产品名称是在删除价格并在剩余字符串上调用trim()之后剩余的内容。

答案 5 :(得分:0)

由于已经验证indexOf(tab)返回-1,因此问题是为什么文本行不包含选项卡,当您确定它确实存在时?

答案很可能是IDE上的设置。例如,我通常将Netbeans配置为将标签转换为三个空格。因此,如果您在IDE中自己键入此输入文件,则选项卡到空间的转换可能就是问题所在。 Netbeans editor option dialog

解决方法:

  1. 如果我们将某些文本复制/粘贴到包含标签的Netbeans中,则标签不会转换为空格。
  2. 可以使用记事本或任何其他简单的文本编辑器创建文本文件以避免此问题。
  3. 更改IDE上的设置,至少为此项目更改。