2016-05-05 9 views
0

基本的には、コンストラクタを持つクラス、特に状態のコンストラクタがあります。コンストラクタで都市型領域(州に2つのコンストラクタがあり、の両方が名前と地域を受け入れる)がある場合にのみ、新しい状態を作成できます。"try and catch"を使って新しいオブジェクトを作成する

コードは次のようになります

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; 
} 

領域のタイプは、列挙クラスを使用して定義されます。私は基本的に私の問題だテストクラス(メインクラス)

 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 

、2つの最後の行に新しい関数を作成するときに問題がある、私は、変数S2をintialized haven't言って私にエラーを与えます。

"try and catch"せずにコードを実行して、コンストラクターでif文が動作するかどうかを確認しましたが、それは動作しませんでした。

メソッド "add"はスーパークラスの状態(Contry)で定義されたメソッドであり、単純に状態を追加することができます。

私はこれをどのように解決できるか見ることができないため、あなたが助けてくれることを願っています。

ADDED(私の質問に答えることを要求された)

クラスリージョン:2番目のコードブロックで

public enum RegionType { 
CITY, 
VILLAGE, 
TOWN, 

}

+0

をごコード。 https://docs.oracle.com/javase/tutorial/java/nutsandbolts/variables。html – sebenalern

+0

だから、あなたは 'IllegalArgumentException'を投げ、' EmptyStackException'を捕まえるでしょうか? –

答えて

-1

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; 
} 

列挙リージョンタイプで、s2にはスコープしかありませんeをtryブロック内に追加します。代わりにs2tryの外側に宣言してください。

編集:それは私があまりにも速く投稿するために得るものです。 s2ステートメントはtryにあるはずです。

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

これはヌルポインタ例外を投げます – saml

+0

私はそれをやったことがあり、最後の2行はうまくいきます。問題は、プログラムが例外をキャッチしていないということです。 – Viscceras

+0

RegionTypeコードを、最低でもリージョンクラスにも投稿する必要があります。 – Zircon

2

あなたs2変数のみごtry/catchブロックで定義されている、try/catchブロック内の2行を入れてみてください。

ただし、ここでの最適なアプローチは、例外IllegalArgumentExceptionをキャッチすることを避けることです。

+0

@SotiriosDelimanolis私は現在の問題を解決するための解決法を提案しました。しかし、とにかくそれを行う方法ではありません、私は私の答えを更新し、結果を再度確認してください。 –

+0

私はこれをやって、2つの最後の行で問題を修正しました。しかし、私はtryキャッチブロックで例外をキャッチすることはできませんが、コンストラクタはうまくいけないときにうまくいくようです。 – Viscceras

+0

try/catchブロック? –

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

まず、try/catchブロックに2行入れる必要があります。あなたの "State"コンストラクタには3つのパラメータがあります。 tryブロックでは、このような人口のparamと

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

用途:しかし、あなたは別のコンストラクタ(2つのparams)を使用していることが読みやすくなりますので、あなたはJava識別子の命名規則に従うべきである

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

クラスStateには、2つのコンストラクタがあり、1つは2つのパラメータを持ち、もう1つは3つのパラメータを持ちます。すぐに追加することを忘れてしまいました。それがなぜ機能しないのだと思いますか? – Viscceras

関連する問題