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