アプリ版:「スタンプのみでお礼する」機能のリリースについて

GOF本のStrategyのJava版での質問です。
下記を実行すると、クラスCompositionのbreakCountの関数を実行した所で、NullPointerExceptionが発生してしまいます。(SimpleCompositorのcomposeの戻り値である1を期待しているのですが?)お分かりになる方、御教示ください。
//ここから
public class Main {
public static void main(String[] args) {
Composition quick = new Composition(new SimpleCompositor());
quick.repair();
}
}

class Composition {
public Composition(Compositor c) {
_components = new Vector();
_lineBreaks = new Vector();
}

public void repair() {
Hashtable natural = new Hashtable();
Hashtable stretchability = new Hashtable();
Hashtable shrinkability = new Hashtable();
int componentCount;
Hashtable breaks = new Hashtable();

// 初期化
componentCount = 0;
_lineWidth = 0;
natural.put("natural1", new Integer(0));
stretchability.put("stretchability1", new Integer(0));
shrinkability.put("shrinkability1", new Integer(0));
breaks.put("breaks1", new Integer(0));

// ブレーク位置を決める
int breakCount;
breakCount = _compositor.compose(
natural, stretchability, shrinkability,
componentCount, _lineWidth, breaks
);
//
 System.out.println(breakCount);
}
private Compositor _compositor;
private Vector _components;
private int _componentCount;
private int _lineWidth;
private Vector _lineBreaks;
private int _lineCount;
}

abstract class Compositor {
public Compositor() {
}

public abstract int compose(
Hashtable natural, Hashtable stretch, Hashtable shrink,
int componentCount, int lineWidth, Hashtable breaks );
}

class SimpleCompositor extends Compositor {
public SimpleCompositor() {
}

public int compose(
Hashtable natural, Hashtable stretch, Hashtable shrink,
int componentCount, int lineWidth, Hashtable breaks ) {
// ...
return 1;
}
}

A 回答 (2件)

_compositorをインスタンス化してないのでnullで当然です。

No.1さんも同様のことを言っていると思います。
Mainクラスで
>new Composition(new SimpleCompositor())
としていますが、CompositionクラスのコンストラクタでCompositorはどこにも設定してません。
ここで_compositorに代入するんじゃないのですか?

なんだか前回の質問と同じような内容な気が・・・

この回答への補足

すいません。
_compositorを実装クラスでオーバーライドする所が抜けていました。

public Composition(Compositor c) {
_compositor = c;
// ...
}

すいません。。。書き方の問題で、見落としていました。
以後、気をつけます。
ありがとうございました。

補足日時:2010/08/31 17:45
    • good
    • 0

ざっと見ただけなんだけど, compositor ってどこで値を入れてるの?

この回答への補足

Compositorは抽象クラス(Compositprクラスのcomposeも抽象関数)でnewできないので、実際の実装は、SimpleCompositorクラスで行っています。

Mainクラスの
Composition quick = new Composition(new SimpleCompositor());
のnew SimpleCompositor()がそれです。

補足日時:2010/08/31 16:12
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!