mainのString配列Pをどうにか表示したいです。
口下手なのでとりあえずソース載せます
class Stage {
public static void main(String[] args){
String[] P={"Hi","Hello","Bye"};
Act obj1 =new Act();
obj1.say();
}
}
class Act{
public String phrase[];
void say(int i){
System.out.println(phrase[i]);
}
void say(){
say(0);
}
}
いまのphrasesは空なので
Exception in thread "main" java.lang.NullPointerException
at Act.say(Stage.java:14)
at Act.say(Stage.java:19)
at Stage.main(Stage.java:6)
という例外が発生しているのはわかりました
中身は空なので当然phrasesにString配列のPの中身が必要だと考えました
いま考えているのは出力しているのはphrasesなのでphrases=Pにすれば良いと考えています
けどどうやってもエラーが帰ります。
お優しいかたこんな内容ですがアドバイスをお願いします
使いこなしたいけどなかなか上手くいかなくって

このQ&Aに関連する最新のQ&A

A 回答 (6件)

何がしたいのかわからんけど、


phrases=Pがエラーなのは
ActからStageが見えてないからじゃ?

こうすれば?

class Stage {
String[] P = { "Hi", "Hello", "Bye" };

public static void main(String[] args) {
Act obj1 = new Act();
obj1.say();
}
}
class Act {
public String phrase[];
void say(int i) {
Stage stage = new Stage();
phrase = stage.P;
System.out.println(phrase[i]);
}
void say() {
say(0);
}
}
    • good
    • 0
この回答へのお礼

有難うございます。
本当に単純にActからStageがみえていないだけでした。
けれどこれmainでPを宣言をすると何故かエラーチェックが"Pが解決できていないかもしくはフィールドではありませんという"エラーがくるんですよね
なぜでしょう?

お礼日時:2011/04/29 20:42

> コーディング最中にphrases=Pを打ちこむと’Pが解決されていません'ってエラーがでます



これの原因は分かったと思いますが、

> mainでPを宣言をすると何故かエラーチェックが"Pが解決できていないかもしくはフィールドではありませんという"エラーがくるんですよね
> なぜでしょう?

フィールドとローカル変数の区別を付けてください。
・mainメソッドの中で宣言したものはローカル変数。前にStage.とつけようが何をしようが、mainメソッドの外からはアクセスできません。
・メソッドの外で宣言したものはStageクラスのフィールド。フィールドにはクラスフィールドとインスタンスフィールドの2種類があって、Actからアクセスする方法がそれぞれ異なります。ANo.4さんの書き方はインスタンスフィールド。
    • good
    • 0
この回答へのお礼

ご親切に有難うございます。
だからmainで宣言している限りmain部分でしかアクセス出来なかったんですね。

お礼日時:2011/04/30 11:09

補足:No.4です。



結局はStageにどこまでアクセスさせるかと思うんだけど。
Main()がstaticな為、回りくどくなってるけど


interface InterfaceP {
public String[] getP();
}

class Stage implements InterfaceP {
private static String[] P = { "Hi", "Hello", "Bye" };
@Override
public String[] getP() {
return P;
}

public static void main(String[] args){
Act obj1 = new Act(new Stage());
obj1.say();
}
}

class Act {
public String phrase[];
public Act(InterfaceP test) {
phrase = test.getP();
}

void say(int i) {
System.out.println(phrase[i]);
}

void say() {
say(0);
}
}

頑張って勉強してくれ。
    • good
    • 0

質問文にあるプログラムに最小限の変更を加えるなら、Act obj1=new Act();とobj1.say();の間に


obj1.phrase=P;
を追加してください。"Hi"がprintlnされるようになります。
お勧めはしませんけど。

> 出力しているのはphrasesなのでphrases=Pにすれば良いと考えています
> けどどうやってもエラーが帰ります。

具体的には何をどうやろうとして、どんなエラーが返ったのですか? また、エラーが返ったのはコンパイル時ですか、実行時ですか?
    • good
    • 0
この回答へのお礼

いやコーディング最中にphrases=Pを打ちこむと’Pが解決されていません'ってエラーがでます
またPを渡さずそのまま出力すると今回の質問に書いてある例外が返ってきます。

お礼日時:2011/04/29 11:10

方法はいくつかあります。


たとえば、ActクラスにString[]を引数に取るコンストラクタを定義してmainメソッドでPを渡してあげる、とか。
    • good
    • 0
この回答へのお礼

ご親切に有難うございます
う~ん・・・言葉で表せるほど上達していないのでなんとも言えないです。
とりあえず参考にさせて戴きます

お礼日時:2011/04/29 20:46

何をしたのかがわからないし


どんなエラーが出たのかも分からないわね。

もしコンパイルエラーだったら
変数のスコープを勉強しなおせって
言いたくなるので
実行時エラーであることを期待するけど。
    • good
    • 0

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


人気Q&Aランキング