【问题标题】:'!' is accepted in a int method and has two diffrent values java'!'在 int 方法中被接受并且有两个不同的值 java
【发布时间】:2018-02-01 20:39:51
【问题描述】:

有人可以向我解释一下,我在 java 中的方法如何期望一个 int,但接受'!'作为论据?此外,当我调试它时,它如何将它解释为 33,但是当我执行 System.out.println(Character.getNumericValue('!'));它打印 -1?

这里是代码家伙:

public abstract class Stuff {

    public static char getCharacterFromNumber(int number) throws InvalidCharException {

        if(number>=20) {
            if (number <= 45) {
                switch (number) {
                    case 20:
                        return 'a';
                    case 21:
                        return 'b';
                    case 22:
                        return 'c';
                    case 23:
                        return 'd';
                    case 24:
                        return 'e';

                    case 25:
                        return 'f';
                    case 26:
                        return 'g';
                    case 27:
                        return 'h';
                    case 28:
                        return 'i';
                    case 29:
                        return 'j';

                    case 30:
                        return 'k';
                    case 31:
                        return 'l';
                    case 32:
                        return 'm';
                    case 33:
                        return 'n';
                    case 34:
                        return 'o';

                    case 35:
                        return 'p';
                    case 36:
                        return 'q';
                    case 37:
                        return 'r';
                    case 38:
                        return 's';
                    case 39:
                        return 't';

                    case 40:
                        return 'u';
                    case 41:
                        return 'v';
                    case 42:
                        return 'w';
                    case 43:
                        return 'x';
                    case 44:
                        return 'y';
                    case 45:
                        return 'z';
                }
            }
        }
        throw new InvalidCharException();
    }

    public static void main(String [] args){
        try {
            System.out.println(Stuff.getCharacterFromNumber('!'));
        } catch (InvalidCharException e) {
            e.printStackTrace();
        }
        System.out.println(Character.getNumericValue('!'));
    }
}

我已经搜索过,但没有找到与我的问题类似的东西,如果有人对标题有更好的想法,我会应用它:)

【问题讨论】:

  • 因为单引号表示char可以用作数字。
  • 我可以理解,但它怎么可能是-1和33呢?如果它是-1,我的 if 语句不应该停止它并抛出异常吗?
  • 尝试阅读 Character.getNumericValue() issue 或阅读该方法的文档,其中描述了您看到所见的原因。
  • 换一种说法,考虑像return (char) ('a' - 20 + number); 这样的东西,而不是开关。

标签: java


【解决方案1】:

字符文字只不过是纯值,但具有不同的类型。 48'0' 表示完全相同(尽管第一个是int 类型,第二个是char 类型)。 49 也表示与 '1' 相同的值。这就是为什么'a' + 1 会产生一个等于'b' 的值。

你感到困惑的是为什么会这样:

System.out.println(Character.getNumericValue('!'));

打印-1。好吧,要找出原因,让我们跳到java docs。我们可以看到Character.getNumericValue的方法:

返回指定字符(Unicode 代码点)表示的 int 值。

返回字符的 Unicode 值。如果您想查看代表字符文字 '!' 的数字,您可能希望这样做:

System.out.println((int)'!');

将打印:33

【讨论】:

  • "48 与 '0' 完全相同" - 好吧,它们属于不同的类型。如果你有两个同名的方法,一个接受int,一个接受char,那么foo(48)foo('0') 不会做同样的事情。我建议你在这方面澄清你的第一句话。
  • 谢谢。我已经相应地编辑了答案。你说得对,在这种环境下,我们需要非常具体地使用哪些词和术语
【解决方案2】:

角色'!' 有一个ASCII value of 33。 Java 允许将 char 值扩大到 int,这解释了为什么您可以将 char 传递给期望 int 的方法。

但是,Character.getNumericValue 做了一些不同的事情。

返回指定 Unicode 字符表示的 int 值。

(我的粗体强调)

'1' 返回1,而ASCII 码为49。如果字符不代表数值:

如果字符没有数值,则返回-1。

您会得到 2 个不同的值,因为 ASCII 码和数值是两个不同的概念。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-06-29
    • 2012-12-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-09-08
    相关资源
    最近更新 更多