【问题标题】:Error with Java's charAt()Java 的 charAt() 出错
【发布时间】:2014-10-24 14:42:55
【问题描述】:

我正在尝试创建一个程序,其中用户输入一个字符串,然后程序将其回显到监视器,每行一个字符。

但是,我无法编译我所写的内容。在这一行弹出错误:

char c = word.charAt(i);

这是我的代码:

import java.util.Scanner;
public class charAt

{
  public static void main(String[] args)
  {
   System.out.println("Give me a word, just one word:");
   Scanner kb = new Scanner(System.in);
   String word = kb.nextLine();

   for(int i=0; i<word.length(); i++)
   char c = word.charAt(i);
   System.out.println(" " + c);
  }
}

另外,如果你能解释你的答案,那将不胜感激。

【问题讨论】:

  • 您的 for 循环缺少括号。可能是问题的一部分。
  • 你遇到了什么错误?
  • 这就是为什么某些语言在 if/while/for... 之后强制使用大括号的原因

标签: java char


【解决方案1】:

没有括号,Java 将假定您的意思是:

for(int i = 0; i < word.length(); i++)
{
    char c = word.charAt(i);
}
System.out.println(" " + c);

问题是这里的c 超出了打印语句的范围。因此编译器将不知道c 指的是什么,并会抛出您看到的错误。正如@CupawnTae 所指出的,还有一个问题是单个变量声明和没有语句甚至不足以用于for 循环。

相反,您实际上应该像这样将括号放在自己中,以消除歧义并修复范围:

for(int i = 0; i < word.length(); i++)
{
    char c = word.charAt(i);
    System.out.println(" " + c);
}

问题应该会消失。一般来说,我强烈建议始终使用括号,因为没有它们很容易犯这样的简单错误。

【讨论】:

  • 几乎是正确的 - 看到我的答案 - 即使你删除 println 也不会编译
  • @CupawnTae 鉴于上下文,我认为 OP 无意删除 println 语句。不过好点。
  • 正如 OP 在问题中所说,错误出现在 char c 行,而不是 println,所以也许我是迂腐的,但他看到的实际错误不是造成的由超出范围的变量,它是由无效循环引起的。
  • 另外,您最初的陈述是错误的 - 编译器将其视为与块版本相同
  • @CupawnTae 你能详细说明最后的评论吗?
【解决方案2】:

您的循环更恰当地缩进为,

for(int i=0; i<word.length(); i++)
  char c = word.charAt(i); // <-- Also, not a valid location to declare the char
                           // as noted by cupawntae
System.out.println(" " + c);

以上内容无法编译,因为cprintln 语句中不可见。此外,它不是声明 char c 的有效位置,但即使是 - 它也不能作为裸语句访问。因此,您可以添加大括号以将 println() 包装到同一块中 -

for(int i=0; i<word.length(); i++) {
  char c = word.charAt(i);
  System.out.println(" " + c);
}

或者你可以使用

for(int i=0; i<word.length(); i++)
  System.out.println(" " + word.charAt(i));

或使用String.toCharArray()like,

for (char c : word.toCharArray())
  System.out.println(" " + c);

【讨论】:

  • 几乎是正确的 - 看到我的答案 - 即使你删除 println 也不会编译
  • @CupawnTae 我的代码将编译。你也是正确的,它不是一个没有新块的有效语句位置。
  • 我的意思是如果没有 println 原始代码将无法编译,因此 println 不是问题。当然,如果有一个有效的块并且它不在其中,那将是一个问题,但这不会成为问题,因为任何地方都没有有效的变量声明,它不在范围内: )
【解决方案3】:

正如其他答案所指出的,您的循环不会按原样工作,因为 println 将无法看到 char c 变量。

但是,这不是您所看到的错误的原因。事实上,您的编译器可能甚至不会抱怨该行,因为它还不足以确定您范围有问题。

为了演示,如果你删除 System.out.println仍然不会编译。原因是这样声明变量是无效的:

for (;;) char c='a';

您将收到一条错误消息,指出 char c='a'; 不是语句。

您可以将for(以及其他循环、条件等)与任何一个一起使用

  1. System.out.println(...);这样的单个语句
  2. 用大括号括起来的块{...}

变量声明不是一个简单的语句,因此如果要声明一个变量,必须用大括号将其括在一个块中{...}

一旦你这样做了,很明显println 需要在这个块内。因此,您将以与其他答案相同的代码结束,最重要的是您的问题是缺少大括号。

【讨论】:

  • 虽然它是真的,但它不会编译,即使它会 - 它不会做任何工作。很明显,它不应该是一个裸变量声明。但是,对于有效陈述的技术上正确,+1。
  • @ElliottFrisch 同意了。主要的是,没有人解决 OP 报告的实际错误,这与 println 无关
【解决方案4】:

只需将System.out.println(c) 放在 for 循环的范围内即可。

import java.util.Scanner;
public class charAt

{
    public static void main(String[] args)
    {
        System.out.println("Give me a word, just one word:");
        Scanner kb = new Scanner(System.in);
        String word = kb.nextLine();

        for(int i=0; i<word.length(); i++)
        {
            char c = word.charAt(i);
            System.out.println(" " + c);
        }
    }
}

【讨论】:

    【解决方案5】:

    你只是错过了括号!您的 char c 超出范围。以下将起作用。

    for(int i=0; i<word.length(); i++) {
       char c = word.charAt(i);
       System.out.println(" " + c);
    }
    

    你也可以这样做

    for(int i=0; i<word.length(); i++)
    System.out.println(" " + word.charAt(i));
    

    【讨论】:

      【解决方案6】:

      正如其他人指出的那样,问题在于这部分本身:

      for(int i=0; i<word.length(); i++)
          char c = word.charAt(i);
      

      第二行是“局部变量声明语句”。 specification of the Java Language 声明:

      每个局部变量声明语句立即包含在 一个块。

      是“一系列语句、局部类声明和局部变量声明语句大括号内”(JLS)。

      你的char c = ... 行没有立即包含在一个块中(因为它是一个附加到for 循环的语句)。

      Java 语言根本不将其识别为变量声明 - 因此您得到的错误令人困惑(我在 Eclipse 中看到了 6 个不同的错误)。 编译器没有说“局部变量声明语句不包含在块中”,因为在非常低的语法级别,它甚至没有考虑到这可能是一个变量声明语句。

      解决方案很简单;在 Java 中可以有“语句”的任何地方,您也可以有一个块(Java 然后将其视为 block 语句)。请记住,块是用大括号括起来的许多语句。所以 - 在你的变量声明语句周围加上大括号,它就会编译。

      for (int i = 0; i < word.length(); i++) {
          char c = word.charAt(i);
      }
      

      当然,下一步是将您的System.out.println 语句移动到此块内,因为局部变量仅在声明它们的块内可见。

      【讨论】:

        【解决方案7】:
        public class charAt
        
        {
          public static void main(String[] args)
          {
           System.out.println("Give me a word, just one word:");
           Scanner kb = new Scanner(System.in);
           String word = kb.nextLine();
        
           char[] charArray = word.toCharArray();
        
           for (int i = 0; i < charArray.length(); i++) {
               System.out.println("char[" + i + "]: " + new String(charArray[i]");
           }
        }
        

        免责声明:还没有实际测试过这个

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2016-06-02
          • 2013-11-08
          • 2018-10-03
          • 2021-02-01
          • 1970-01-01
          • 2023-04-06
          • 2018-07-07
          • 1970-01-01
          相关资源
          最近更新 更多