为什么代码没有响应并继续运行?

时间:2014-11-04 03:58:15

标签: java methods while-loop roman-numerals

我正在编写一个程序,将罗马数字翻译成十进制数字。

由于某种原因,它在检查用户输入时不会返回值。但它已经修好了,

我现在面对的是:代码没有回复我的数字(输入后它会一直显示一个空白的屏幕)。

我该如何解决这个问题?我的代码中有问题吗?我只是一个初学者,所以我学到的只是基本的东西。

public static void main(String[] args) {
        // Fill in the body
        Scanner in= new Scanner(System.in);
        String user = promptUserForNumeral(in);
        while (user.length()!=0) {
            int numb= convertNumeralToNumber(user);
            System.out.println("The numeral "+user+ " is the decimal number "+numb);
            user = promptUserForNumeral(in);
        }
    }
private static String promptUserForNumeral(Scanner inScanner) {
    // Fill in the body
    System.out.println("Enter a roman numeral (Q to quit): ");
    String i = inScanner.nextLine();
    while (i.length()<=0) {
        System.out.println("ERROR! You must enter a non-empty line!");
        System.out.println("Enter a roman numeral (Q to quit): ");
        i = inScanner.nextLine();
    }
    if ( i.equalsIgnoreCase("q")) {
        System.out.println("Goodbye!");
        System.exit(0);
    }
    return i;

}
private static int convertNumeralToNumber(String numeral) {
    // Fill in the body
    int numb = 0;
    int n=0;
    int ch=0;
    while (n<numeral.length()) {
        char l= numeral.charAt(n);
        numb=convertCharacterToNumber(l);
        if (numb<0) {
            System.out.println("Cannot be define");
            n++;
        }
        else if (n==numeral.length()) {
            ch+=numb;
        }
        else {
            int nnumb=convertCharacterToNumber(numeral.charAt(n));
            if (nnumb>numb) {
                ch+=nnumb-numb;
                n++;                    
            }
            else {
                ch+=numb;
            }
        }
    }
    if (ch>3999) {
        System.out.println("Input number must be less than 3999");
        numb=ch;
    }
    return numb;


}


private static int convertCharacterToNumber(char numeral) {
    // Fill in the body
    int n=0;
    if (numeral=='m' || numeral =='M') {
        return 1000;
    }
    else if (numeral=='d' || numeral=='D') {
        return 500; 
    }
    else if (numeral=='c' || numeral=='C') {
        return 100;
    }
    else if (numeral=='l' || numeral=='L') {
        return 50;
    }
    else if (numeral=='x' || numeral=='X') {
        return 10;
    }
    else if (numeral=='v' || numeral=='V') {
        return 5;
    }
    else if (numeral=='i' || numeral=='I') {
        return 1;
    }
    else {
        return -1;
    }

}       

}

4 个答案:

答案 0 :(得分:0)

检查

while (i.length()>=0) {
    if (i.length()==0) {
        System.out.println("ERROR! You must enter a non-empty line!");
        System.out.println("Enter a roman numeral (Q to quit): ");
        i = inScanner.nextLine();
    }
    else if ( i.equalsIgnoreCase("q")) {
        System.out.println("Goodbye!");
        System.exit(0);
    }
}
return i;

当i.length()&gt;时,这不会退出或返回任何内容。如果用户没有输入q,则该返回是死代码。 解决方案:使用break指定else;那就行了。

else
   break;

答案 1 :(得分:0)

我会重写你的while循环:

while (i.length()<=0) {
    System.out.println("ERROR! You must enter a non-empty line!");
    System.out.println("Enter a roman numeral (Q to quit): ");
    i = inScanner.nextLine();
}
if ( i.equalsIgnoreCase("q")) {
    System.out.println("Goodbye!");
    System.exit(0);
}
return i;

答案 2 :(得分:0)

你有很多冗余的条件。问题出在这个循环中:

    while (i.length() >= 0) {
        if (i.length() == 0) {
            System.out.println("ERROR! You must enter a non-empty line!");
            System.out.println("Enter a roman numeral (Q to quit): ");
            i = inScanner.nextLine();
        } else if (i.equalsIgnoreCase("q")) {
            System.out.println("Goodbye!");
            System.exit(0);
        }
    }

为我喜欢&#34; V&#34;取任何价值。

  • 它的长度大于零,因此它进入循环。
  • 在第一个if条件下,它的长度再次不为零,因此它会进入elseIf
  • 由于该值不是&#34; q&#34;,否则其他部分也不会执行。
  • 所以它又回到了循环的开始&amp;如果长度大于零,则再次检查条件。

所以,你有一个无限循环。再次完成你的逻辑&amp;删除任何不必要的条件您还可以使用break;语句来终止循环。

答案 3 :(得分:0)

public class stringTest {
public static void main(String[] args) {
    // Fill in the body
    Scanner in= new Scanner(System.in);
    String user = promptUserForNumeral(in);
    while (user.length()!=0) {
        int numb= convertNumeralToNumber(user);
        System.out.println("The numeral "+user+ " is the decimal number "+numb);
        user = promptUserForNumeral(in);
    }
}
private static String promptUserForNumeral(Scanner inScanner) {
    // Fill in the body
    System.out.println("Enter a roman numeral (Q to quit): ");
    String i = inScanner.nextLine();
    while (i.length()>=0) {
        if (i.length()==0) {
            System.out.println("ERROR! You must enter a non-empty line!");
            System.out.println("Enter a roman numeral (Q to quit): ");
            i = inScanner.nextLine();
        }
        else if ( i.equalsIgnoreCase("q")) {
            System.out.println("Goodbye!");
            System.exit(0);
        }
        else return i; // in your program the while is never ending, so it does not return any value.
    }
    return "";
}
private static int convertNumeralToNumber(String numeral) {
    // Fill in the body
    int preNumber = 0;
    int curNumber = 0;
    int n=0;
    int ch=0;
    while (n<numeral.length()) {
        char l= numeral.charAt(n);
        curNumber=convertCharacterToNumber(l);
        if (curNumber<0) {
            System.out.println("Cannot be define");
            System.exit(0);
        }
        else {
            // I have changed the logic to evaluated decimal Number equivalent to Roman Literal
            if(preNumber < curNumber && n != 0) ch = curNumber - ch;
            else ch += curNumber;
            preNumber = curNumber;
        }
        n++;
    }
    return ch;
}


private static int convertCharacterToNumber(char numeral) {
    // Fill in the body
    if (numeral=='m' || numeral =='M') {
        return 1000;
    }
    else if (numeral=='d' || numeral=='D') {
        return 500; 
    }
    else if (numeral=='c' || numeral=='C') {
        return 100;
    }
    else if (numeral=='l' || numeral=='L') {
        return 50;
    }
    else if (numeral=='x' || numeral=='X') {
        return 10;
    }
    else if (numeral=='v' || numeral=='V') {
        return 5;
    }
    else if (numeral=='i' || numeral=='I') {
        return 1;
    }
    else {
        return -1;
    }

}    
}

您可以查看promptUserForNumeral方法,我认为没有必要。您可以在主while循环中包含它以查找用户错误。