当前位置: 首页 > 知识库问答 >
问题:

从java中的文件读取时出错

翟鸿振
2023-03-14

需要帮助修复此错误。我试图打印出字符串国家名称的数组长度。

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)

我从一个简历文件阅读,我一直得到上面的错误。下面是我的代码:

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个国家的数据存储在一个字符串数组中,年份存储在一个整数数组中,每个国家的蜂窝数据统计数据存储在一个二维双数组中。我是编程新手,我想知道我的方向是否正确,如果没有,你会如何在字符串数组中命名国家,在整数中命名年份,在二维双数组中命名统计数据。

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

共有3个答案

左丘边浩
2023-03-14

也许像这样,你有一个特定的方法来测试扫描是否有更多的元素要读取

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();
苗阳
2023-03-14

线程中提出的问题已通过

while(scan.hasNextLine()) {

但你会在代码中发现另一个问题。在循环中,您创建了一个局部变量countryNames[],它与类中声明的字符串[]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]);
凌长恨
2023-03-14

此行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);
}
 类似资料:
  • 问题内容: 我开发了一个应用程序,可以从用户选择的文件夹中读取文件。它显示每个文件中有多少行代码。我只希望Java文件显示在文件选择器(扩展名为.java的文件)中。下面是我的代码: 我也进行了编辑,但是仍然无法正常工作,请告知请告知如何仅读取扩展名为.java的文件,换句话说,请仅从文件夹中读取java文件,请告知 问题答案: 您需要一个FilenameFilter。这应该为您工作:

  • 我正在做一个项目,我需要从文件中读取文本,然后将特定部分存储为变量。 假设我有文本文件示例。txt 我想将第一行指定为: 等等 到目前为止,我有这个。 这段代码将打印文件的内容,这是朝着正确方向迈出的一步,但是如何读取每行内容呢? 因为我真的不想养成在内存中存储整个文件的习惯。 我知道你可以用 和类似的方法,但我只是想了解提取值的方法。

  • 错误: 代码: 我需要插入完整的文件到setRuleSets方法,如何将FileInputStream帮助我在这里? 我应该通过读取fileinput流并将该文件路径传递给方法来重新创建临时文件吗?

  • 我的项目中有这样一段代码: 没有错误,应用程序运行正常,但是变量中从来没有任何文本,我确信txt文件中有文本! 我已经尝试过不同的方法来读取文本文件(使用BufferedReader、Scanner、FileInputStream和FileReader),但都不起作用。 另外,我几乎可以肯定问题不在变量中,因为我尝试通过代码(使用运行时)打开文件,它正常打开了正确的文件。 好的,我尝试添加,但是仍

  • 我试图读取CSV文件,但它抛出了一个错误。我无法理解我的语法有什么问题,或者我是否需要向我的read_csv添加更多属性。 我试了一下这个解决办法 UnicodeDecodeError:“utf-8”编解码器无法解码位置21中的字节0x96:起始字节也无效。但它不起作用 [错误] UnicodeDecodeError回溯(最近一次调用)pandas/_libs/解析器。大熊猫中的pyx_图书馆。解

  • 问题内容: 我有以下格式的文本文件: Details.txt 该文件是.txt文件。我想从该文件中读取课程标题,并打印相应的教科书和教师信息。但是我不确定该遵循什么程序?将信息存储在数组中效率不高!我应该如何进行?注意:我无法更改文件中的信息,因此不应更改!显然,文件将通过以下代码读取: 但是我应该如何根据课程名称,教科书和讲师的标签从该文件中提取数据! 问题答案: 首先正确地逐行阅读文件,然后搜