【问题标题】:How do operators work in Java and why does this method return null?运算符在 Java 中是如何工作的,为什么这个方法返回 null?
【发布时间】:2017-02-17 08:25:33
【问题描述】:

我正在学习计算机科学,第二天我的作业就找到了。

getNextDay() 方法返回 null 并且不会通过我的 If 语句。

下面是用到的两个类:

public class NextDay {

           public static void main(String args[]) throws Exception {
              Date dateObj = new Date(30, 3, 2016);
              System.out.println("Altes Datum: " + dateObj.gibTag() + "." + dateObj.gibMonat() + "." + dateObj.gibJahr() + ".");
              System.out.println("Der naechste Tag ist der " + dateObj.getNextDay().toString() + ".");
           }
}



public class Date {
    int tag;
    int monat;
    int jahr;

    public Date(int tag, int monat, int jahr){
        this.tag = tag;
        this.monat = monat;
        this.jahr = jahr;
    }

    public Date getNextDay() throws Exception{  

        if(monat == 2){
        // wenn Februar 29 Tage hat.
        if(jahr % 4 == 0 | jahr % 400 == 0){
            if(tag > 0 & tag < 29){
                return new Date(tag + 1, monat, jahr);  
            }
            else if(tag == 29 & monat == 2){
                return new Date(tag - tag + 1, monat + 1, jahr);
            }else{
                throw new Exception("Im Februar können Sie nur bis 28 schreiben!");
            }   
        }
        // wenn Februar 28 Tage hat.
        if(jahr % 4 != 0 | jahr % 100 != 0 & monat == 2){
            if(tag > 0 & tag < 28){
                return new Date(tag + 1, monat, jahr);  
            }else if(tag == 28 & monat == 2){
                return new Date(tag - tag + 1, monat + 1, jahr);
            }           
            else{
                throw new Exception("Im Februar können Sie nur bis 28 schreiben!");
            }   
        }
        }


        if(monat != 2 & monat == 1 & monat == 3 & monat == 5 & monat == 7 & monat == 8 & monat == 10 & monat == 12 ){
        if(tag <= 31 & monat <= 12 & jahr > 0){
            if(tag < 31){
                return new Date(tag + 1, monat, jahr);  
            }
            else if(tag == 31 & monat < 12){
                return new Date(tag - tag + 1, monat + 1, jahr);
            }
            else if(monat == 12){
                if(tag == 31 & monat == 12){
                    return new Date(tag - tag + 1, monat - monat + 1, jahr + 1);
                }else{
                    return new Date(tag, monat, jahr + 1);
                }
            }

        }
            else{
                throw new Exception("Sie haben ein ungültiges Datum eingegeben!");
            }

        }


        if(monat != 2 & monat == 4 & monat == 6 & monat == 9 & monat == 11){
            if(tag <= 30 & monat <= 12 & jahr > 0){
                if(tag < 30){
                    return new Date(tag + 1, monat, jahr);  
                }
                else if(tag == 30 & monat < 12){
                    return new Date(tag - tag + 1, monat + 1, jahr);
                }
                else if(monat == 12){
                    if(tag == 31 & monat == 12){
                        return new Date(tag - tag + 1, monat - monat + 1, jahr + 1);
                    }else{
                        return new Date(tag, monat, jahr + 1);
                    }
                }

            }
                else{
                    throw new Exception("Sie haben ein ungültiges Datum eingegeben!");
                }

            }
        return null;


    }



    public int gibTag(){
        return tag;
    }

    public int gibMonat(){
        return monat;
    }

    public int gibJahr(){
        return jahr;
    }       


    public String toString(){
        return this.tag + "." + this.monat + "." + this.jahr;
    }
}

