如何处理java中的NoSuchElementException?
How to deal with NoSuchElementException in java?
我有一个 java 程序从 cvs 文件中读取,如下所示:
1111,John,23
2222,Mary,32
...
我想将每个字段存储在一个数组中。每当我 运行 以下程序时,我都会收到以下消息:
Exception in thread "main" java.util.NoSuchElementException
at java.util.Scanner.throwFor(Scanner.java:862)
at java.util.Scanner.next(Scanner.java:1485)
at java.util.Scanner.nextInt(Scanner.java:2117)
at java.util.Scanner.nextInt(Scanner.java:2076)
我该如何处理这个异常?我猜是因为 scanner 读取超出了它的限制,然而,while 块是否确保它会在其限制内读取?
感谢任何帮助
import java.util.*;
import java.io.*;
public class program
{
public static void main(String[] args) throws FileNotFoundException, IOException
{
BufferedReader br = new BufferedReader(new FileReader("info.csv"));
int[] ids = new int[20];
String[] names = new String[20];
int[] age = new int[20];
String line;
int i = 0;
while( (line = br.readLine()) != null)
{
Scanner s = new Scanner(line).useDelimiter(",");
ids[i] = s.nextInt();
names[i] = s.next();
sales[i] = s.nextInt();
s.close();
i++;
}
for(int j = 0; j < 20; j++)
{
System.out.println("Id: "+ids[i]+" Name: "+names[i]+" Age: "+ age[i]);
}
}
}
读取CSV文件其实很复杂。处理引号和换行符非常困难。还有一些编码问题需要考虑(你没有考虑;你基本上不应该使用这个构造函数 FileReader
,因为它使用 'platform default encoding')。不要重新发明这个轮子;使用像 super-csv.
这样的东西
while 块确保您读取每一行一次,并且不会超出文件末尾的范围。每行你强行去:一个 int,一个字符串,和一个 int,句点。这就是崩溃发生的地方。很可能在文件末尾有一个尾随换行符或类似的东西。一个简单的例子是检查 line.trim()
是否为空,如果是,则继续前进 (continue;
) 而不要尝试读取该行。
但是,真的,不要手动操作,获取 CSV 解析器。
注意:如果你必须重新发明这个轮子,有更好更简单的方法来从文件中获取所有行。例如,Files.newBufferedReader(Paths.get("/path/to/whatsit"))
甚至 Files.lines(Paths.get("/path/to/whatsit"))
,方便的是这些方法也默认为 UTF-8,即一致的选择而不是 'flip a coin and pray'。
尝试使用split(,)
String[] split = line.split(",");
if (split.length >= 0) {
String input = split[0];
if (input.matches("[0-9]+"))
ids[i] = Integer.parseInt(input);
}
if (split.length >= 1) {
names[i] = split[1];
}
if (split.length >= 2) {
String input = split[2];
if (input.matches("[0-9]+"))
ids[i] = Integer.parseInt(input);
}
我有一个 java 程序从 cvs 文件中读取,如下所示:
1111,John,23
2222,Mary,32
...
我想将每个字段存储在一个数组中。每当我 运行 以下程序时,我都会收到以下消息:
Exception in thread "main" java.util.NoSuchElementException
at java.util.Scanner.throwFor(Scanner.java:862)
at java.util.Scanner.next(Scanner.java:1485)
at java.util.Scanner.nextInt(Scanner.java:2117)
at java.util.Scanner.nextInt(Scanner.java:2076)
我该如何处理这个异常?我猜是因为 scanner 读取超出了它的限制,然而,while 块是否确保它会在其限制内读取?
感谢任何帮助
import java.util.*;
import java.io.*;
public class program
{
public static void main(String[] args) throws FileNotFoundException, IOException
{
BufferedReader br = new BufferedReader(new FileReader("info.csv"));
int[] ids = new int[20];
String[] names = new String[20];
int[] age = new int[20];
String line;
int i = 0;
while( (line = br.readLine()) != null)
{
Scanner s = new Scanner(line).useDelimiter(",");
ids[i] = s.nextInt();
names[i] = s.next();
sales[i] = s.nextInt();
s.close();
i++;
}
for(int j = 0; j < 20; j++)
{
System.out.println("Id: "+ids[i]+" Name: "+names[i]+" Age: "+ age[i]);
}
}
}
读取CSV文件其实很复杂。处理引号和换行符非常困难。还有一些编码问题需要考虑(你没有考虑;你基本上不应该使用这个构造函数
FileReader
,因为它使用 'platform default encoding')。不要重新发明这个轮子;使用像 super-csv. 这样的东西
while 块确保您读取每一行一次,并且不会超出文件末尾的范围。每行你强行去:一个 int,一个字符串,和一个 int,句点。这就是崩溃发生的地方。很可能在文件末尾有一个尾随换行符或类似的东西。一个简单的例子是检查
line.trim()
是否为空,如果是,则继续前进 (continue;
) 而不要尝试读取该行。
但是,真的,不要手动操作,获取 CSV 解析器。
注意:如果你必须重新发明这个轮子,有更好更简单的方法来从文件中获取所有行。例如,Files.newBufferedReader(Paths.get("/path/to/whatsit"))
甚至 Files.lines(Paths.get("/path/to/whatsit"))
,方便的是这些方法也默认为 UTF-8,即一致的选择而不是 'flip a coin and pray'。
尝试使用split(,)
String[] split = line.split(",");
if (split.length >= 0) {
String input = split[0];
if (input.matches("[0-9]+"))
ids[i] = Integer.parseInt(input);
}
if (split.length >= 1) {
names[i] = split[1];
}
if (split.length >= 2) {
String input = split[2];
if (input.matches("[0-9]+"))
ids[i] = Integer.parseInt(input);
}