Java 程序无限循环

Java 程序无限循环,java,Java,我编写的程序接受用户的命令并执行特定的功能。但是,文件的读写输入功能有问题,导致循环无限期运行 import java.util.HashMap; import java.util.Scanner; public class cShell{ static String Currentpath="C:\\"; public String Current = Currentpath; static HashMap<String, ICommand>

我编写的程序接受用户的命令并执行特定的功能。但是,文件的读写输入功能有问题,导致循环无限期运行

 import java.util.HashMap;
 import java.util.Scanner;


 public class cShell{

    static String Currentpath="C:\\";
    public String Current = Currentpath;

    static HashMap<String, ICommand> myhashData=new HashMap<String, ICommand>();

    public static void main(String[] args)
    {


    myhashData.put("ltf", new cITF());
    myhashData.put("nbc", new cNBC());
    myhashData.put("gdb", new cGDB());
    myhashData.put("Tedit", new cTedit());

    do
    {


            System.out.print(Currentpath+"> ");

            String Input = null;
            Scanner scan = new Scanner(System.in);
            if(scan.hasNext()){
                Input = scan.nextLine().trim();

            }

            //if(Input.equals("exit")){
            //  System.exit(0);
            //}

            if(myhashData.containsKey(Input))
            {
                ICommand myCommand=myhashData.get(Input);
                myCommand.Execute();
            }
            else
            {
                System.out.println("Invalid Command");
            }


    }while(!"Input".equals("exit"));
  }
}

问题是,在读写之后,程序输出消息“Invalid Command”,该消息是在类cShell中定义的。有人能告诉我这是什么原因吗?

do while循环将永远运行,因为它的终止条件是:

!"Input".equals("exit")
字符串
“Input”
永远不会等于字符串
“exit”
。您可能需要使用变量
输入

!input.equals("exit")
注意:

  • 尝试遵循Java命名约定。方法/变量使用“mixedCase”,类/接口使用“CamelCase”。换句话说,变量名应该是
    input
    ,而不是
    input

由于其终止条件为:

!"Input".equals("exit")
字符串
“Input”
永远不会等于字符串
“exit”
。您可能需要使用变量
输入

!input.equals("exit")
注意:

  • 尝试遵循Java命名约定。方法/变量使用“mixedCase”,类/接口使用“CamelCase”。换句话说,变量名应该是
    input
    ,而不是
    input
改变

while(!"Input".equals("exit"));

由于
“输入”
永远不能等于
“退出”
条件始终为真,因此它无限循环

对于NPE,您可以添加空检查

finally{

        try{
        if(cin != null)
           cin.close();
        if(out != null)
           out.close();
    }
    catch(IOException e)
    {
        System.out.println("File did not close");
    }
   }
改变

由于
“输入”
永远不能等于
“退出”
条件始终为真,因此它无限循环

对于NPE,您可以添加空检查

finally{

        try{
        if(cin != null)
           cin.close();
        if(out != null)
           out.close();
    }
    catch(IOException e)
    {
        System.out.println("File did not close");
    }
   }

是的,确实如此,但还有另一个问题,Invalid I declared contains null不能与.equal运算符一起使用…然后不要将其初始化为null。使用空字符串“”。可以,但我还有一个问题。。。线程“main”java.lang.NullPointerException中的异常位于cShell.main(cShell.java:49)的cTedit.Execute(cTedit.java:100)处,它指向Tedit类中的out.close()。如果我将其从.close()中删除,程序将进入无限循环,并显示以下消息:C:\kaka(访问被拒绝)C:\\kaka>输入要编辑的文件名编辑文件-按Ctrl+z结束错误:C:\kaka(访问被拒绝)C:\\kaka>输入要编辑的文件名编辑文件-按Ctrl+z结束(C:\\kaka相当于cShell.Currentpath)它仍然做同样的事情…无限循环…原因可能是什么…?完全正确,但还有另一个问题,无效的I声明包含null,不能与.equal运算符一起使用…然后不要将其初始化为null。使用空字符串“”是的,它可以工作,但我还有一个问题…线程“main”java.lang.NullPointerException在cTedit.Execute(cTedit.java:100)在cShell.main(cShell.java:49)中出现异常,它指向Tedit类中的out.close()。如果我删除这个out.close(),程序将进入无限循环,并显示错误消息:C:\kaka(访问被拒绝)C:\\kaka>输入要编辑的文件名编辑文件-按Ctrl+z结束错误:C:\kaka(访问被拒绝)C:\\kaka>输入要编辑的文件名编辑文件-按Ctrl+z结束(C:\\kaka相当于cShell.Currentpath)它仍然做同样的事情…无限循环…原因可能是什么?我已经改变了这一点,现在输入带红色下划线…我认为这是因为它包含声明的null,不能与一起使用。equalDeclare它作为空字符串
“”
。当然,这取决于您尝试执行的操作。我已经更改了这一点,现在输入带红色下划线…我认为这是因为它包含声明的null,不能与一起使用。equalDeclare它作为空字符串
“”
。当然,这取决于您尝试执行的操作。