【问题标题】:Problems with a Class in JavaJava中的类问题
【发布时间】:2014-03-21 03:33:32
【问题描述】:
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;
}

主程序:

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

    }


}

我在主程序中收到了一个ArrayIndexOutOfBoundsException,我不太明白。

输入被制表符分割,即使它看起来不像...

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

【问题讨论】:

  • 您的文件数据是否有可能是脏的,例如而不是制表符还有其他分隔符?这可能会导致 tokens[i] 失败
  • 我不相信,我是否正确实施了一切?
  • 打印出你的数组中的数据,这样你就可以确认你得到了三样东西。 System.out.println(Arrays.toString(tokens); 你必须导入 java.util.Arrays 才能看到它。但是,这应该一些了解正在发生的事情。
  • 我已经完全复制了这个并打印出了数组的所有内容。它们的长度都是 1,因为 tokens.split("\t"); 将它们拆分为不存在的制表符。因此,整条线被放入索引 0 并继续前进。
  • 此外,您的数据甚至没有像使用制表符那样以清晰的线条格式化。我用实际的选项卡式输入完全重新创建了这个项目,它可以工作。你的输入有缺陷。我百分百确定。

标签: java string class parsing double


【解决方案1】:

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

1- 进行测试以检查是否实际上有 3 个元素:

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

2- 检查您的 input.txt 文件是否有空格或缺少制表符。

3- 你应该在你的类中使用 toString() 而不是 tooString()。这种方法就是为此目的:)

工薪阶层:

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

}

【讨论】:

    【解决方案2】:

    在下面的代码中,您假设从文件中读取的行有 3 个由 '\t' 分隔的标记,当没有足够的标记时,您将收到 ArrayIndexOutOfBound 异常。你应该在运行代码之前检查令牌数组的大小

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

    【讨论】:

      【解决方案3】:

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

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

      因此,当您将longy 设置为tokens[2] 时,2 点不存在。

      您应该更改代码以指定尺寸:

          String[] tokens = new String[*size*];
          tokens = line.split("\t");
          String city=tokens[0];
      

      干杯

      【讨论】:

      • 数组会根据.split("whatever");的内容自动填充,不会有问题。
      • @leigero 不错,我不知道这是可能的。
      • 我并不是要粗鲁,但我不明白这是如何获得投票的。它不仅没有回答问题,而且只是错误的信息。
      【解决方案4】:

      你的字符串是:

      St. Joseph, MO  +39.76580   -94.85060
      

      您在选项卡位置拆分它,该行中没有。因此,您的数组长度为 1。

      tokens[0] = St. Joseph, MO  +39.76580   -94.85060
      tokens[1] // doesn't exist.
      

      此外,您提供的输入也未以表格方式格式化:

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

      注意最后一行没有与其他行正确对齐?如果您使用硬标签,它们将是。确保您没有使用空格代替制表符,而是实际使用制表符按钮(如果数据以编程方式格式化,则为等效字符)。

      我使用您自己的代码重新创建了整个项目,并得到了与您相同的错误。我删除了空格并用实际的制表符替换它们,它工作正常。

      EDIT 数据工作后不打印

      这是一个简单的修复。您正在调用 toString() 方法,但是当您不对返回给您的 String 值执行任何操作时,这对您没有好处。

      做到这一点:

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

      【讨论】:

      • "输入被制表符分割,即使它看起来不像..." - OP
      • @ylun 老实说,我相信 OP 是错误的。只看输入,数据甚至不是在线的,如果他们使用标签的话。这些绝对是空格。
      • 这是由于SO上的格式,如果您不信任OP,请索取文件。
      【解决方案5】:

      您的文件中有空行吗?在那种情况下,我认为它可能会返回一个零长度数组,在这种情况下,第 0 个元素将不存在。 split 的文档指向这里:http://developer.android.com/reference/java/util/regex/Pattern.html#split(java.lang.CharSequence, int)

      为了防止这种情况发生,最好将其包装在检查从拆分返回的元素数量中:

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

      【讨论】:

        猜你喜欢
        • 2010-12-01
        • 2010-10-05
        • 2015-01-07
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-02-20
        相关资源
        最近更新 更多