1

中国語の書記体系に関する知識をテストするために、Java で非常に単純なコマンド ライン プログラムに取り組んでいます。目標は、英語、ピンイン、または漢字を表示し、表示されていない 2 をユーザーに入力させることです。いくつかの単純な配列エラーに対処した後、NullPointerException が発生しました。

今、私はそれが何であるかを理解していますが、なぜそれが起こっているのか分かりません.

Master.java というファイルには、次のものがあります。

static final String [] [] Mandarray = {{"You", "Nǐ", "你"}, {"Good", "Hǎo", "好"}};

Chinese_Mandarin オブジェクトのコンストラクターで、次のように、この配列の内容を Chinese_Mandarin オブジェクトのメンバーの 1 つである新しい配列にコピーします。

    public Chinese_Mandarin(char transfer){ 
    if(transfer == 'n' || transfer != 'y')System.exit(0);

    for (int i = (Master.Mandarray.length-1); i>0 ;i--){
        mandalist [i][0] = Master.Mandarray[i][0];
        mandalist [i][1] = Master.Mandarray[i][1];
        mandalist [i][2] = Master.Mandarray[i][2];
    }

ユーザーが続行するかどうかを尋ねるシステムの上記の「if」部分では、それは重要ではありません。次に、最初の文字が * であるかどうかを調べて、同じエントリが再度表示されないようにします。これは、プログラムによって、エントリが既に使用されていることを示します。

public void presenter(){
    Scanner chinEngl = new Scanner(System.in);
    restart: for (int i = mandalist.length; i>0 ;i--){
        randInt = random.nextInt(mandalist.length);
        randIntSub = random.nextInt(3);
        if(mandalist[randInt][randIntSub] == ""){
            continue restart;
        }
        else if (((mandalist[randInt][randIntSub]).charAt(0)) == '*'){
            continue restart;
        }

ここでは、後で使用するスキャナーを初期化し、後で使用する 2 つのランダムな整数を作成し、要素が空でないことを確認します (空である場合は、「restart」タグに渡してループを続行します)。 .

行上:

else if (((mandalist[randInt][randIntSub]).charAt(0)) == '*'){

NullPointerException エラーが発生しましたが、その理由を理解できません... Master.mandarray は mandalist に転送されました。(しかし、それが私がここにいる理由です) したがって、完全なエントリの最初の文字を取得するのに問題はないはずです。 、 右?

システムが漢字を取得し、それを処理する方法がわからないという問題はありますか? それとも、私が行方不明になっているものですか?私を助けてくれる人に感謝します。確実にクレジットを獲得できます!

4

2 に答える 2

1

The problem is with the line

for (int i = (Master.Mandarray.length-1); i>0 ;i--){

The test i>0 is done before the loop body, so the loop is not done when i is zero.

This means that the remaining elements of the array are null.

IMHO it is more common to use the old C-style idiom

for (int i = 0; i < Master.Mandarray.length; i++) {

for looping through arrays, unless there is a special reason for going backwards.

于 2013-09-08T23:30:38.543 に答える
1

あなたにはたくさんのバグがあります。

バグ 1:

文字列を比較しequals()ないために使用します。==この行:

if(mandalist[randInt][randIntSub] == ""){

次のようにする必要があります。

if(mandalist[randInt][randIntSub].equals("")){

またはそれ以上:

if(mandalist[randInt][randIntSub].isEmpty()){

バグ 2:

Java 配列はゼロベースです。配列の最大インデックスはであり、最小インデックスは 1 ではなくゼロであるため、ループは次のようになりますlength - 1length

for (int i = mandalist.length; i>0 ;i--){

次のようにする必要があります。

for (int i = mandalist.length - 1; i >= 0 ;i--){

バグ 3 (問題を引き起こしているもの):

バグ 2 と同様に、ループは要素をインデックス 0 で初期化する前に停止するため、次のようになります。

for (int i = (Master.Mandarray.length-1); i >= 0 ;i--){ // i >= 0, not i > 0

インデックスを下にループする必要が本当にない限り、インデックスを上に移動する業界標準のアプローチを使用します。

for (int i = 0; i < Master.Mandarray.length-1; i++){
于 2013-09-08T23:33:12.087 に答える