我不知道发生了什么。我有一个产品列表以及一个用标签分隔的数字。当我使用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
答案 0 :(得分:3)
Scanner scan = new Scanner("priceList.txt");
这行代码错了。此Scanner实例将扫描字符串"priceList.txt"
。它没有包含标签,因此indexOf
会返回-1
。
将其更改为:
Scanner scan = new Scanner(inFile);
使用method参数,即 priceList.txt 的所需文件实例。
答案 1 :(得分:1)
答案 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中自己键入此输入文件,则选项卡到空间的转换可能就是问题所在。
解决方法: