2016-05-05 6 views
0

Also im Grunde habe ich eine Klasse mit einem Konstruktor, insbesondere sagen, ein Konstruktor für Staaten. Ich kann nur einen neuen Status erstellen, wenn ich im Konstruktor eine Stadttypregion habe (State hat 2 Konstruktoren, beide akzeptieren Name und Region).Verwenden Sie "versuchen und fangen" mit dem Erstellen eines neuen Objekts

Der Code sieht wie folgt aus:

public State(String Name, int Population, Region Capital) throws IllegalArgumentException { 
    super(Name, Population); 
    if(!(Capital.getRegionType() == RegionType.CITY)){ 
     System.out.println("ERROR"); 
     throw new java.lang.IllegalArgumentException(); 
    } 
    this.Capital = Capital; 
} 

Der Typ der Region definiert ist, eine Enum-Klasse. Das Problem ist, wenn ich eine neue Funktion in der Testklasse (Hauptklasse) erstellen

 Region3 = new Region("BedRock", 23423,RegionType.VILLAGE); // 
    try{ 
     State s2 = new State("Khemed", Region3); // This should not be possible because Region3 is a VILLAGE instead of a CITY 
    }catch(IllegalArgumentException e){ 
    } 
    s2.addRegion(Region2);//Doesn´t work - Error 
    s2.addRegion(Region1);//Doesn´t work - Error 

Das ist im Grunde meines Problem, die zwei letzten Zeilen gibt mir eine Fehlermeldung, dass ich habe die Variable s2 intialized.

Ich habe versucht, den Code ohne "versuchen und fangen" zu sehen, ob die if-Anweisung, die ich im Konstruktor habe funktionieren würde, aber es nicht funktioniert.

Die Methode "add" ist eine Methode, die in der Super-State-Klasse (Contry) definiert ist, die es einfach erlaubt, States hinzuzufügen.

Hoffe, du kannst helfen, weil ich nicht sehen kann, wie ich das lösen kann.

ADDED (Angeforderte meine Frage zu beantworten)

Klasse Region:

public class Region { 
private String name; 
private int population; 
private RegionType regionType; 

public Region(String name, int population, RegionType regionType){ 
    this.name = name; 
    this.population = population; 
    this.regionType = regionType; 
} 

//get Region Type 
public RegionType getRegionType(){ 
    return regionType; 
} 

Enum mit Region Art:

public enum RegionType { 
CITY, 
VILLAGE, 
TOWN, 

}

+0

Sie sollten die Namensregeln von Java-Bezeichner folgen, so dass es einfacher ist, zu lesen, Ihre Code. https://docs.oracle.com/javase/tutorial/java/nutsandbolts/variables.html – sebenalern

+0

Also, Sie werfen eine 'IllegalArgumentException', was würde dann eine' EmptyStackException' fangen? –

Antwort

-1

Im zweiten Codeblock , s2 hat nur scop e innerhalb des try Blocks. Erklären Sie stattdessen s2 außerhalb der try.

Bearbeiten: Das ist, was ich für das Posting zu schnell bekommen. s2 Anweisungen sollten in der try sein.

Region3 = new Region("BedRock", 23423,RegionType.VILLAGE); 
State s2 = null; 
try{ 
    s2 = new State("Khemed", Region3); 
    s2.addRegion(Region2); 
    s2.addRegion(Region1); 
}catch(EmptyStackException e){ //You should log this or something 
} 
+0

Das wird eine Nullzeigerausnahme werfen – saml

+0

Also habe ich das gemacht und die 2 letzten Zeilen funktionieren jetzt gut, das Problem ist, dass das Programm die Ausnahme nicht abfängt und es einfach passieren lässt, wenn es nicht passieren sollte. – Viscceras

+0

Sie müssen mindestens Ihren RegionType-Code und möglicherweise auch Ihre Region-Klasse posten. – Zircon

2

Ihre Variable s2 wird nur in Ihrem try/catch Block definiert ist, versuchen Sie, die zwei Linien im try/catch Block zu setzen.

Aber der beste Ansatz hier ist es, die Ausnahme IllegalArgumentException nicht zu fangen.

+0

@SotiriosDelimanolis Ich schlug eine Lösung, um sein aktuelles Problem zu beheben. Aber es ist nicht der Weg, es trotzdem zu tun, ich habe meine Antwort konsequent aktualisiert, bitte überprüfe noch einmal. –

+0

Ich habe das gemacht, und das Problem mit den 2 letzten Zeilen behoben, jetzt funktionieren sie richtig. Aber es scheint, dass ich die Ausnahme im "try catch" Block nicht fangen kann, der Konstruktor funktioniert gut, wenn es nicht sollte. – Viscceras

+0

welcher Versuch/catch Block? –

1
Region3 = new Region("BedRock", 23423,RegionType.VILLAGE); // 
try{ 
    State s2 = new State("Khemed", Region3); 
    s2.addRegion(Region2); 
    s2.addRegion(Region1); 
}catch(IllegalArgumentException e){ 
} 

Zuerst müssen Sie 2 Zeilen eingeben, um Block zu versuchen/zu fangen. Und Ihr "State" -Konstruktor hat 3 Parameter. Aber Sie verwenden einen anderen Konstruktor (2 params):

State s2 = new State("Khemed", Region3); // 2 params 
public State(String Name, int Population, Region Capital)// 3 params 

Verwendung mit Bevölkerung param wie dies in Try-Block:

Region3 = new Region("BedRock", 23423,RegionType.VILLAGE); // 
try{ 
    State s2 = new State("Khemed", 123,Region3); 
    s2.addRegion(Region2); 
    s2.addRegion(Region1); 
}catch(IllegalArgumentException e){ 
} 
+0

Der Klassenstatus hat 2 Konstruktoren, einen mit 2 Parametern und anderen mit 3 Parametern. Ich habe vergessen, Ihnen zu sagen, dass es sofort hinzufügen wird. Denkst du, dass es deshalb nicht funktioniert? – Viscceras

Verwandte Themen