Java charAt()出错

时间:2014-08-30 23:47:36

标签: java char

我试图创建一个程序,用户输入一个字符串,程序回显给监视器,每行一个字符。

但是,我无法编写我所写的内容。此行会弹出一个错误:

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);
  }
}

另外,如果你能解释一下你的答案,那就非常感激了。

7 个答案:

答案 0 :(得分:3)

没有括号,Java会假设您的意思是:

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

问题是这里c超出了print语句的范围。因此编译器不知道c引用了什么,并将抛出您看到的错误。正如@CupawnTae所指出的那样,单个变量声明和没有语句对于for循环来说甚至不够。

相反,你应该像这样把括号放在自己身上,以消除歧义并修复范围:

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

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

答案 1 :(得分: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);

上述内容无法编译,因为c语句中无法显示println。此外,它不是声明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()之类的,

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

答案 2 :(得分:2)

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

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

要演示,如果您删除System.out.println仍然将无法编译。原因是声明一个这样的变量是无效的:

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

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

您可以将for(和其他循环,条件等)与

一起使用
  1. 单个语句,例如System.out.println(...);
  2. 括号{...}
  3. 中的一个块

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

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

答案 3 :(得分:1)

只需将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);
        }
    }
}

答案 4 :(得分:1)

你错过了方括号!您的字符超出了范围。以下将有效。

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));

答案 5 :(得分:1)

正如其他人所指出的那样,这个问题本身就是这个问题:

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然后将其视为块语句)。请记住,块是在大括号中包含的许多语句。所以 - 在你的变量声明语句周围放置大括号,然后编译。

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

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

答案 6 :(得分:0)

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]");
   }
}

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