为什么这个类不能编译?
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);
}
}
答案 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);
}
}