1

わかりましたので、以下のステートメントを return ステートメントに変換してみましたが、 「このステートメントは文字列型の変数を返す必要があります」と返されfinalStringても、常に通知され続けます。個々の if ステートメント、for ステートメント、その外側にfinalString入れようとしましたが、うまくいきません。return finalString助けや提案をいただければ幸いです。[コードの更新] まだ機能しません。finalString 値は if ステートメントによって変更されません。これはまさに私がやりたいことです。多分、finalString の値が if 文を通らないと思いますか?

[コード]

import java.util.Scanner;
public class pLat//pig latin program
{

    /**
       * Method to test whether a character is a letter or not.
       * @param c The character to test
       * @return True if it's a letter
       */
      private static boolean isLetter(char c) {
        return ( (c >='A' && c <='Z') || (c >='a' && c <='z') );
      }


    ///////////////////////////////////////////
      private static String output(String input)//processes the word using basic rules including the q and u rule
      {

          //the string that will hold the value of the word entered by the user
          char s;//the first character of the string
          char m;
          int l = input.length();//determines the length of the string
          String endString;
          String startString;
          String finalString = ""; //the final output
          String mtr;
          String lowercase;//the entered string all converted to lowercase

          for(int k =0;k<l;k++)//checks all letters in order to see which is a vowel
          {

              s = input.charAt(k);

          if(s == 'q'|| s=='Q' && input.charAt(k+1)=='u')//if the first vowel is a "u" and the letter before it is a "q"
          {


                  endString = input.substring(0,k+2);//makes the endString also include u
                  endString = endString +"ay";
                  startString = input.substring(k+2,l);
                  finalString = startString + endString;
                  //System.out.println(finalString);
                  return finalString;


          }

          if(s=='a'||s=='e'||s=='i'||s=='o'||s=='u'||s=='A'||s=='E'||s=='I'||s=='O'||s=='U'||s=='y'||s=='Y')//if its a vowel or "y" than executes commands below
          {

              endString = input.substring(0, k);//gets the letters before the vowel
              endString = endString + "ay";
              startString = input.substring(k,l);//gets the letters after the vowel
              finalString = startString + endString;
              //System.out.println(finalString);//prints the final result which is the combination of startString with endString
              //stops code after doing the above
              return finalString;

          }


          else if(k==l-1)//if its the end of the word
          {
              finalString = "ERROR";
              return finalString;

          }

         }
          System.out.println(finalString);
          return finalString;
}///////////////////////////////////

//   public static void process(String input)//will take care of the punctuation
//   {
//       String latin = "";
//          int i = 0;
//          while (i<input.length()) {
//
//            // Takes care of punctuation and spaces
//            while (i<input.length() && !isLetter(input.charAt(i))) {
//              latin = latin + input.charAt(i);
//              i++;
//            }
//            latin = latin + output(input);
//            System.out.println(latin);
//          }
//          
//    }


    public static void main(String[] args)
    {

        String str;//this will be the input string by the user
        Scanner scanner = new Scanner(System.in);//this scanner will register the input value
        System.out.println("Enter a Word: ");
        str = scanner.next();//stores the input string

        output(str);//outputs it using basic gramatical rules

    }

}
4

3 に答える 3

1

メソッド内のすべてのローカル ブロックにreturnステートメントが必要です。top-levelあなたがそれを持っていない場合は、その最上位ブロック内returnのすべてにステートメントを入れてください。block等々。

のセットの最も単純なケースを考えてみましょう if - else if - else: -

そのうちの 1 つだけが実行されるため、すべてifまたはブロック内から文字列を返す必要があります。elseそのため、そのうちの 1 つで return ステートメントを見逃した場合、それblockが実行されたときに確実に return ステートメントが失われる可能性があります。あなたの最後にリターンステートメントがない場合method

したがって、基本的に、return ステートメントはすべてのブロックに含まれている必要があり、その実行には他のブロックの実行は必要ありません。これらのブロックが条件が持つ可能性のあるすべての可能性をカバーしている場合、ブロックの外に return ステートメントは必要ありません。ブロック。これらのブロックの 1 つが確実に実行されるためです。

また、それらが特定の条件elseblocksのすべての可能性をカバーしていない場合は、それらのブロックの外側にステートメントが必要です。これらのブロックがどれも実行されない場合、 は return ステートメントを見逃すためです。(like if you are not having anfor a set of if-else-if)returnmethod

したがって、たとえば、最も可能性の高い可能性をカバーする以下のコードのセットを確認できます。

public String returnString() {
        if (..) {
             return "someString";

        } else if (...) {
             return "someString";

        } else {
             return "someOtherString";
        }
       // return statement here is not needed. Because at least `else` will execute
}

