为什么不编译?

时间:2010-03-31 13:28:49

标签: java

为什么这个类不能编译?

import java.util.*;

public class Caesar
{
    public static void main(String [] args)
    {
        final boolean DEBUG = false;
        System.out.println("Welcome to the Caesar Cypher");
        System.out.println("----------------------------");
        Scanner keyboard = new Scanner (System.in);
        System.out.print("Enter a String : ");
        String plainText = keyboard.nextLine();
        System.out.print("Enter an offset: ");
        int offset = keyboard.nextInt();
        String cipherText = "";
        for(int i=0;i<plainText.length();i++)
        {
            int chVal = plainText.charAt(i);

            if (DEBUG) {int debugchVal = chVal;}

            chVal +=offset;

            if (DEBUG) {System.out.print(chVal + "\t");}

            while (chVal <32 || chVal > 127)
            {
                if (chVal < 32) chVal += 96;
                if (chVal > 127) chVal -= 96;

                if(DEBUG) {System.out.print(chVal+" ");}

            }

            if (DEBUG) {System.out.println();}

            char c = (char) chVal;
            cipherText = cipherText + c;

            if (DEBUG) {System.out.println(i + "\t" + debugchVal + "\t" + chVal + "\t" + c + "\t" + cipherText);}
        }
        System.out.println(cipherText);
    }
}

8 个答案:

答案 0 :(得分:9)

您在debugchVal块中定义变量if

if (DEBUG) {int debugchVal = chVal;}

因此它只存在于该块内。稍后当你再次提到它时:

if (DEBUG) {System.out.println(i + "\t" + debugchVal + "\t" + chVal + "\t" + c + "\t" + cipherText);}

它不再在范围内,因此编译器尽职尽责地发出错误。

像这样修改第一个代码部分:

int debugchVal;
if (DEBUG) {debugchVal = chVal;}

答案 1 :(得分:5)

变量debugchVal的声明在if块中:

if (DEBUG) {int debugchVal = chVal;}

因此,它不会在if块之外可用。将声明移到if块之外:

int debugchVal = /*some default value that makes sense if DEBUG is false */;
if (DEBUG) {debugchVal = chVal;}

答案 2 :(得分:5)

因为您在作用域内定义debugchVal并且稍后尝试使用它。

你在做:

if (DEBUG) {int debugchVal = chVal;}

以后:

if (DEBUG) {System.out.println(i + "\t" + debugchVal + "\t" + chVal + "\t" + c + "\t" + cipherText);}

但由于debugchVal是在大括号之间定义的,因此它只是该范围的本地定义。尝试将其移出范围:

int debugchVal = -1;
if (DEBUG) { debugchVal = chVal; }

答案 3 :(得分:4)

您已在此区块中声明debugchVal

if (DEBUG) {int debugchVal = chVal;}

该变量仅在该块的范围内。它在其余时间内并不“存在”。

你可以这样做:

int debugchVal = 0;
if (DEBUG) {
    debugchVal = chVal;
}

但是,你也可以随时分配它(并给它一个更清晰的名字):

int initialChVal = chVal;

在“非调试”版本中进行分配不会对您造成伤害。

您可能还想查看使用java.util.Logging而不是“DEBUG”模式的内容。

答案 4 :(得分:2)

debugchVal在if块中定义。所以它的范围只是那个。 尝试在外面声明它(使用默认值)并在if(DEBUG)中分配正确的值。

int debugChVal = 0;
if (DEBUG) {
   debugChVal = ...
}

答案 5 :(得分:2)

阅读错误消息,找到行号,找到相应的行(加上前一行),查看错误消息本身(“找不到符号”)并查找未定义的变量。在99%的情况下,如果您使用具有良好语法高亮的IDE,那么这是一个简单的拼写错误。

答案 6 :(得分:1)

这是范围解决问题。 debugchval变量在最后一个if的范围内不可用。您需要在if条件

之外声明它

答案 7 :(得分:1)

debugchVal上的范围问题:

import java.util.Scanner;

public class Caesar
{
   public static void main(String[] args)
   {
      final boolean DEBUG = false;
      System.out.println("Welcome to the Caesar Cypher");
      System.out.println("----------------------------");
      Scanner keyboard = new Scanner(System.in);
      System.out.print("Enter a String : ");
      String plainText = keyboard.nextLine();
      System.out.print("Enter an offset: ");
      int offset = keyboard.nextInt();
      String cipherText = "";
      for (int i = 0; i < plainText.length(); i++)
      {
         int chVal = plainText.charAt(i);
         int debugchVal = -1;

         if (DEBUG)
         {
            debugchVal = chVal;
         }

         chVal += offset;

         if (DEBUG)
         {
            System.out.print(chVal + "\t");
         }

         while (chVal < 32 || chVal > 127)
         {
            if (chVal < 32)
            {
               chVal += 96;
            }
            if (chVal > 127)
            {
               chVal -= 96;
            }

            if (DEBUG)
            {
               System.out.print(chVal + " ");
            }

         }

         if (DEBUG)
         {
            System.out.println();
         }

         char c = (char) chVal;
         cipherText = cipherText + c;

         if (DEBUG)
         {
            System.out.println(i + "\t" + debugchVal + "\t" + chVal + "\t" + c + "\t" + cipherText);
         }
      }
      System.out.println(cipherText);
   }
}