2016-04-17 2 views
0

Das folgende ist mein Code eine der Klassen namens Auto (Basisklasse), die von Ford und Honda (Unterklassen) geerbt wird. In der Hauptklasse (die nicht Auto ist) drucke ich die variablen Autos obwohl Ford und Honda aus, die Autos von der Autoklasse erben. Das Problem, mit dem ich konfrontiert bin, ist, wenn die Autos auf eine negative Zahl eingestellt sind, zeigt es nicht diese IllegalaArgumentException.Variable durch die Basisklasse keine IllegalArgumentException der Elternklasse

public class car{ 
protected long cars; 

public void setCars(long number) { 
    if(cars < 0) 
     throw new IllegalArgumentException("cars must be ≥ 0!"); 
      cars = number ; 
} 
} 

public class honda extends car{ 
public String toString(){ 
    String st = "HONDA" + "no of cars : " + cars ; 
    return st; 
} 
} 

public class main{ 
public static void main(String[] args){ 

    car[] cscar = new car[10]; 
    for(int i = 0; i < 10; i++){ 
     cscar[0] = new honda(-100); 
    } 
} 
} 
+1

Bitte geben Sie eine [MCVE]. –

+0

ich hoffe, dass Sie die Methode 'setCars()' mit dem angegebenen Wert aufrufen – nullpointer

+0

Es gibt keine Möglichkeit zu wissen, was Sie tun oder wie Ihr Code nicht angezeigt aussieht. Ich stimme @DanielPryden zu - zeigen Sie uns Ihre beste [mcve], wenn Sie ernsthaft Hilfe brauchen und brauchen. –

Antwort

1

Es ist unklar, welches Problem Sie konfrontiert sind, scheint aber Sie IllegalArgumentException in Unterklassen geworfen werden erreichen wollen, wenn die Anzahl der Autos negativ ist.

Also hier ist, was funktionieren sollte:

  1. Die Funktion setCars sollte etwas geändert werden: Sie befinden Zahl der Autos auf negative Zahl setzen und dann die Ausnahme zu werfen. Stattdessen sollten Sie die Nummer überprüfen, bevor es Einstellung:

    public void setCars(long number) { 
        if(cars < 0) 
         throw new IllegalArgumentException("cars must be ≥ 0!"); 
    
        cars = number ; 
    } 
    
  2. Ich gehe davon aus, dass cars eine Variable in Basisklasse ist. Also sollte es privat sein, und es sollte nur über setCars Funktion irgendwo in der Autoklasse eingestellt werden. legen Sie es nicht direkt überhaupt:

    public class Car { 
    
        private long cars; 
    
        // ... 
    } 
    
  3. Unterklassen sollten entweder nicht setCars überschreiben überhaupt, oder (wenn sie überschreiben müssen), Call-Mutter Methode zuerst:

    public class Honda { 
    
        // setCars function is not overwritten here, 
        // so parent function will be called 
    } 
    
    public class Ford { 
    
        // setCars function is overwritten here, 
        // but parent function is called first: 
    
        @Override 
        public void setCars(long number) { 
         super.setCars(number); 
         // if we've got here, then exception was not thrown 
         // so function can do something else 
        } 
    } 
    

Alternativ können Sie die übergeordnete Funktion als public final void setCars festlegen, so dass niemand sie überschreiben kann.

Der obige Code führt zum gewünschten Ergebnis:

Honda honda = new Honda(); 
honda.setCars(-5); // will throw the exception 
+0

Ich denke, ich mache was immer du gesagt hast, aber immer noch in der Lage, negative Werte zu drucken. Danke für die Antwort – maria

+0

Der Unterschied in Ihrem Code ist, dass Sie versuchen, 'Autos' im Konstruktor (' new honda (-100) ') zu initiieren. Ich sehe keinen Konstruktor in dem Code, den Sie eingefügt haben, aber wenn Sie das tun wollen, sollte Ihr Konstruktor so aussehen: 'public Car (lange Zahl) {setCars (Zahl); } 'und' setCars' müssen in diesem Fall endgültig sein –

Verwandte Themen