Мне нужно загладить первый символ каждого слова в предложении. Первый символ первого слова находится в верхнем регистре, и предложение должно быть прекращено только с полной остановкой или вопросительным знаком. Затем я должен считать все гласные и согласные в каждом слове приговора.StringTokenizer vs split() в программе
Вот мой код:
import java.io.*;
import java.util.*;
class ISC_Prac_2015
{
String s;
ISC_Prac_2015()
{
s="";
}
void input()throws IOException
{
System.out.println("Enter a sentence :");
BufferedReader buf=new BufferedReader(new InputStreamReader(System.in));
s=buf.readLine();
if(!((s.charAt(s.length()-1)=='.'||s.charAt(s.length()-1)=='?')))
{
System.out.println("Invalid input.");
System.exit(0);
}
}
char changeToUpper(char c)
{
return Character.toUpperCase(c);
}
boolean isVowel(char c)
{
if(c=='a'||c=='e'||c=='i'||c=='o'||c=='u'||c=='A'||c=='E'||c=='I'||c=='O'||c=='U')
return true;
else
return false;
}
void main()throws IOException
{
input();
String s2=s.substring(0,s.length()-1);
StringBuffer s3=new StringBuffer(s2);
for(int x=0;x<s3.length()-1;x++)
if(s3.charAt(x)==' ')
s3.setCharAt(x+1,changeToUpper(s3.charAt(x+1)));
String s4=s3.toString();
System.out.println("\n"+s4);
StringTokenizer st=new StringTokenizer(s4);
String a[]=new String[st.countTokens()];
for(int x=0;x<st.countTokens();x++)
a[x]=st.nextToken();
/*replace the 4 lines above with String a[]=s4.split(" ");
and the program works, but why?*/
System.out.println("Word\t\t"+"Vowels\t\t"+"Consonants");
int vowel=0,consonant=0;
for(int x=0;x<a.length;x++)
{
for(int y=0;y<a[x].length();y++)
if(isVowel(a[x].charAt(y)))
vowel++;
else
consonant++;
if(a[x].length()<8)
System.out.println(a[x]+"\t\t"+vowel+"\t\t"+consonant);
else if(a[x].length()>=8&&a[x].length()<16)
System.out.println(a[x]+"\t"+vowel+"\t\t"+consonant);
else
System.out.println(a[x]+vowel+"\t\t"+consonant);
}
}
}
Имя класса свойственен, потому что это был вопрос, заданный в моем компьютерном экзамене.
Программа несколько работает, но я получаю NullPointerException
по какой-то причине на внутренней петле for
в main()
. Но когда, как я прокомментировал в программе, если я использую функцию split(" ")
, программа работает правильно.
Но почему? Не StringTokenizer
делать то же, что split(" ")
?
Просто в сторону, ваш код трудно читать из-за отсутствия интервалов/фигурных скобок и слабых имен переменных ('s1',' s2'). И в частности, какая линия бросает «NullPointerException»? – ryanyuyu