首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >解算NullPointerExceptions

解算NullPointerExceptions
EN

Stack Overflow用户
提问于 2013-07-13 19:29:41
回答 3查看 110关注 0票数 1

我从上周开始学习Java (我有C#的基础知识),现在我正在练习课程。我不明白为什么我会得到这个异常,我试图多次更改代码,但都不起作用。代码如下:

代码语言:javascript
复制
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())

这里的问题是什么?

非常感谢!

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2013-07-13 19:35:26

Create方法以错误的方式初始化竞争对手的值。试试这个:

代码语言:javascript
复制
    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语言中,它们以小写字母开头。

票数 2
EN

Stack Overflow用户

发布于 2013-07-13 19:35:53

这增强了for循环:

代码语言:javascript
复制
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());
}

等同于:

代码语言:javascript
复制
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

方法应该是动词,大小写混合,每个内部单词的第一个字母大写。

票数 0
EN

Stack Overflow用户

发布于 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

我认为这会帮助你理解你所遇到的两个问题。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/17629759

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档