如何在try catch块之外使用变量

时间:2014-04-06 03:21:30

标签: java variables encryption try-catch

我正在制作解密程序,而且我不太确定如何使用变量" cip"在我尝试捕获块的一边。我尝试移动3行,其中要求用户输入模式,但我遇到了其他问题。

我的代码是:

     import java.util.*;

public class unscrambler //This class will encrpyt the program
{
 public static void main (String [] args){
   int cip= 0;
   String user ="";




   System.out.println("Please enter the code to unscramble"); 
   Scanner inputScanner = new Scanner(System.in); //imports scanner reader
    String userinput = inputScanner.next();
    char[] charArray = userinput.toCharArray(); //sends userinput to charArray
    int j=charArray.length;

    Character [] array = new Character[j];

    for(int w=0; w<j; w++){
      array[w] = charArray[w];
    }

    int a=1;
               System.out.println("Please enter the number cipher pattern (an integer)");
    do{
      try{

         user = inputScanner.next();
        cip = Integer.parseInt(user);
        a=2;
        System.out.println("your code is ");

 for(int w =0; w<j;){
   System.out.println(charArray[j]);

   w+=cip;
 }
          if(cip<=0){
          System.out.println("please enter number greater than zero");
a=1;
}
}catch(NumberFormatException f){
  System.out.println("please enter a proper number");
}
}while(a==1);


 }
}

2 个答案:

答案 0 :(得分:0)

您只是在该区块中进行声明。

String user = inputScanner.next();
int cip = Integer.parseInt(user);

将这些添加到文件的开头,就在main()行之后:

int cip = 0;
String user = "";

移动后的错误(没有=内容)表示您在cip阻止后使用try,因此我们需要使用空数据初始化它try失败的情况。

现在只需将您当前在try区块中获得的行更改为:

// Remove the 'String' part.
user = inputScanner.next();
// Remove the 'int' part.
cip = Integer.parseInt(user);

然后你可以转到下一个不相关的错误。

答案 1 :(得分:0)

解决方案是将变量声明移到循环之外,或者将要在循环中使用它的位置移动。

Java不允许您在声明范围之外使用局部变量。周期。

  

我尝试移动3行,其中要求用户输入模式,但我遇到了其他问题。

嗯......你需要解决其他问题!

编程是这样的。您需要在您正在使用的编程语言的约束下工作。


我可以看到导致您最新错误的原因,但我不会告诉您它是什么。相反,我将告诉你如何为自己找到它。

“输出行”是Java Stacktrace。它包含大量有用的信息,您需要学习如何解释它。

java.lang.ArrayIndexOutOfBoundsException: 5 
at unscrambler.main(unscrambler.java:35) 
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 
at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source) 
at java.lang.reflect.Method.invoke(Unknown Source) 
at edu.rice.cs.drjava.model.compiler.JavacCompiler.runCommand(JavacCompiler.java:27‌​2)

Stacktraces通常会报告在正在运行的程序中某处抛出的异常。

第0步:找到堆栈跟踪。

第一行给出了异常的名称和消息。在这种情况下,异常的名称是ArrayIndexOutOfBounds,消息是(只)“5”。

第1步:如果您无法识别异常的名称,请在javadocs中查找

这是:link。现在阅读。

第2步:尝试了解该消息。在这种情况下,您只需要知道消息是超出范围的索引的。但你应该能够猜测...基于异常的javadoc。 (通常消息提供的信息更多,但是这一消息是从编译的代码中抛出的,并且由于技术原因,很难产生更具信息性的错误。)

stacktrace的第二行告诉你抛出异常的位置。在这种情况下,在main方法中,“unscrambler.java”的第35行......

第3步:在编辑器或IDE中打开源文件,看看该行的代码是什么。

在这种情况下,它(我认为)这一行:

    System.out.println(charArray[j]);

第4步:现在你必须开始思考。 (思考是一个非常重要的部分调试!)该行怎么可能抛出该异常?可能是什么造成的?

在这种情况下,首先要考虑的是,在该行上只有一个地方用于进行数组索引,它是表达式charArray[j]。这意味着......(你填写了详细信息)。但是......(你填写详细信息)来自哪里?看看本声明之前发生的事情。看到了吗? (如果不是,那就再看看。如果仔细观察,应该是非常明显的!)

剩下的就是让你理清......: - )