Почему это не скомпилируется? - PullRequest
0 голосов
/ 31 марта 2010

Почему этот класс не компилируется?

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 ]

9 голосов
/ 31 марта 2010

Вы определяете переменную 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;}
5 голосов
/ 31 марта 2010

Поскольку вы определяете 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; }
5 голосов
/ 31 марта 2010

Объявление переменной 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;}
4 голосов
/ 31 марта 2010

Вы объявили debugchVal в блоке, подобном этому:

if (DEBUG) {int debugchVal = chVal;}

Эта переменная доступна только для этого блока. Он не «существует» в остальное время.

Вы можете сделать это:

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

Однако вы также можете просто назначить его (и дать ему более ясное имя):

int initialChVal = chVal;

Наличие задания в «неотладочной» версии не повредит вам.

Возможно, вы захотите использовать что-то вроде java.util.Logging вместо шаблона «DEBUG».

2 голосов
/ 31 марта 2010

Прочитайте сообщение об ошибке, найдите номер строки, найдите соответствующую строку (плюс предыдущую строку), посмотрите само сообщение об ошибке («не удается найти символ») и найдите неопределенную переменную. В 99% случаев это простая опечатка, которая должна быть очевидна, если вы используете IDE с хорошей подсветкой синтаксиса.

2 голосов
/ 31 марта 2010

debugchVal определяется ВНУТРИ блока if. Так что его сфера - только это. Попробуйте объявить его снаружи (со значением по умолчанию) и назначить его правильное значение внутри if (DEBUG).

int debugChVal = 0;
if (DEBUG) {
   debugChVal = ...
}
1 голос
/ 31 марта 2010

проблема с областью действия на 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);
   }
}
1 голос
/ 31 марта 2010

Это проблема разрешения области. Переменная debugchval недоступна в области последнего if. Вы должны объявить это вне условий if

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...