我从上周开始学习Java (我有C#的基础知识),现在我正在练习课程。我不明白为什么我会得到这个异常,我试图多次更改代码,但都不起作用。代码如下:
package javaapplication1;
import java.util.Scanner;
public class JavaApplication1 {
static Scanner sc = new Scanner(System.in);
public static void main(String[] args) {
Competitor[] competitors;
System.out.println("Enter number of competitors");
competitors = Create(sc.nextInt());
for(int i = 0;i<competitors.length - 1;i++)
for(int j=i+1;j<competitors.length;j++)
if(competitors[i].GetHeight()==competitors[j].GetHeight())
System.out.println(competitors[i]+" and "
+competitors[j] + "bounced to height"
+competitors[i].GetHeight());
}
static Competitor[] Create(int n) {
Competitor[] competitors = new Competitor[n];
for(Competitor c : competitors) {
c = new Competitor();
System.out.println("Enter name, id and bounce height");
c.SetName(sc.next());
c.SetId(sc.next());
c.SetHeight(sc.nextFloat());
}
return competitors;
}
}
class Competitor {
private String name;
private String id;
private float height;
public Competitor() {
}
public Competitor(String name, String id, float height) {
this.name = name;
this.id = id;
this.height = height;
}
public String GetName() {
return this.name;
}
public String GetId() {
return this.id;
}
public Float GetHeight() {
return this.height;
}
public void SetName(String name) {
this.name = name;
}
public void SetId(String id) {
this.id = id;
}
public void SetHeight(Float height) {
this.height = height;
}
}我在这一行得到了一个异常: if(competitorsi.GetHeight()==competitorsj.GetHeight())
这里的问题是什么?
非常感谢!
发布于 2013-07-13 19:35:26
Create方法以错误的方式初始化竞争对手的值。试试这个:
for(int i = 0;i<competitors.length;i++){
competitors[i] = new Competitor();
System.out.println("Enter name, id and bounce height");
competitors[i].SetName(sc.next());
competitors[i].SetId(sc.next());
competitors[i].SetHeight(sc.nextFloat());
}再提一个建议。在C#中,方法名以一个大写字符开头,而在Java语言中,它们以小写字母开头。
发布于 2013-07-13 19:35:53
这增强了for循环:
for(Competitor c : competitors) {
c = new Competitor();
System.out.println("Enter name, id and bounce height");
c.SetName(sc.next());
c.SetId(sc.next());
c.SetHeight(sc.nextFloat());
}等同于:
for(int i = 0; i < competitors.length; i++) {
Competitor c = competitors[i];
c = new Competitor();
System.out.println("Enter name, id and bounce height");
c.SetName(sc.next());
c.SetId(sc.next());
c.SetHeight(sc.nextFloat());
}所以您修改了c,但从未修改过competitors
Java与C#有不同的约定。参见here。
方法应该是动词,大小写混合,每个内部单词的第一个字母大写。
发布于 2013-07-13 20:17:49
你正在做这个
Competitor[]竞争对手=新竞争对手;for(竞争对手c:竞争对手){c=新竞争对手();System.out.println(“输入名称、id和弹跳高度”);c.SetName(sc.next());c.SetId(sc.next());c.SetHeight(sc.nextFloat());}返回竞争对手;
但就像这样,你只需为"c“分配一个新的竞争对手。你应该把那个c = new Competitor()取下来,就像这样
Competitor[]竞争对手=新的竞争对手;for(竞争对手c:竞争对手){System.out.println(“输入名称、id和弹跳高度”);c.SetName(sc.next());c.SetId(sc.next());c.SetHeight(sc.nextFloat());}返回竞争对手;
使用SetHeight()的另一个问题是因为SetHeight()选择了一个原始值并将其放入一个类类型Float中(自动归功于auto-boxing)。类类型在内部将float基元存储在一个字段中。当您使用==时,它会比较这两个对象,并确定它们不指向相同的位置,即使它们的字段指向具有相同值的float基元。
这就是为什么当比较非原语类型时,我们应该总是使用.equals()方法而不是==方法,除非你试图用null来测试它。.equals()将确保它不会比较变量所指向的位置,而是比较它们的内部字段。
请看下面的答案https://stackoverflow.com/a/73021/2576857
我认为这会帮助你理解你所遇到的两个问题。
https://stackoverflow.com/questions/17629759
复制相似问题