为什么我的tostring方法说我错过了一个return语句?

时间:2014-01-27 02:02:29

标签: java ascii java.util.scanner tostring bluej

我的String toString()方法有问题。这是整个程序的代码(请记住,我是java世界的新手,所以请解释任何答案,谢谢)

import static java.lang.System.*;
import java.util.Scanner;
public class CharacterAnalyzer
{
private char theChar;
private boolean isUpper, isLower, isNumber;
public CharacterAnalyzer()
{
    char theChar = ' ';
}
public CharacterAnalyzer(char c)
{
    theChar = c;
}
public void setChar(char c)
{
    theChar = c;
}
public char getChar()
{
    char getChar= theChar;
    return getChar;
}
public boolean isUpper( )
{
    if (((int)theChar)>64&&((int)theChar)<91){
        boolean isUpper = true;
        return isUpper;
    }   
    else{
        boolean isUpper = false;
        return isUpper;
    }
}
public boolean isLower( )
{

    if (((int)theChar)>97&&((int)theChar)<123){
        boolean isLower = true;
        return isLower;
    }   
    else{
        boolean isLower = false;
        return isLower;
    }
}
public boolean isNumber( )
{
    if (((int)theChar+48)>47&&((int)theChar+48)<58){
        boolean isNumber = true;
        return isNumber;
    }   
    else{
        boolean isNumber = false;
        return isNumber;
    }

    }
public int getASCII( )
{
        return ((int)theChar);
}
public String toString()
{

    if(isNumber == true && isUpper == false && isLower == false){
        String chartype = "a number";
        return ""+getChar() + " is "+chartype+". ASCII == " + getASCII() + "\n";
    }
    else if(isNumber == false && isUpper == true && isLower == false){
        String chartype = "an uppercase character";
        return ""+getChar() + " is "+chartype+". ASCII == " + getASCII() + "\n";
    }
    else if(isNumber == false && isUpper == false && isLower == true){
        String chartype = "a lowercase character";
        return ""+getChar() + " is "+chartype+". ASCII == " + getASCII() + "\n";
    }

}
}

以下是跑步者:

import static java.lang.System.*;
import java.util.Scanner;

public class Lab05d
{
    public static void main ( String[] args )
    {
        Scanner keyboard = new Scanner(System.in);

        out.print("Enter a letter :: ");
        char letter = keyboard.next().charAt(0);
        CharacterAnalyzer test = new CharacterAnalyzer(letter);
        out.println(test);   //A

        //add more test cases

        out.print("Enter a letter :: ");
        char letter2 = keyboard.next().charAt(0);
        CharacterAnalyzer test2 = new CharacterAnalyzer(letter2);
        out.println(test2);   //l

        out.print("Enter a letter :: ");
        char letter3 = keyboard.next().charAt(0);
        CharacterAnalyzer test3 = new CharacterAnalyzer(letter3);
        out.println(test3);   //a

        out.print("Enter a letter :: ");
        char letter4 = keyboard.next().charAt(0);
        CharacterAnalyzer test4 = new CharacterAnalyzer(letter4);
        out.println(test4);   //7

        out.print("Enter a letter :: ");
        char letter5 = keyboard.next().charAt(0);
        CharacterAnalyzer test5 = new CharacterAnalyzer(letter5);
        out.println(test5);   //D

        out.print("Enter a letter :: ");
        char letter6 = keyboard.next().charAt(0);
        CharacterAnalyzer test6 = new CharacterAnalyzer(letter6);
        out.println(test6);   //2

        out.print("Enter a letter :: ");
        char letter7 = keyboard.next().charAt(0);
        CharacterAnalyzer test7 = new CharacterAnalyzer(letter7);
        out.println(test7);   //X

        out.print("Enter a letter :: ");
        char letter8 = keyboard.next().charAt(0);
        CharacterAnalyzer test8 = new CharacterAnalyzer(letter8);
        out.println(test8);   //Z

        out.print("Enter a letter :: ");
        char letter9 = keyboard.next().charAt(0);
        CharacterAnalyzer test9 = new CharacterAnalyzer(letter9);
        out.println(test9);   //9


    }
}

我很确定错误只是在String toString方法中,至少这是bluej告诉我的。我环顾四周,其他人只是在他们的代码上添加了一个else语句,但是当我这样做时,它总是执行else语句,绕过我的ifs(我不知道为什么,我把它们放在同一个缩进上。 ..)。我也尝试完全在ifs / elses之外放置一个返回,当我编译它时,它没有找到我在toString方法中使用的变量,isUpper是isLower和isNumber值。当我的老师分配了这个时,他给了我们用来测试它的输入,A, 1, 一个, 7, d, 2, X, Z, 9 那么,我如何让它运行并输出它们的ASCII值,65,49,97,55,68,50,88,122,57(我已经超过了这个愚蠢的问题很多次,他们的价值被铭刻在我的脑海里。 ..)。 我真的很沮丧,请帮帮我!

其实我只是想到了什么。我认为它可能找不到我之前的方法(isUpper,isLower和isNumber),它们只会执行其他语句,使它们全部为假,从而使我的所有ifs无效......任何人都知道如何解决这个问题?< / p>

3 个答案:

答案 0 :(得分:3)

您的toString方法采用

的形式
if (a) {
    // return stuff
} else if (b) {
    // return stuff
} else if (c) {
    // return stuff
}

没有保证执行路径,其中包含return语句。即使逻辑规定当ca都为假时b总是为真,这对编译器来说还不够好。

如果在ca都为假时b始终为真,那么您应该将else if (c)更改为else

或者,您可以在方法结束处抛出此内容:

return "";

或者您可以添加到当前方法:

} else {
    // throw an exception
}

答案 1 :(得分:1)

你有以下内容:

if (...)
    return ...
else if (...)
    return ...
else if (...)
    return ...

问题:如果if条件都不匹配会怎样?

答案:有一个可怕的错误,因为在最终的else if条款之后没有返回语句。正如上面的回答所说,知道它无法从最终结束 - 编译器知道这一点并不重要。要修复错误,您需要执行以下操作之一:

if (...)
    return ...
else if (...)
    return ...
else if (...)
    return ...
else
    return ...

if (...)
    return ...
else if (...)
    return ...
else if (...)
    return ...
return ...

请注意,第二个答案在所有条款下面都有一个return语句。这是一个小的区别,就你的问题而言并不重要,但是,例如,如果其中一个if子句在其中有另一个条件,则可能无法返回某些内容。例如:

if (...)
    if (...)
        return ...
    else
        ...
else if (...)
    return ...
else if (...)
    return ...
else
    return ...

上面的编译也无法编译,因为嵌套的return子句中没有else语句。

答案 2 :(得分:0)

基本上,我们无法保证您的代码中会出现return语句。

你可以重构它:

public String toString()
{
    // declare variable to store return value, initialize it to ¿empty string?
    // if - elseif logic to assign proper value to the variable
    // return the string variable 
}