-1

ダンが今すぐプログラムをコンパイルできると提案したので、コードを変更しましたが、入力が何であれ、結果は常に 2 です。このプログラムの 2 番目の部分を新しいコードの下に置きます。助けてください。

これが新しいコードです。

    public class VowelCons 
        {
    private final String str;
    private final int totalConsonants;
    private final int totalVowels;

        public VowelCons(final String s) 
    {
             this.str = s;
                int totalConsonants = 0;
                int totalVowels = 0;
                if (null != s) 
        {
                    for (final char c : s.toCharArray()) 
            {
                                switch (c) 
                    {
                                        case 'A':
                                        case 'a':
                                        case 'E':
                                        case 'e':
                                        case 'I':
                                        case 'i':
                                        case 'O':
                                        case 'o':
                                        case 'U':
                                        case 'u':

                        totalVowels++;
                                            break;

                        default:

                        if (Character.isLetter(c)) 
                        {
                                                    totalConsonants++;
                                            }
                                            break;
                                    }
                        }
                }
            this.totalConsonants = totalConsonants;
            this.totalVowels = totalVowels;
        }


    public String getString() 
    {
             return str;
    }

    public int getNumConsonants() 
    {
                return this.totalConsonants;
    }

    public int getNumVowels() 
    {
                return this.totalConsonants;
    }
}

このプログラムには、ユーザーの入力を取得してこのクラスに渡す別の部分があります。これがコードです。【この部分は規定により変更できません

    import java.util.Scanner;

    public class VowelConsCounter
    {
        public static void main(String[] args)
        {
         String input;        // User input
         char selection;      // Menu selection

         Scanner keyboard = new Scanner(System.in);

         System.out.print("Enter a string: ");
         input = keyboard.nextLine();

         VowelCons vc = new VowelCons(input);

        do
        {
          selection = getMenuSelection();

          switch(Character.toLowerCase(selection))
          {
            case 'a' :  System.out.println("\nNumber of vowels: " +
                        vc.getNumVowels());
                        break;
            case 'b' :  System.out.println("\nNumber of consonants: " +
                        vc.getNumConsonants());
                        break;
            case 'c' :  System.out.println("\nNumber of vowels: " +
                        vc.getNumVowels());
                        System.out.println("Number of consonants: " +
                        vc.getNumConsonants());
                        break;
            case 'd' :  System.out.print("Enter a string: ");
                        input = keyboard.nextLine();
                        vc = new VowelCons(input);
         }

      } while (Character.toLowerCase(selection) != 'e');

   }

   public static char getMenuSelection()
   {
      String input;     
      char selection;   

      Scanner keyboard = new Scanner(System.in);

      System.out.println("a) Count the number of vowels in the string.");
      System.out.println("b) Count the number of consonants in the string.");
      System.out.println("c) Count both the vowels and consonants in the string.");
      System.out.println("d) Enter another string.");
      System.out.println("e) Exit the program.");

      input = keyboard.nextLine();
      selection = input.charAt(0);

      while (Character.toLowerCase(selection) < 'a' || Character.toLowerCase(selection) > 'e')
      {
         System.out.print("Only enter a, b, c, d, or e: ");
         input = keyboard.nextLine();
         selection = input.charAt(0);
      }

      return selection;
   }
}
4

2 に答える 2

3

ローカル配列を初期化しているようですがresult、メンバー配列から読み取ろうとしていますresult。メンバー 1 を初期化していないため、まだです。nullしたがって、表示されjava.lang.NullPointerExceptionているのは です。

countVowelsAndConsおそらく、戻り値の型を持つように変更しvoid、 local を取り除きたいでしょうresultgetNumVowels次に、またはを呼び出す前に、必ずそれを呼び出す必要がありますgetNumConsonants。ちなみに、次のようなものindexはメンバー関数内のローカル変数にする必要があります-それらはクラススコープには属しません。

しかし、もっと重要なことは、これはおそらくクラスであってはならないということです。おそらく次のようなものが必要です。

private static boolean isVowel(char c)
{
    return c == 'a' || c == 'e' || c == 'i' || c == 'o' || c == 'u';
}

public static int countConsonants(String s)
{
    int count = 0;
    for(int i=0, len=s.length(); i<len; ++i)
    {
        if(!isVowel(s.charAt(i))) ++count;
    }
    return count;
}

public static int countVowels(String s)
{
    int count = 0;
    for(int i=0, len=s.length(); i<len; ++i)
    {
        if(isVowel(s.charAt(i))) ++count;
    }
    return count;
}
于 2012-05-12T15:51:17.080 に答える
0

NullPointerExceptionインスタンス変数を初期化していないため、取得していますresult

以下を使用することをお勧めします。

public class VowelCons {
    private final String str;
    private final int totalConsonants;
    private final int totalVowels;

    public VowelCons(final String s) {
        this.str = s;
        int totalConsonants = 0;
        int totalVowels = 0;
        if (null != s) {
            for (final char c : s.toCharArray()) {
                switch (c) {
                    case 'A':
                    case 'a':
                    case 'E':
                    case 'e':
                    case 'I':
                    case 'i':
                    case 'O':
                    case 'o':
                    case 'U':
                    case 'u':
                        totalVowels++;
                        break;
                    default:
                        if (Character.isAlphabetic(c)) {
                            totalConsonants++;
                        }
                        break;
                }
            }
        }
        this.totalConsonants = totalConsonants;
        this.totalVowels = totalVowels;
    }

    public String getString() {
        return str;
    }

    public int getTotalConsonants() {
        return this.totalConsonants;
    }

    public int getTotalVowels() {
        return this.totalConsonants;
    }

    public String toString() {
        return (null == str ? "" : str) + " [consonants=" + totalConsonants + ", vowels=" + totalVowels + "]";
    }

    public static void main(final String[] args) {
        for (final String arg : args) {
            final VowelCons vc = new VowelCons(arg);
            System.out.println(vc.toString());
        }
    }
}

たとえば、次のように出力されます。

$ java VowelCons foo BaR "Lady GODIVA"
foo [consonants=1, vowels=2]
BaR [consonants=2, vowels=1]
Lady GODIVA [consonants=6, vowels=4]

この例が学習に役立ついくつかのポイントを次に示します。

  1. ローカル変数はインスタンス変数を隠すことがあります ( [1]および[2]を参照)。
  2. thisインスタンス変数を参照するために使用します ( [1]を参照)。常に を使用してインスタンス変数を参照する必要がありますthis。これにより、後でコードを変更するときに誤って非表示にすることを防ぎ、IDE がインスタンス メンバーのみを含む状況依存の提案を提供できるようになります。
  3. null Stringコンストラクタに渡されるハンドル。
  4. switchロジックを簡素化し、ロジック内の冗長コードを削減するために使用しif-elseます。
  5. 小文字と大文字の母音を確認します。
  6. 母音/子音のカウントでアルファベット以外の文字を無視します。
  7. カスタムを実装しますtoString()
于 2012-05-12T16:51:29.257 に答える