Java中类的问题

Java中类的问题,java,string,class,parsing,double,Java,String,Class,Parsing,Double,主程序: public class Location { private String city; private double latitude; private double longitude; public Location(String aCity, double aLatitude, double aLongitude) { city = aCity; latitude = aLatitude; longitude = aLongitude; } void

主程序:

public class Location {
private String city;
private double latitude;
private double longitude;

public Location(String aCity, double aLatitude, double aLongitude)
{
    city = aCity;
    latitude = aLatitude;
    longitude = aLongitude;
}
void setLocation(String theCity)
{
    city = theCity.trim();
}
void setLatitude(double lat)
{
    latitude = lat;
}
void setLongitude(double long1)
{
    longitude = long1;
}
public String getLocation()
{
    return city;
}
public double getLatitude()
{
    return latitude;
}
public double getLongitude()
{
return longitude;
}
public String tooString()
{
    String result = String.format("City: %s (%1.3f; %1.3f)", city, latitude,longitude);
    return result;
}
我在主程序中发现了一个我不太理解的
数组索引OutofBoundsException


输入被标签分开,即使看起来不像

public class Hmwk {

public static void main(String[] args) throws FileNotFoundException {
    Scanner input=new Scanner (new File ("input.txt"));
    while (input.hasNextLine())
    {
        String line=input.nextLine();
        String[] tokens;
        tokens = line.split("\t");
        String city=tokens[0];
        double lat=Double.parseDouble(tokens[1]);
        double longy=Double.parseDouble(tokens[2]); //Error
        Location loc=new Location(city,lat,longy);
        loc.tooString();

    }


}

在声明数组时,
tokens[]
,没有为其指定大小

St. Joseph, MO  +39.76580   -94.85060
Shanghai,China  +31.23300   +121.45000
Kansas_City,KS     +39.11780    -94.64000
因此,当您将
longy
设置为
tokens[2]
时,
2
点不存在

应更改代码以指定尺寸:

    String[] tokens;
    tokens = line.split("\t");
    String city=tokens[0];
干杯

您的字符串是:

    String[] tokens = new String[*size*];
    tokens = line.split("\t");
    String city=tokens[0];
您将在选项卡位置上拆分它,该行中没有选项卡位置。因此,数组的长度为1

St. Joseph, MO  +39.76580   -94.85060
此外,您提供的输入也没有以表格形式格式化:

tokens[0] = St. Joseph, MO  +39.76580   -94.85060
tokens[1] // doesn't exist.
注意到最后一行没有与其他行正确对齐吗?如果您使用的是硬标签,则会出现这种情况。确保没有使用空格代替制表符,而是实际使用制表符按钮(如果数据是以编程方式格式化的,则使用等效字符)

我从您自己的代码重新创建了整个项目,并得到了与您相同的错误。我删除了空格,并用实际的制表符替换,效果很好

数据工作后编辑,不打印

这是一个简单的解决方案。您正在调用
toString()
方法,但如果不使用返回给您的字符串值执行任何操作,则这对您没有好处

只要做到:

St. Joseph, MO  +39.76580   -94.85060
Shanghai,China  +31.23300   +121.45000
Kansas_City,KS     +39.11780    -94.64000

在下面的代码中,假设从文件中读取的行有3个由“\t”分隔的标记,当标记不足时,将出现ArrayIndexOutOfBound异常。在运行代码之前,应该检查令牌数组的大小

System.out.println(loc.tooString());

你的档案里有空行吗?在这种情况下,我认为它可能返回一个长度为零的数组,在这种情况下,第0个元素将不存在。拆分线索的文档如下所示:

为了防止出现这种情况,最好将其包装为检查从拆分返回的元素数:

tokens = line.split("\t");
if (tokens.length == 3){
    String city=tokens[0];
    double lat=Double.parseDouble(tokens[1]);
    double longy=Double.parseDouble(tokens[2]);
}

这是一个工作示例,您的问题来自input.txt文件。如果缺少一个制表符(\t)(改为键入错误的空格),则split()返回的元素将少于3

1-进行测试,检查是否有3个元素:

if (tokens.length >= 3) {
    String city=tokens[0];
    double lat=Double.parseDouble(tokens[1]);
    double longy=Double.parseDouble(tokens[2]); //Error
    Location loc=new Location(city,lat,longy);
    loc.tooString();
}
2-检查input.txt文件是否有空格或缺少制表符

3-应该在类中使用toString()而不是tooString()。此方法用于此目的:)

工人阶级:

if (tokens.length >= 3) {
 String city=tokens[0];
 double lat=Double.parseDouble(tokens[1]);
 ...
}

}

您的文件数据可能是脏的吗?例如,使用了其他分隔符而不是制表符?这可能会导致
tokens[i]
失败。我不这么认为,我是否正确地实现了所有功能?请打印阵列中的数据,以便确认您正好得到了三样东西
System.out.println(Arrays.toString(tokens);
您必须导入
java.util.Arrays
,才能看到它。但是,这应该会让我们了解到发生了什么。我已经复制了这一点,并打印出了数组的所有内容。它们都是长度1,因为
tokens.split(“\t”)
在不存在的制表符上拆分它们。因此,整行被放入索引0中,并继续前进。此外,您的数据甚至没有像使用制表符时那样以清晰的行进行格式化。我使用实际的制表符输入完全重新创建了此项目,它工作正常。您的输入有缺陷。我100%确信。array是根据
.split(“任意”);
的内容自动填写的,这样就不会产生问题。@leigero nice,我不知道这是可能的。我不是故意粗鲁,但我不明白这是怎么投票的。这不仅没有回答问题,只是信息错误。“输入被选项卡分割,即使它看起来不像…”OP@ylun老实说,我相信OP是错误的。仅看输入,数据甚至不像他们使用制表符时那样对齐。这些绝对是空格。这是由于格式的原因,因此,如果你不信任OP,请索要文件。
public class Hmwk {
 public static void main(String[] args) throws FileNotFoundException {
    Scanner input=new Scanner (new File ("input.txt"));
    while (input.hasNextLine())
    {
        String line=input.nextLine();
        String[] tokens = line.split("\t");
        if (tokens.length >= 3) {
          String city=tokens[0];
          double lat=Double.parseDouble(tokens[1]);
          double longy=Double.parseDouble(tokens[2]);
          Location loc=new Location(city,lat,longy);
          System.out.println(loc.toString());
       }
    }
    input.close();
}