繁体   English   中英

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

[英]How to use variable outside of try-catch block

我正在制作一个解密程序,但我不太确定如何在我的 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);


 }
}

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

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

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

int cip = 0;
String user = "";

移动后的错误(没有=东西)表明你在try块之后使用了cip ,所以我们需要用空数据初始化它,以防try失败。

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

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

然后您可以继续处理下一个不相关的错误。

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

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 中查找

这是: 链接 现在阅读。

第 2 步:尝试理解消息。 在这种情况下,你只需要知道的信息是,这是超出范围的指数 但是您应该能够根据异常的 javadoc 猜测...... (通常这些消息的信息量更大一些,但这个信息是从编译代码中抛出的,由于技术原因,很难产生信息量更大的错误。)

堆栈跟踪的第二行告诉您异常在哪里抛出。 在本例中,“unscrambler.java”的第 35 行 ... 在main方法中。

第 3 步:在编辑器或 IDE 中打开源文件,然后查看该行代码的内容。

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

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

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

在这种情况下,要观察的第一个想法是该行上只有一个地方在进行数组索引,它是表达式charArray[j] 所以这意味着......(您填写详细信息)。 但是……(您填写详细信息)是从哪里来的? 看看在此声明之前发生了什么。 看到了吗? 如果没有就再看一遍,仔细看应该很明显吧!)

剩下的由你来整理...... :-)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM