将类中的switch case的方法退出到在另一个类中调用它的方法

时间:2017-09-22 18:51:14

标签: java switch-statement

我有一个类,其方法调用位于另一个类中的方法,该方法具有切换案例。问题是我无法退出带有switch case的方法,并在调用它的方法之后返回到下一行。我已经在StackOverFlow中搜索了类似的问题。我还试图在那些答案中使用建议的解决方案来解决与退出案例相关的问题(使用条件,使用返回等)。不幸的是,当我使用这些解决方案时,我不会回到调用switch case方法的方法的下一行。相反,我正在使用" Build Succeeded消息"退出整个程序。

我希望自己不会发布一些模拟我所面临的真正问题的课程,而不是过于抽象。对不起,如果代码太长了。

public class TestClass {
    ClassWithriginalMethod test;

    public static void main(String[] args) {
        ClassWithriginalMethod g = new ClassWithriginalMethod();
        g.presentMenuOptions();
    }

}

此类包含主要方法。

下一个类是一个具有使用switch case调用方法的方法:

import java.util.ArrayList;
import java.util.Scanner;


public class ClassWithriginalMethod {
    private final ArrayList<ClassWithSwitchCases> arr;
    Scanner s = new Scanner(System.in);

    public void presentMenuOptions() {
        System.out.println(
        "_____________________________________________________________________________\n"
        + "This Menu contains the following options:\n"
        + "Please choose a number corresponding to your option\n"
        + "1: to get create submenu\n"
        + "2: to get edit sub menu\n"
        + "3: to get view sub menu\n"
        + "4: to get delete sub\n" 
        + "5: to exit this operation\n"
        + "_____________________________________________________________________________\n");
        String str= s.nextLine();    
            switch (str) {
                case "1":
                    System.out.println("Entering creation...");
                    this.createMenu();//This method is working properly and user is moved to nextline, i.e shown the presentMenuOptions().
                    break;
                case "2":
                    System.out.println("Entering editing...");
                    /* The below method is the damn method that calls the other class methods with swith cases.*/
                    this.editMenu();
                    /*
                    ** What I want is to reach the next methos below this comment when I get back from the switch case. 
                    */
                    System.out.println("We've exited from the othe class method with switch cases...");
                    this.presentMenuOptions();
                    break;
                case "3":
                    System.out.println("Entering viewing...");
                    this.viewMenu();
                    this.presentMenuOptions();
                    break;
                case "4":
                    System.out.println("Entering deletion...");
                    this.deleteMenu();
                    this.presentMenuOptions();
                    break;
                default:
                    System.exit(0);
            }
    }

    public ClassWithriginalMethod() {
        this.arr = new ArrayList<>(0);
    }

    private void createMenu() {
        ClassWithSwitchCases toBeCreated = new ClassWithSwitchCases();
        this.arr.add(toBeCreated);
        this.checkingArraySize();

        this.presentMenuOptions();
    }

    private void editMenu() {
        this.checkingArraySize();
        System.out.println("The following objects are available. Please select the object with the corresponding index\n");
        this.arr.forEach(p -> System.out.printf("%-15d\t%-15s\t%-15s\n", arr.indexOf(p), p.getfName(),p.getsName())); // we print the array to see the indices and object main elems.
        int i = s.nextInt();
        ClassWithSwitchCases toBeEdited = this.arr.get(i); //supposedly I am checking through another function if the object of index i is in the array.
        toBeEdited.edit(toBeEdited); // it is here where we are calling the switch method in the other class
        //this.presentMenuOptions();
    }

    private void viewMenu() {
        this.checkingArraySize();
        System.out.println("The following objects are available. Please select the object with the corresponding index");
        this.arr.forEach(p -> System.out.printf("%-15d\t%-15s\t%-15s\n", arr.indexOf(p), p.getfName(),p.getsName())); // we print the array to see the indices and object main elems.
        int i = s.nextInt();
        ClassWithSwitchCases toBeViewed = this.arr.get(i); //supposedly I am checking through another function if the provided number id less than size of List.
        toBeViewed.view(toBeViewed); // making this class calling the function in the other class
        //this.presentMenuOptions();
    }

    private void deleteMenu() {
        this.checkingArraySize();
        System.out.println("The following objects are available. Please select the object with the corresponding index");
        int i = s.nextInt();
        ClassWithSwitchCases deleted = this.arr.get(i); //supposedly I am checking through another function if the provided number id less than size of List.
        deleted.view(deleted); // making this class calling the function in the other class
        //this.presentMenuOptions();
    }

