Error reading from file in java

need help fixing this error. I am trying to print the length of a countryNames string array.

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)

      

I am reading from cvs file and I keep getting above error. Below is my code:

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;
}

      

Below is my TestCSV class file:

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);
    }

      

my csv file looks like this: This is a summary as I didn't want to print all 252 countries. Basically I take in 252 countries and store them in an array of strings, years and store them in an array of int and each country's cell statistics in a two dimensional array. I am new to programming and would like to know if I am heading in the right direction and if not how would you name the country in an array of strings, years in int. and statistics in a two-inch array.

The cvs file looks like this:

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


source to share


4 answers


This line while((input=scan.nextLine())!=null)

tries to read individual lines from the file until input

it becomes null

. But it nextLine()

will throw an exception if there are no more rows available.

To avoid this, change your code to the following



//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);
}

      

+6


source


The problem posed in the thread was solved with

while(scan.hasNextLine()) {

      

But there is also another problem you will find in your code. Within the loop, you have created a local variable countryNames [] that is not associated with the String [] countryNames declared in the class.

I recommend that you change your declaration like this:

public class CSVReader {     
    List<String> countryNames;

      



And initialize it in the class constructor:

public CSVReader(String filename)// throws FileNotFoundException 
{ 
    countryNames = new ArrayList<String>();
    setUp(filename);   
}

      

ArrayList allows you to dynamically add values. So, inside the loop, you have to add the name of each country to this ArrayList:

String[] countryValues = input.split(",");
countryNames.add(countryValues[0]);

      

+4


source


Perhaps so, you have a special method of checking if there is more item to read in the scan

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();

      

+2


source


I think the countryNames array is null. try initializing it before adding data. debug your code and check country names ...

String[] countryNames = new String[...]

      

If you don't know the length of the array, you are better off using Arraylist. (when using Arraylist, you don't need to initialize first.)

0


source







All Articles