【问题标题】:Getting a 'char cannot be dereferenced error' when compiling code using .toUpperCase();使用 .toUpperCase(); 编译代码时出现“char 无法取消引用错误”;
【发布时间】:2026-01-28 20:10:01
【问题描述】:

我是 Java 新手,正在编写一个程序,让您输入您的名字和姓氏,并提供您的姓名首字母,但我希望首字母始终为大写。

每当我运行代码时,我都会收到“无法取消引用字符”错误。

    import java.util.*;

    public class InitialHere
    {
        public static void main (String[] args)
        {
            Scanner getInput = new Scanner (System.in);
            String firstName;
            String lastName;
            char firstInitial;
            char lastInitial;

            System.out.println("What is your first name?");
            System.out.println();
            firstName = getInput.nextLine();
            System.out.println();
            System.out.println("Thankyou, what is your last name?");
            System.out.println();
            lastName = getInput.nextLine();

            firstInitial = firstName.charAt(0);
            lastInitial = lastName.charAt(0);
            firstInitial = firstInitial.toUpperCase();
            lastInitial = lastInitial.toUpperCase();

            System.out.println();
            System.out.println("Your initials are " + firstInitial + "" + lastInitial + ".");

        }
    }

【问题讨论】:

  • 是什么让您认为char 上有toUpperCase 方法?或者实际上有什么方法?

标签: java char dereference


【解决方案1】:

在 Java 中,原语没有方法,只有装箱的类型有。如果您想获得char 的大写版本,Character 类有一个专门用于此的方法:Character.toUpperCase

 firstInitial = Character.toUpperCase(firstInitial);

(对lastInitial做同样的事情)

【讨论】:

  • 非常有帮助,谢谢。我决定将字符串姓氏和名字全部转为大写。在我能爬之前我不想跑。
【解决方案2】:

firstInitialchar 类型,它没有方法 toUpperCase。 (作为原语,它根本没有方法。)改为在原始的String 上调用toUpperCase

更新(见 cmets):Character.toUpperCase 的文档说:

一般来说,String.toUpperCase() 应该用于将字符映射为大写。 String 案例映射方法比 Character 案例映射方法有几个好处。 String 大小写映射方法可以执行区域敏感映射、上下文敏感映射和 1:M 字符映射,而 Character 大小写映射方法不能。

因此,最稳健的方法是使用

String firstName = firstName.trim();  // ignore leading white space
final String firstInitial = firstName.substring(0, firstName.offsetByCodePoints(0, 1)).toUpperCase();

【讨论】:

  • 不太对,OP需要调用Character.toUpperCase
  • 为什么会“更正确”?如果名称以大写表示值超过一个字符的字符开头,则可能会出现问题。但在这种情况下,最稳健的方法是将提取的第一个字符转换为字符串,然后在该字符串上调用toUpperCase
【解决方案3】:

另一种解决方案:

firstInitial = (char) (firstInitial >= 97 && firstInitial <= 122 ? firstInitial - 32 : firstInitial);
lastInitial = (char) (lastInitial >= 97 && lastInitial <= 122 ? lastInitial - 32 : lastInitial);

【讨论】:

  • 这似乎非常复杂,而且老实说我认为它甚至不起作用:P
  • @Dylex 这绝对有效。 97 到 122 之间的 char 代表 a 到 z,而 65 到 90 之间的那个是 A 到 Z。所以只需减去 32 即可获得大写字符。
  • 如果您只关心 ASCII 字符,它就可以工作。
最近更新 更多