ifしたがって、 、else ifまたはの少なくとも 1 つelseが常に実行されます。そのため、それらに return ステートメントを追加し、それらのブロックの外に return ステートメントを残すことができます。

ただし、最後のelseブロックが だったelse if場合は、何も実行されない可能性がありますblocks。その場合、それらのブロックの後に return ステートメントを配置する必要があります。

public String returnString() {
        if (..) {
             return "someString";

        } else if (...) {
             return "someString";

        } else if (...){
             return "someOtherString";
        }
       // return statement here is needed. 
       // Because its possible that none of the blocks in `if-else` set get executed.
}

別の可能性としては、すべてのブロックから戻るのではなく、ローカル変数に を格納し、すべてのブロックの最後でメソッドの最後のステートメントとしてローカル変数のそれをreturn value返すことができます。value

public String returnString() {
    int returnValue = 0;
    if (..) { returnValue = someValue; }
    else if(...) { returnValue = someOtherValue; }

    return returnValue;
}

注: -に格納しているため、コードで最後の方法を利用できreturn valueますfinalString。したがって、メソッドの最後の行でその文字列を返すだけです。

于 2012-10-29T16:43:33.967 に答える
0

申し訳ありませんが、これは実際には答えではありません。Rohit Jain は、コードが機能しない理由について適切な説明を提供しました。そこから、あなたはそれを理解できるはずです。

あなたのコードを見ると、このコードは必要以上に複雑であることがわかりました。私のIDE(Eclipse)は、コードを貼り付けるときに未使用の変数について警告します。あなたのケースが述べているように、複雑なコードを持つことは問題の原因です。

あなたの場合、少しリファクタリングすると役立つと思います。そして、あなたは問題を抱えていません。開始するには、文字列を 2 つに切断する場所を見つけることと実際の切断を分離してみてください。それは役立つはずです。多分このようなもの:

private static int firstVowel(String input) {
    for (int i = 0; i < input.length(); i++) {
        char aChar = input.charAt(i);
        if ("aeiouyAEIOUY".indexOf(aChar) >= 0) {
            if (aChar == 'u' && i > 0 && Character.toLowerCase(input.charAt(i-1)) == 'q') {
                return i-1;
            }
            // else
            return i;
        }
    }
    // if we get here no vowel was found
    return -1;
}

// /////////////////////////////////////////
private static String output(String input)
{
    int firstVowel = firstVowel(input);
    if (firstVowel < 0) {
        return "ERROR";
    }
    // else
    String start = input.substring(firstVowel);
    String end = input.substring(0, firstVowel) + "ay";
    return start + end;
}// /////////////////////////////////


public static void main(String[] args) {

    String str;// this will be the input string by the user
    Scanner scanner = new Scanner(System.in);// this scanner will register
                                                // the input value
    System.out.println("Enter a Word: ");
    str = scanner.next();// stores the input string

    System.out.println(output(str));// outputs it using basic gramatical rules

}
于 2012-10-29T21:03:29.353 に答える
0
private static String output(String input)//processes the word using basic rules including the q and u rule
{

    //the string that will hold the value of the word entered by the user
    char s;//the first character of the string
    char m;
    int l = input.length();//determines the length of the string
    String endString;
    String startString;
    String finalString;//the final output
    String mtr;
    String lowercase;//the entered string all converted to lowercase

    for(int k =0;k<l;k++)//checks all letters in order to see which is a vowel
    {

        s = input.charAt(k);

    if(s == 'q'|| s=='Q' && input.charAt(k+1)=='u')//if the first vowel is a "u" and the letter before it is a "q"
    {


            endString = input.substring(0,k+2);//makes the endString also include u
            endString = endString +"ay";
            startString = input.substring(k+2,l);
            finalString = startString + endString;
            System.out.println(finalString);
            break;


    }

    if(s=='a'||s=='e'||s=='i'||s=='o'||s=='u'||s=='A'||s=='E'||s=='I'||s=='O'||s=='U'||s=='y'||s=='Y')//if its a vowel or "y" than executes commands below
    {

        endString = input.substring(0, k);//gets the letters before the vowel
        endString = endString + "ay";
        startString = input.substring(k,l);//gets the letters after the vowel
        finalString = startString + endString;
        System.out.println(finalString);//prints the final result which is the combination of startString with endString
        break;//stops code after doing the above

    }


    else if(k==l-1)//if its the end of the word
    {
        System.out.println("ERROR");
        break;
    }
   }
   return finalString;
} 

ここ。これを試して :-/

あなたが何をしようとしていたのかわかりません。ループから抜け出すと、for()or while()ordo..while()ループを超えて到達します。これは、この場合、メソッドのほぼ最後になります。return finalString をそこに置き、メソッドの戻り値の型をoutputからvoidに変更しましたString

于 2012-10-29T16:36:21.217 に答える