0

これは、私が取り組んでいるクラス ファイルの大幅に簡略化されたバージョンです。これらのクラスを使用して問題を示しました。

public class Test {
    private String string1 = null;
    private String string2 = null;

    private void setString(String s) {
        s = "hello";
    }

    private void set() {
        setString(string1);
        setString(string2);
    }

    public void print() {
        System.out.println(string1);
        System.out.println(string2);
    }

    public void initialise() {
        set();
        print();
    }  
}

public class StringTest {
    public static void main(String[] args) {
        Test test = new Test();
        test.initialise();
    }
}

とにかく、基本的に、この後、2 つの文字列変数はまだ null です。この問題の原因は何ですか? どうすればそれを回避できますか?(まだJavaの基礎を学んでいます-それが関連している場合)。

ヘルプ/ガイダンスは大歓迎です。

4

7 に答える 7

6

String は不変であるため、メソッド内で行った変更はそのメソッドに対してローカルになります。

private void setString(String s) {
   s = "hello";
}

s変更できません。

2つの選択肢が考えられます。

オプション1

インスタンスs変数 (フィールド) を作成し、メソッドを変更します。

public class Test { プライベート文字列 string1 = null; プライベート文字列 string2 = null; プライベート String s;

private void setString(String s) {
    this.s = "hello";
}

オプション 2

の代わりにStringBuilder/を渡します。StringBufferString

于 2012-05-02T13:51:56.827 に答える
5

あなたの問題は、Javaが値渡しであるため、setStringメソッドは何もしないことです。の値を変更するには、コードのどこかにstring1必要です。string1 = xxxx;例えば:

private void set() {
    string1 = getDefaultString();
    string2 = getDefaultString();
}

private String getDefaultString() {
    return "hello";
}
于 2012-05-02T13:52:28.480 に答える
1

string1またはstring2ではなく「s」の値を設定しています

のようなものを試してください。

private void setString(String s) {
        string1 = "hello";
        string2 = "world";
    }
于 2012-05-02T13:57:22.727 に答える
1

この割り当てを行うことで

 s = "hello";

新しいオブジェクトを作成しています。渡されたものとは異なるメモリアドレスを持ちますsetString(string1);

で受け取ったオブジェクトを変更する必要があります

 private void setString(StringBuilder  s) { ... }

新しいものを作成する代わりに。このメソッドで渡されたものとまったく同じオブジェクトを使用する必要があります。呼び出し元のメソッドが気付かないため、新しいものを作成できません (Java のパラメーターは決して出力パラメーターではありません)。

Java の String はinmutableであるため、その内容を変更することはできません。新しい String オブジェクトを作成するだけです。

@adarshr が指摘したように、変更可能なStringBuilderorを使用してStringBuffer、その内容を変更できます。しかし、コード内でString単に置き換えることはできません。StringBuilder次のことを確認する必要があります。

  1. StringBuilderに渡される前に初期化されsetString()ます。
  2. StringBuilder内部で再作成されませんsetString()(渡されたものと同じものを使用しています)。

したがって、コードでこれを置き換えるとうまくいくはずです:

private StringBuilder string1 = new StringBuilder();
private StringBuilder string2 = new StringBuilder();

private void setString(StringBuilder  s) {
    s.append("hello");
}
于 2012-05-02T14:30:00.033 に答える
0

との値を初期化しようとしていますstring1string2?2つのメンバー変数は最初はnullです。

クラスをPOJO(プレーンオールドJavaオブジェクト)として扱う場合はTest、次のようにgetter/setterメソッドを追加します。

public class Test {

  private String string1;
  private String string2;

  public String getString1() {
    return this.string1;
  }

  public String getString2() {
    return this.string2;
  }

  public void setString1(String s) {
    this.string1 = s;
  }

  public void setString2(String s) {
    this.string2 = s;
  }

  /*
   * Additional methods
   */
  public void set() {

    setString1("hello");
    setString2("world");
  }

  public void print() {

    System.out.println(this.string1);
    System.out.println(this.string2);
  }

  public void initialize() {

    set();
    print();
  }
}
于 2012-05-02T13:59:39.797 に答える
0

Java パラメータの受け渡しを誤解している場合は、試してみてくださいpublic void setString1(String s) { string1 = s; }

于 2012-05-02T13:53:45.817 に答える
-2

あなたのアプリケーションはパラメーター s に hello ワードを割り当てています..しかし、変数 s はパラメーター型であり、s のリフレクションは setString() メソッド ブロック内にあります...他の場所ではありません...インスタンス変数または静的変数を使用してあなたの割り当ての反映を参照してください。

于 2012-05-02T13:54:25.320 に答える