如何从文件中读取信息并将其放回String数组中?

时间:2019-03-08 16:56:27

标签: java

我有一项任务,需要从文件中读取信息。文件中信息的格式为: 伦敦 莫斯科 .... 我总共有7个城市和7行。我需要读取城市名称,并将其放回String数组中。当我测试这段代码时,我收到一条消息 java.lang.ArrayIndexOutOfBoundsException: 0

对于如何解决此问题,我将不胜感激。

import java.util.Scanner;
import java.io.*;
public class Input {

        static Scanner keyboard, input;
        static PrintWriter output;
        static String[] namesCities;
        static String name = ""; 
        static int index;

        public static void main(String args[]) {

            try
{
            System.out.println("Please, enter the name of input file");
            keyboard = new Scanner(System.in);
            name = keyboard.nextLine();

            File file = new File(name);
            input = new Scanner(file);

            namesCities = new String[index];

            for (int index = 0; index < 7; index++) 
            {
                namesCities[index] = input.next();
            }
}
catch 
{

 catch (IOException a)

     { 
        System.out.println("Could not find file " + name);
        name = keyboard.nextLine();                       
    }
}
}

2 个答案:

答案 0 :(得分:0)

在现有代码中,由于变量的值保持为零,因此尚未正确初始化index变量,并且namesCities = new String[index];的大小为零的数组会导致ArrayIndexOutOfBoundsException。您需要像7一样将其初始化为namesCities = new String[7];

避免在类级别声明变量,其范围的持续时间不应超过所需时间。就像代码中的Scanner对象或文件名一样,如果管理不当,似乎没有任何价值可以长期存在,它们可能会导致资源泄漏。尝试使用此代码,该代码在一行中使用Files.readAllLines来读取文件,并以List对象的形式返回,其中列表中的每个项目都包含文件中的行。然后,您可以使用toArray将其转换为数组。

public static void main(String[] args) throws Exception {
    System.out.println("Please, enter the name of input file");
    Scanner keyboard = new Scanner(System.in);
    String name = keyboard.nextLine();
    keyboard.close();

    List<String> lines = Files.readAllLines(Paths.get(name));
    String[] nameCities = lines.toArray(new String[lines.size()]);
    System.out.println(Arrays.toString(nameCities));
}

如果您在理解此处的任何代码时遇到麻烦,请告诉我。

答案 1 :(得分:0)

所以我写了一些小东西。这假设您已经进行了所有正确的导入,并且没有进行实际检查以确保文件大小正确。如果绝对必须使用for循环,则可以将我的循环更改为一个告诉计数器<7(而不是计数器<= 7)<的for循环。<-这将引发索引错误。

我更改了一些内容,但是随时可以将它们改回。我将变量移到了main内部,因为您没有理由将它们保留为实例变量。我也将您的.nextLine()更改为.next(),原因是因为.nextLine()假定所有内容都表明它命中了换行符,而.next()仅包含了所有内容表明它要换行符。如果您要这样做的话,您可以将这两种方式都改回原来的方式。

public class Input{
    public static void main(String[] args){
        System.out.println("Please Enter the name of the input file");
        keyboard = new Scanner(System.in);
        name = keyboard.next();

        File file = new File(name);
        input = new Scanner(file);

        String[] nameCities = new String[7];
        int counter = 0;
        while(input.hasNext()){
            nameCities[counter] = input.next();
            counter++;
        }
        keyboard.close()//don't forget to close your scanner
    }
}