Java 我得到了一个非接触性的例外
此代码在Java 我得到了一个非接触性的例外,java,arrays,Java,Arrays,此代码在strLastName[x]=inputFile.next()处停止我不知道为什么。它是作为一个java.util.NoSuchElementException找到的。您的问题是每次检查hasNext()时,您都要调用next()四次。如果您的输入在同一行,如下所示: public static void main(String[] args) throws FileNotFoundException { Scanner inputFile = new Scan
strLastName[x]=inputFile.next()处停止代码>我不知道为什么。它是作为一个java.util.NoSuchElementException找到的。您的问题是每次检查hasNext()
时,您都要调用next()
四次。如果您的输入在同一行,如下所示:
public static void main(String[] args) throws FileNotFoundException
{
Scanner inputFile = new Scanner("Employees.txt");
inputFile.useDelimiter(",");
String[] strLastName = new String[10];
String[] strFirstName = new String[10];
double[] dHours = new double[10];
double[] dPayRate = new double[10];
int x = 0;
while(inputFile.hasNext())
{
strLastName[x] = inputFile.next();
strFirstName[x] = inputFile.next();
dHours[x] = Double.parseDouble(inputFile.next());
dPayRate[x] = Double.parseDouble(inputFile.next());
x++;
}
inputFile.close();
String[] strFullName = FullName(strFirstName, strLastName);
double[] dGrossPay = GrossPay(dHours, dPayRate);
Output(strFullName, dHours, dPayRate, dGrossPay);
}
First
Last
hours
rate
然后应该将inputFile.hasNext()
替换为inputFile.hasNextLine()
如果它们都在不同的线路上,如:
First Last hours rate
然后,您需要在所有inputFile.next()
之前(第一个之后)放置一个if语句。大概是这样的:
public static void main(String[] args) throws FileNotFoundException
{
Scanner inputFile = new Scanner("Employees.txt");
inputFile.useDelimiter(",");
String[] strLastName = new String[10];
String[] strFirstName = new String[10];
double[] dHours = new double[10];
double[] dPayRate = new double[10];
int x = 0;
while(inputFile.hasNext())
{
strLastName[x] = inputFile.next();
strFirstName[x] = inputFile.next();
dHours[x] = Double.parseDouble(inputFile.next());
dPayRate[x] = Double.parseDouble(inputFile.next());
x++;
}
inputFile.close();
String[] strFullName = FullName(strFirstName, strLastName);
double[] dGrossPay = GrossPay(dHours, dPayRate);
Output(strFullName, dHours, dPayRate, dGrossPay);
}
First
Last
hours
rate
编辑:下面的注释是正确的,您是在字符串而不是文件上调用scanner。您需要在开头添加以下内容:
while(inputFile.hasNext())
{
strLastName[x] = inputFile.next();
if (inputFile.hasNext()) {
strFirstName[x] = inputFile.next();
}
if (inputFile.hasNext()) {
dHours[x] = Double.parseDouble(inputFile.next());
}
if (inputFile.hasNext()) {
dPayRate[x] = Double.parseDouble(inputFile.next());
}
x++;
}
您指定了useDelimiter(“,”
),但这真的是所有值的分隔符吗
我猜不是,因为Employees.txt
可能是一个CSV(逗号分隔值)文件,例如:
Doe,John,40,15.00
史密斯,简,35,12.00
使用逗号拆分时,将得到以下值:
Doe
约翰
40
15.00\n提交
简
35
12
如您所见,行尾没有导致15.00
和Smith
成为两个令牌
解决方案:
使用CSV解析器(强烈建议)
指定正确的分隔符(不推荐,太容易出错)
使用行读取并拆分行:
inputFile.useDelimiter(",|\\R");
您不能在while(hasNext())循环中多次调用.next()。您的循环将检查是否存在下一个元素。但是你打了四次“下一步”。这显然是不安全的,因此您没有任何检查就用完了元素。您在字符串上创建了扫描仪。但是字符串构造函数将从作为源的字符串中读取。它不会将其解释为文件。这不是你想象的那样。阅读。为什么使用Double.parseDouble(inputFile.next())
而不是inputFile.nextDouble()
?OP的实际问题是他是从字符串而不是文件中读取的。这个答案并不能解决问题。是的,你是对的。编辑了我的文章也澄清了这一点。他仍然可能遇到我在原始答案中提到的问题,所以我也留下了。没有看到您的代码或您遇到的具体错误,我无法准确地说。但您可能没有导入文件。如果是这种情况,您只需要在导入Scannerimport java.io.File的开始处使用这一行代码>