    private void checkingArraySize () {
        if (this.arr.size() <= 0) {System.out.println("There are no objects in the aray");}  
        else {
            arr.stream().map((p) -> {
                System.out.println("The following objects are available.");
                return p;
            }).forEachOrdered((p) -> {
                System.out.printf("%-15s\t%-15s\t%-15s\n", "index", "fName", "sName");
                System.out.printf("_____________________________________________________________________________\n");
                System.out.printf("%-15d\t%-15s\t%-15s\n", arr.indexOf(p), p.getfName(),p.getsName());
            });
        }
    }
}

最后一个类是具有切换案例的类:

public class ClassWithSwitchCases {

    private String fName;
    private String sName;

    Scanner s = new Scanner(System.in);

    public ClassWithSwitchCases() {
        System.out.println("Please enter first name");
        this.fName = s.nextLine();

        System.out.println("Please enter sur name");
        this.sName = s.nextLine();
    }

    public String getfName() {
        return fName;
    }
    public void setfName(String fName) {
        System.out.println("Please enter first name");
        this.fName = fName;
    }
    public String getsName() {
        return sName;
    }
    public void setsName(String sName) {
        System.out.println("Please enter sur name");
        this.sName = sName;
    }
    public void edit(ClassWithSwitchCases o) {
        System.out.println(
        "_____________________________________________________________________________\n"
        + "The Edit Menu contains the following options:\n"
        + "Please choose a number corresponding to your option\n"
        + "1: to edit the object's first name\n"
        + "2: to edit the object's sur name\n"
        + "3: to exit this menu\n"
        + "_____________________________________________________________________________\n");

        do {
        switch (s.nextLine()) {

            case "1": 
                o.setfName(s.nextLine());
                System.out.println(o.toString());// just to check if editing took place
                this.edit(o); // put so that we can make other edits.
                break;
            case "2": 
                o.setsName(s.nextLine());
                System.out.println(o.toString());// just to check if editing took place
                this.edit(o); 
                break;
            case "3":
                System.out.println("We are leaving the method with switch cases...");
                break;
            default:
                System.out.println("We are also leaving the method with switch cases...");
                break;
        }
            } while ((Integer.getInteger(s.nextLine()) <= 3) && (Integer.getInteger(s.nextLine()) > 0));
    }
    public void view(ClassWithSwitchCases o) {
        System.out.println(o.toString());
    }

    @Override
    public String toString() {
        return "_____________________________________________________________________________\n"
                + "First Name:" + this.getfName() + "\n" 
                + "Middle Name:" + this.getsName() + "\n" 
                + "_____________________________________________________________________________\n";

    }
}

如果您尝试使用这些课程,您会注意到:

  1. 我能够执行createMenu()方法,然后按原样获取presentMenuOptions()方法。
  2. viewMenu()deleteMenu()方法可以完成他们的工作,但是他们退出整个程序。
  3. editMenu()方法给了我nullPointerExeption,但我不知道是哪个指针。
  4. 我在代码的评论中指出了我的想法。
  5. 我添加了额外的System.out.println()条消息,作为调试代码的一种方式。由于我只是一个初学者,这是我现阶段可以做到的。
  6. 如果我的问题中有任何一般值,那就是:如何退出带切换案例的方法并返回另一种方法,而不一定是主要方法。

    非常感谢你的帮助和耐心:)

2 个答案:

答案 0 :(得分:0)

您可以在交换机的任何位置使用return语句。最有可能的是,您希望将break语句更改为return语句。

答案 1 :(得分:0)

在我看来,虽然我的问题是有效的,但这不是核心问题。核心问题是我如何设想我的类(对象)以及它们如何相互关联。换句话说,由于我策划我的解决方案,我遇到了这个问题。如果我选择另一个编排(即更合适的设计模式),我很可能不会遇到这个问题。

在我看来,认真建立一个大解决方案的初学者(我是其中之一)将面临这个问题模式&#34; (要么提出愚蠢的问题,要么回避问题,例如&#34;为什么要这样做?你想要实现什么目标?&#34;因为他们很快就会实施某些课程而他们还没有想出整体结构,行为,以及解决方案的创新方面。

有趣的是,通过犯这些错误,他们会学习。

感谢那些回答我的人以及那些会回答或评论的人。