我有一项任务,需要从文件中读取信息。文件中信息的格式为:
伦敦
莫斯科
....
我总共有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();
}
}
}
答案 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
}
}