扫描仪内部方法不要求输入

Scanner inside method dont ask for input

我要求用户插入一个 item name with extension ".txt",如果 item nameexisting itemName.txt 对应,那么用户需要在他想“转移”的地方插入 location name with extension ".txt" “ 它 。 如果一切正常,那么 itemName.txt 的内容将被写入 locationName.txt

我的主要是这样的:

package victor;

import java.io.*;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Scanner;

public class Main extends Item {
    public Main(String location, Integer length, Integer height, Integer depth) {
        super(location, length, height, depth);
    }

    public static void main(String[] args) throws IOException {
        List<Item> itemList = new ArrayList<>();
        List<Location> locationList = new ArrayList<>();
        System.out.println("Welcome to create new:");
        System.out.println("Please follow the steps:");
        HashMap<Integer, String> menu = new HashMap<>();
        menu.put(1, "Create Location");
        menu.put(2, "Create Item");
        menu.put(3, "Transfer to location");
        menu.forEach((key, value) -> System.out.println(key + "- " + value));
        int user_choice;
        Scanner userInputMenu = new Scanner(System.in);
        user_choice = userInputMenu.nextInt();
        switch (user_choice) {
            case 1:
                createLocationPlusFile(locationList);
            case 2:
                createItemPlusFile(itemList);
            case 3:
                transferItemToLocation(itemList, locationList);
        }
    }
}

当用户从菜单输入 - 3 时,程序正在关闭 Process finished with exit code 0.

这是我的项目Class,方法是我写的:

package victor;

import java.io.*;
import java.util.List;
import java.util.Scanner;

public class Item extends Location {
    private String itemName;
    private Integer kg;
    private Integer length;
    private Integer height;
    private Integer depth;

    public Item(String itemName, Integer kg, Integer length, Integer height, Integer depth) {
        super();
        this.itemName = itemName;
        this.kg = kg;
        this.length = length;
        this.height = height;
        this.depth = depth;
    }


    public Item() {

    }

    public Item(String location, Integer length, Integer height, Integer depth) {
        super();
    }

    public String getItemName() {
        return itemName;
    }

    public void setItemName(String itemName) {
        this.itemName = itemName;
    }

    public Integer getKg() {
        return kg;
    }

    public void setKg(Integer kg) {
        this.kg = kg;
    }

    public Integer getLength() {
        return length;
    }

    public void setLength(Integer length) {
        this.length = length;
    }

    public Integer getHeight() {
        return height;
    }

    public void setHeight(Integer height) {
        this.height = height;
    }

    public Integer getDepth() {
        return depth;
    }

    public void setDepth(Integer depth) {
        this.depth = depth;
    }

    @Override
    public String toString() {
        return "Item{" +
                "itemName='" + itemName + '\'' +
                ", kg=" + kg +
                ", length=" + length +
                ", height=" + height +
                ", depth=" + depth +
                '}';
    }

    public static void createItemPlusFile(List<Item> itemList) throws NullPointerException, IOException {
        int defaultLength = 80;
        int defaultHeight = 205;
        int defaultDepth = 120;
        int defaultKg = 3500;
        Scanner in1 = new Scanner(System.in);
        System.out.println("Enter Item Name: ");
        String itemName = in1.nextLine();
        System.out.println("New Item created successfully!" + "\n" + itemName);


        int inLength;
        Scanner in2 = new Scanner(System.in);
        System.out.println("Enter Item height: ");
        int itemLength = in2.nextInt();
        if (itemLength > defaultLength) {
            System.out.println("Height that you added is to big, please use a height of max  205");
            inLength = in2.nextInt();
        } else {
            System.out.println("Height inserted correctly! ");
        }


        int inHeight;
        Scanner in3 = new Scanner(System.in);
        System.out.println("Enter Item height: ");
        int itemHeight = in3.nextInt();
        if (itemHeight > defaultHeight) {
            System.out.println("Height that you added is to big, please use a height of max  205");
            inHeight = in3.nextInt();
        } else {
            System.out.println("Height inserted correctly! ");
        }
        int inDepth;
        Scanner in4 = new Scanner(System.in);
        System.out.println("Enter Item depth: ");
        int itemDepth = in4.nextInt();
        if (itemDepth > defaultDepth) {
            System.out.println("Depth that you added is to big, please use a depth of max  120");
            inDepth = in4.nextInt();
        } else {
            System.out.println("Depth inserted correctly! ");
        }
        int inKg;
        Scanner in5 = new Scanner(System.in);
        System.out.println("Enter Item kg: ");
        int itemKg = in4.nextInt();
        if (itemKg > defaultKg) {
            System.out.println("kg that you added is to big, please use a depth of max  3500");
            inDepth = in4.nextInt();
        } else {
            System.out.println("Kg inserted correctly! ");
        }
        Item item = new Item(itemName, itemKg, itemLength, itemHeight, itemDepth);
        File file = new File(item.getItemName() + "CUSCAS001GRY-uk.txt");
        if (!file.exists()) {
            file.createNewFile();
        }
        FileWriter fileWriter = new FileWriter(item.getItemName() + "CUSCAS001GRY-uk.txt", true);
        fileWriter.write(item + "\n");
        fileWriter.close();
    }
//this method I wrote, I expect to ask user to input the item and if item with this name exist then he insert the location where he want to "transfer" it .
       public static void transferItemToLocation(List<Item> itemList, List<Location> locationList) throws IOException {
    for (Item item : itemList) {
        for (Location location : locationList) {
            Scanner inputItemTransfer = new Scanner(System.in);
            System.out.println("Insert the item you want to transfer + .txt  extension!");
            inputItemTransfer.nextLine();
            if (inputItemTransfer.nextLine()
                    .equalsIgnoreCase(item + ".txt")) {
                Scanner inputTransferToLocation = new Scanner(System.in);
                System.out.println("Insert the location where you want to transfer the item");
                inputTransferToLocation.nextLine();
                if (inputTransferToLocation.nextLine()
                        .equalsIgnoreCase(String.valueOf(location))) {
                    BufferedReader bufferedReader = new BufferedReader(new FileReader(String.valueOf(inputItemTransfer)));
                    FileWriter fileWriter = new FileWriter(inputTransferToLocation + ".txt", true);
                    BufferedWriter outputStream = new BufferedWriter(fileWriter);
                    String str;
                    while ((str = bufferedReader.readLine()) != null) {
                        outputStream.write(str + "\n");
                    }
                    outputStream.close();
                }
            }
        }
    }
  }
}

