2012-05-12 18 views
0

我改变了我的代码为丹建议我现在可以编译程序,但是,无论输入是什么,结果总是2.我把第二部分这个程序在新代码下面。请帮忙。除了线程“主”java.lang.NullPointerException -part2

以下是新代码。

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; 
    } 
} 

回答

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. 把手nullString s传递给构造函数。
  4. 使用switch可以简化逻辑并减少if-else逻辑中的冗余代码。
  5. 检查小写和大写元音。
  6. 忽略元音/辅音计数中的非字母字符。
  7. 实施自定义toString()
+0

谢谢大师。我改变了很多我的代码。因为这个程序的另一部分将把用户字符串传递给这个类,所以我不能改变很多返回结果。无论如何,我用Dan的建议来重写VowelCons类。但无论我输入什么,结果是2.想知道为什么,谢谢大师。 – LPlateJava

+0

对不起队友,我的错误。只是因为错误的方案没有奏效。但现在我修复它。它完美地工作。非常感谢。 – LPlateJava

3

它看起来像你初始化本地数组result,但随后试图从成员阵列result阅读[这部分不能按规定改变。由于您尚未初始化成员,因此仍然是null,因此您看到的是java.lang.NullPointerException

您可能想要将countVowelsAndCons更改为void返回类型,并且摆脱本地result。然后,您需要确保在拨打getNumVowelsgetNumConsonants之前致电。顺便说一句,像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; 
} 
相关问题