我正在制作一个我大部分工作的加密项目。我正在从文件中读取明文并对其进行加密,然后将其写入另一个文本文件。我对解密有同样的看法。我有这个工作,但我对try和catch方法有点困惑,用于读取和写入文件。我在一个方法中有两次尝试和捕获,第二种尝试方法不能识别我的“解密”变量。我应该怎么处理这个?这是我的代码:
public static void decrypt(String pathname)
{
File file = new File(pathname);
Scanner input = null;
try
{
input = new Scanner(file);
String tempEncrypted = input.nextLine();
StringBuffer encrypted = new StringBuffer(tempEncrypted);
StringBuffer decrypted = new StringBuffer("");
int shiftAmount = (int)encrypted.charAt(0);
for(int i = 1; i < encrypted.length(); i++)
{
int decChar = ((int)encrypted.charAt(i) - shiftAmount);
while((int)decChar < 32)
{
decChar+=95;
}
decrypted.append((char)decChar);
}
}
catch(FileNotFoundException ex)
{
System.out.println("*** Cannot open " + pathname + " ***");
System.exit(1);
}
try {
BufferedWriter out = new BufferedWriter(new FileWriter("decrypted.txt"));
for(int j = 0; j < decrypted.length(); j++)
{
out.write(decrypted.charAt(j));
}
out.close();
}
catch (IOException e) {}
}
谢谢,任何帮助将不胜感激。
答案 0 :(得分:2)
你错过了try / catch块的重点。如果抛出异常,则发生错误。 您不希望从失败的try块中检索信息。
相反,只需将try块组合成一个try / catch,如下所示:
public static void decrypt(String pathname)
{
File file = new File(pathname);
Scanner input = null;
try
{
input = new Scanner(file);
String tempEncrypted = input.nextLine();
StringBuffer encrypted = new StringBuffer(tempEncrypted);
StringBuffer decrypted = new StringBuffer("");
int shiftAmount = (int)encrypted.charAt(0);
for(int i = 1; i < encrypted.length(); i++)
{
int decChar = ((int)encrypted.charAt(i) - shiftAmount);
while((int)decChar < 32)
{
decChar+=95;
}
decrypted.append((char)decChar);
}
BufferedWriter out = new BufferedWriter(new FileWriter("decrypted.txt"));
for(int j = 0; j < decrypted.length(); j++)
{
out.write(decrypted.charAt(j));
}
out.close();
}
catch(FileNotFoundException ex)
{
System.out.println("*** Cannot open " + pathname + " ***");
System.exit(1);
}
catch (IOException e) {}
}
答案 1 :(得分:1)
decrypted
变量超出了第二个try
的范围。要使其在那里可见,您可以声明它并在第一个try
块之外对其进行初始化,您可以在其中声明Scanner
对象和file
。
File file = new File(pathname);
Scanner input = null;
StringBuffer decrypted = new StringBuffer("");
...
答案 2 :(得分:1)
这是变量范围的问题。第二个try / catch块与第一个中创建的任何变量无关。一旦第一个try / catch块结束,变量就会丢失。
如果您需要在第二个变量中显示该变量,则必须在第一次尝试之前对其进行初始化,然后在try块中设置该值。这有意义吗?
答案 3 :(得分:1)
如果你有
void myMethod() {
try {
SomeClass x = someValue;
}
catch(..) {..}
SomeClass y = x;
}
编译器将(正当地)抱怨x
未在最终赋值语句中定义,因为x
已在{}
的{{1}}括号内声明声明不能“逃避”try
定义的“范围”。
如果您改为
{}
编译器现在会抱怨void myMethod() {
SomeClass x;
try {
x = someValue;
}
catch(..) {..}
SomeClass y = x;
}
的值未在最终赋值语句中设置。这是因为无法保证x
范围内的语句已被执行。 (如果您将try
替换为try
,并且未在if (some condition)
分段中设置x
,则相同。)
但如果你有
else
编译器将(合理地)感到高兴,因为void myMethod() {
SomeClass x = null;
try {
x = someValue;
}
catch(..) {..}
SomeClass y = x;
}
在最终赋值语句的范围内是“可见的”,并且还知道它已经从其声明点到所有可能路径分配了值。使用它的地方。
答案 4 :(得分:0)
如果在代码块中声明了变量,则其范围仅限于该块。您在try / catch块中声明decrypted
,因此在块之外,decrypted
不再可用。您可以通过在try / catch块前面移动decrypted
的声明并仅保留在赋值内来解决此问题。
StringBuffer encrypted = new StringBuffer();
StringBuffer decrypted = new StringBuffer();
try {
input = new Scanner(file);
String tempEncrypted = input.nextLine();
encrypted = new StringBuffer(tempEncrypted);
decrypted = new StringBuffer("");
int shiftAmount = (int)encrypted.charAt(0);
...