2016-10-08 4 views
1

Я изучаю информатику, и моя домашняя работа находилась на следующий день.Как работают операторы на Java и почему этот метод возвращает значение null?

Метод 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; 
    } 
} 
+0

Я бы порекомендовал вам перевести свой код на английский, прежде чем публиковать его. Поэтому людям легче понять это и помочь вам. –

+0

одной простой причиной может быть, никакие условия блока не выполняются, так что в итоге вы получите null в обратном направлении, следовательно, нулевой указатель плюс не путайте свое соглашение об именах с API (Date - это API) –

+0

Думаю, ему не нужно преобразовывать коды на английский. Потому что в блоке кода используется только три тега. Tag = Day, Monat = Month, Jahre = Year и gibJahr и т. Д. Средства gib = get. Нет смысла переводить. –

ответ

0

Проблема заключается в том, что вы используете неправильный bit-wise operator (&). Вместо этого вы должны использовать этот условный оператор ||.

В результате в методе getNextDay() вы ни один из, если заявления будут выполнены и, следовательно, только строка кода, которая читается является 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; 
} 

Смотрите, как если заявления теперь отличаются. Попробуйте сами.

+0

большое спасибо :) Я получаю его сейчас, я все время использую & но вы сделали это с ||. – meert

+0

@meert Я думаю, вы также смотрите на это: http://meta.stackexchange.com/questions/5234/how-does-accepting-an-answer-work –

+0

Я действительно поблагодарил вас :) – meert

 Смежные вопросы

  • Нет связанных вопросов^_^