【问题讨论】:

  • 我建议在发布之前将您的代码翻译成英文。因此人们更容易理解它并为您提供帮助。
  • 一个简单的原因可能是,没有条件块被执行,所以最终你得到 null 作为回报,因此空指针加上不要将你的命名约定与 API 混淆(日期是一个 API)
  • 我认为他不需要将代码转换为英文。因为代码块中只使用了三个标签。 Tag = Day,Monat = Month,Jahre=Year 和 gibJahr 等表示 gib = get。没有理由翻译。
  • @nickzoum 问题是使用 AND 而不是 OR,OP 使用的是按位运算符还是逻辑运算符无关紧要,重新打开。
  • @PeterLawrey 问题是在 || 时使用按位运算符是需要的。位操作符“|”可能也会起作用,这是一个错误,但我认为主要错误是使用了错误的运算符。为什么要将一个刚接触编程的人与他还不需要知道的东西混为一谈。

标签: java if-statement null operators


【解决方案1】:

问题是你使用了错误的bit-wise operator (&amp;)。相反,您应该使用这个条件运算符||

getNextDay() 方法中,您没有遇到任何 if 语句,因此正在读取的唯一代码行是 return null;

当您尝试在 null 的对象上调用方法时,您会得到 NullPointerException

首先,我建议将getNextDay() 方法更改为:

public Date getNextDay() throws Exception {
    if (monat == 2) {
        // wenn Februar 29 Tage hat.
        if (jahr % 4 == 0 || jahr % 400 == 0) {
            if (tag > 0 & tag < 29) {
                return new Date(tag + 1, monat, jahr);
            } else if (tag == 29 & monat == 2) {
                return new Date(tag - tag + 1, monat + 1, jahr);
            } else {
                throw new Exception("Im Februar können Sie nur bis 28 schreiben!");
            }
        }
        // wenn Februar 28 Tage hat.
        if (jahr % 4 != 0 || jahr % 100 != 0 && monat == 2) {
            if (tag > 0 & tag < 28) {
                return new Date(tag + 1, monat, jahr);
            } else if (tag == 28 & monat == 2) {
                return new Date(tag - tag + 1, monat + 1, jahr);
            } else {
                throw new Exception("Im Februar können Sie nur bis 28 schreiben!");
            }
        }
    } else if (monat == 1 || monat == 3 || monat == 5 || monat == 7 || monat == 8 || monat == 10 || monat == 12) {
        if (tag <= 31 & monat <= 12 & jahr > 0) {
            if (tag < 31) {
                return new Date(tag + 1, monat, jahr);
            } else if (tag == 31 & monat < 12) {
                return new Date(tag - tag + 1, monat + 1, jahr);
            } else if (monat == 12) {
                if (tag == 31 & monat == 12) {
                    return new Date(tag - tag + 1, monat - monat + 1, jahr + 1);
                } else {
                    return new Date(tag, monat, jahr + 1);
                }
            }

        } else {
            throw new Exception("Sie haben ein ungültiges Datum eingegeben!");
        }

    } else if (monat == 4 || monat == 6 || monat == 9 || monat == 11) {
        if (tag <= 30 & monat <= 12 & jahr > 0) {
            if (tag < 30) {
                return new Date(tag + 1, monat, jahr);
            } else if (tag == 30 & monat < 12) {
                return new Date(tag - tag + 1, monat + 1, jahr);
            } else if (monat == 12) {
                if (tag == 31 & monat == 12) {
                    return new Date(tag - tag + 1, monat - monat + 1, jahr + 1);
                } else {
                    return new Date(tag, monat, jahr + 1);
                }
            }

        } else {
            throw new Exception("Sie haben ein ungültiges Datum eingegeben!");
        }

    }
    return null;
}

看看 if 语句现在有何不同。自己试试吧。

【讨论】:

  • 非常感谢 :) 我现在明白了,我一直在使用,但你用 || 做到了。
  • @meert 我想你也看看这个:meta.stackexchange.com/questions/5234/…
  • @meert 我也谢谢你。由于您现在已经加入了堆栈溢出社区,我建议您浏览此页面stackoverflow.com/tour(您还将获得徽章)
  • 您应该注意,在这种情况下,使用逻辑运算符与按位没有区别。
猜你喜欢
  • 2012-06-13
  • 2014-07-09
  • 2012-08-23
  • 2021-11-18
  • 2020-09-24
  • 2018-03-26
  • 1970-01-01
  • 2013-05-28
相关资源
最近更新 更多