我假设我对扫描仪做错了什么。 任何 help/critics 都非常感谢

您不需要为用户需要输入数据的每个提示都创建扫描仪对象。整个应用程序的一个 Scanner 对象就可以了。只需在 Main class 中将对象声明为 public static,例如:

public class Main extends Item {
    
    // Declare a Scanner object that can potentially be used anywhere.
    public static Scanner userInput = new Scanner(System.in).useDelimiter("\R");


    public Main(String location, Integer length, Integer height, Integer depth) {
        super(location, length, height, depth);
    }

    public static void main(String[] args) throws IOException {
        // ... main() method code here ...
    }
}

然后在任何地方你有一个提示给用户并且需要使用扫描仪方法来获取输入,使用Main.userInput.代替,例如:

user_choice = Main.userInput.nextInt();

或:

String itemName = Main.userInput.nextLine();

当使用 Scanner#nextInt()(或任何 Scanner#nextXXX 方法)并且 Scanner#nextLine() 提示将直接跟随时,您很可能需要使用newline 从 Scanner#nextInt() 使用回车键时的字符。 nextInt() 方法不像 nextline() 方法那样使用换行符,因此似乎跳过了使用 nextLine() 方法的提示。在这种情况下你会想做:

user_choice = Main.userInput.nextInt();
Main.userInput.nextLine();

一个好的经验法则是:

如果您使用 Scanner#nextLine() 方法,则将其用于 everything 否则,根本不要使用它.请改用 next()nextXXX() 方法。

如果您如上所示创建扫描仪(使用 useDelimiter("\R") 方法),则 Scanner#next() 方法将 return 类似于 Scanner#nextLine() 方法 return.


目前,由于您使用 Scanner 方法的方式,您的 transferItemToLocation() 方法对方法中的每个提示进行双重提示。

public static void transferItemToLocation(List<Item> itemList, List<Location> locationList) throws IOException {
    for (Item item : itemList) {
        for (Location location : locationList) {
            Scanner inputItemTransfer = new Scanner(System.in);
            System.out.println("Insert the item you want to transfer + .txt  extension!");
            inputItemTransfer.nextLine();
            if (inputItemTransfer.nextLine()
                    .equalsIgnoreCase(item + ".txt")) {
                Scanner inputTransferToLocation = new Scanner(System.in);
                System.out.println("Insert the location where you want to transfer the item");
                inputTransferToLocation.nextLine();
                if (inputTransferToLocation.nextLine()
                        .equalsIgnoreCase(String.valueOf(location))) {
                    BufferedReader bufferedReader = new BufferedReader(new FileReader(String.valueOf(inputItemTransfer)));
                    FileWriter fileWriter = new FileWriter(inputTransferToLocation + ".txt", true);
                    BufferedWriter outputStream = new BufferedWriter(fileWriter);
                    String str;
                    while ((str = bufferedReader.readLine()) != null) {
                        outputStream.write(str + "\n");
                    }
                    outputStream.close();
                }
            }
        }
    }
}

我只能假设你为什么要这样做,因为你没有提供所有的代码,这部分是为什么我 post 上面有很多关于 Scanner 的胡言乱语。你在这里得到的东西不会像你想象的那样工作。如前所述,摆脱所有那些 Scanner 对象并使用类似于 Main class 中声明的内容(类似于此 post).声明名为 inputItemTransferinputTransferToLocation 的字符串变量。将用户输入分别放入每个提示的这些变量中,并使用这些变量中包含的数据而不是扫描仪对象,例如:

public static void transferItemToLocation(List<Item> itemList, List<Location> locationList) throws IOException {
    String inputItemTransfer;
    String inputTransferToLocation;
    for (Item item : itemList) {
        for (Location location : locationList) {
            System.out.println("Insert the item you want to transfer + .txt  extension!");
            inputItemTransfer = Main.userInput.nextLine();
            if (inputItemTransfer.equalsIgnoreCase(item + ".txt")) {
                System.out.println("Insert the location where you want to transfer the item");
                inputTransferToLocation = Main.userInput.nextLine();
                if (inputTransferToLocation.equalsIgnoreCase(String.valueOf(location))) {
                    BufferedReader bufferedReader = new BufferedReader(new FileReader(String.valueOf(inputItemTransfer)));
                    FileWriter fileWriter = new FileWriter(inputTransferToLocation + ".txt", true);
                    BufferedWriter outputStream = new BufferedWriter(fileWriter);
                    String str;
                    while ((str = bufferedReader.readLine()) != null) {
                        outputStream.write(str + "\n");
                    }
                    outputStream.close();
                }
            }
        }
    }
}

老实说,我不知道这种方法现在是否能正常运行。没有所有代码或至少 minimal reproducible example 很难说。我想一步一个脚印。


一侧:

如评论中所述,用户确实需要输入大量数据才能使用您的应用程序,这对某些人来说有点令人沮丧,而且实际上很难。或许可以考虑更多 基于菜单的 系统,以减少入门要求并使使用体验更舒适。


祝你好运。