如何让Java识别try块内声明的变量?

时间:2014-02-18 23:27:15

标签: java text encryption

我正在制作一个我大部分工作的加密项目。我正在从文件中读取明文并对其进行加密,然后将其写入另一个文本文件。我对解密有同样的看法。我有这个工作,但我对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) {}


}

谢谢,任何帮助将不胜感激。

5 个答案:

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

 ...