需要帮助修复此错误。我正在尝试打印字符串countryNames的数组长度。
Exception in thread "main" java.util.NoSuchElementException: No line found
at java.util.Scanner.nextLine(Scanner.java:1516)
at CSVReader.setUp(CSVReader.java:25)
at CSVReader.<init>(CSVReader.java:16)
at TestCSVReader.main(TestCSVReader.java:16)
我正在读取一个cvs文件,我一直收到上面的错误。以下是我的代码:
import java.io.*;
import java.util.Scanner;
public class CSVReader {
//String countryNames;
String[] countryNames;
int yearLabels;
int[] yearNum;
double cellularDataTable;
double[][] tables;
Scanner scan;
public CSVReader(String filename)// throws FileNotFoundException
{
setUp(filename);
}
private void setUp(String filename) //throws FileNotFoundException
{
File file = new File(filename);
try{
String input="";
scan = new Scanner(file);
scan.nextLine();
while((input=scan.nextLine())!=null)
{
String[] countryNames = input.split(",");
//int a = Integer.parseInt(countryNames[1]);
System.out.println(countryNames[0]);
//System.out.println(a);
}
scan.close();
}
catch(FileNotFoundException e)
{
System.out.println(e);
}
}
public String[] getCountryNames()
{
return countryNames;
}
以下是我的TestCSV类文件:
public class TestCSVReader {
/**
* Includes test examples for class CSVReader.
*/
public static void main(String[] args)
{
final String FILENAME = "data/cellular.csv"; // Directory path for Mac OS X
//final String FILENAME = "data\cellular.csv"; // Directory path for Windows OS (i.e. Operating System)
CSVReader parser = new CSVReader(FILENAME);
String [] countryNames = parser.getCountryNames();
System.out.println(countryNames.length);
}
我的csv文件如下所示:这是一个摘要,因为我不想打印出整个252个国家/地区。基本上我接收252个国家并将其存储在一个字符串数组中,这些年份将它们存储在一个int数组中,并将每个国家的蜂窝数据存储在一个2d双数组中。我是编程的新手,想知道我是否朝着正确的方向前进,如果不是,你将如何在一个字符串数组中命名国家,在int中的年份。和2d双数组中的统计数据。
cvs文件如下所示:
World Development Indicators
Number of countries,252
Country Name,1960,1961,1962,1963,1964,1965,1966,1967,1968,1969,1970,1971,1972,1973,1974,1975,1976,1977,1978,1979,1980,1981,1982,1983,1984,1985,1986,1987,1988,1989,1990,1991,1992,1993,1994,1995,1996,1997,1998,1999,2000,2001,2002,2003,2004,2005,2006,2007,2008,2009,2010,2011,2012
Aruba,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0.029310471,0,0,2.138784453,3.605985937,3.98141538,6.16435217,13.48254011,16.50927821,57.05427692,65.05605558,72.10431377,99.64250268,103.3849507,108.1325002,112.2180618,119.2038996,126.2103374,129.72824,0,131.8565401
Andorra,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1.307211734,1.278625641,1.250259142,4.424155104,8.538444783,13.44671556,22.12730607,32.14530928,35.99902139,43.27794118,45.77115817,68.60251444,73.82494308,79.48487497,84.27763597,78.1171579,80.2836099,82.06181111,84.06818386,83.53432222,81.50204186
Afghanistan,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0.112598381,0.865196277,2.498055472,4.826865367,9.833164022,17.71624331,29.22037376,37.89493697,45.77817474,60.32631999,60.35299258
答案 0 :(得分:6)
此行while((input=scan.nextLine())!=null)
尝试从文件中读取单独的行,直到input
变为null
。但如果没有更多可用行,nextLine()
将抛出异常。
要避免这种情况,请将代码更改为以下
//String input=""; // this line is obsolete
scan = new Scanner(file);
scan.nextLine();
while(scan.hasNextLine()) {
final String input = scan.nextLine(); // read the line after the check (to make sure there is a line available)
String[] countryNames = input.split(",");
//int a = Integer.parseInt(countryNames[1]);
System.out.println(countryNames[0]);
//System.out.println(a);
}
答案 1 :(得分:4)
线程中提出的问题已经解决了
while(scan.hasNextLine()) {
但是您可以在代码中找到另一个问题。在循环内部,您创建了一个局部变量countryNames [],它与类中声明的String [] countryNames无关。
我建议你改变声明:
public class CSVReader {
List<String> countryNames;
并在类的构造函数中初始化它:
public CSVReader(String filename)// throws FileNotFoundException
{
countryNames = new ArrayList<String>();
setUp(filename);
}
ArrayList允许您动态添加值。因此,在循环内部,必须将每个国家/地区名称添加到此ArrayList:
String[] countryValues = input.split(",");
countryNames.add(countryValues[0]);
答案 2 :(得分:2)
也许是这样,你有一个特定的方法来测试扫描是否有更多元素可供阅读
String input="";
scan = new Scanner(file);
scan.nextLine();
while(scan.hasNext())
{
input=scan.nextLine();
String[] countryNames = input.split(",");
//int a = Integer.parseInt(countryNames[1]);
System.out.println(countryNames[0]);
//System.out.println(a);
}
scan.close();
答案 3 :(得分:0)
我认为countryNames数组为null。尝试在添加数据之前初始化它。 调试你的代码并检查countryNames ......
String[] countryNames = new String[...]
如果您不知道阵列的长度,最好使用Arraylist。 (当使用Arraylist时,你不必先进行初始化。)