主类中的方法返回错误的值

3
每当我运行InschrijvingApplicatie时,我会在以下代码行中得到一个错误的值:System.out.printf("Hoeveel broodjes wil je bestellen? (max %d) ", maxBroodjes);因为当我在此行中输入“p”时,int应该是“10”。 System.out.printf("Tot welke categorie behoort u?\nTyp w voor een werknemer, p voor een werknemer met partner, g voor een gast: "); 我认为问题可能出现在这一行:maxBroodjes = (inschrijving.geefAantalPersonen() * 5);但似乎无法找出问题所在。 输出应该是什么样子 练习内容:为一家邀请员工(在代码中为'w')、带有伴侣('p')和客人('g')的公司提供填写姓名的机会,询问他们是何种访客(员工+伴侣、客人或员工),然后询问此人想要多少三明治(客人和员工最多可以要求5个三明治,员工+伴侣可以请求10个)。将最大值显示为整数(最大%d)。所有这些都在循环中进行,直到用户写下“no”(但第一个字符被使用=>结果为'n')回答“Zijn er nog inschrijvingen”,如果答案是肯定的,则重复。

Inschrijving.java

package domein;
public class Inschrijving {

private String naam;
private char categorie;
private int aantalBroodjes;

public Inschrijving(String naam, char categorie) {
    setNaam(naam);
    setCategorie(categorie);
}

public String getNaam() {
    return naam;
}

private void setNaam(String naam) {
    this.naam = naam;
}

public char getCategorie() {
    return categorie;
}

private void setCategorie(char categorie) {
    if (categorie == 'w' || categorie == 'p' || categorie == 'g') {
        this.categorie = categorie;
    } else {
        this.categorie = 'g';
    }

}

public int getAantalBroodjes() {
    return aantalBroodjes;
}

public void setAantalBroodjes(int aantalBroodjes) {

    if (aantalBroodjes <= (geefAantalPersonen() * 5)) {
        this.aantalBroodjes += aantalBroodjes;
    } else {
        this.aantalBroodjes += (geefAantalPersonen() * 2);
    }
}

public int geefAantalPersonen() {
    switch (categorie) {
        case 'w':
        case 'g':
            return 1;
        default:
            return 2;

    }
  }
}

InschrijvingApplicatie

package ui;

import domein.Inschrijving;
import java.util.Scanner;

public class InschrijvingApplicatie {
 public static void main(String[] args) {

    Scanner invoer = new Scanner(System.in);
    String antwoord;
    char eersteLetter;

    System.out.println("Zijn er nog inschrijvingen? ");
    antwoord = invoer.nextLine();
    eersteLetter = antwoord.toLowerCase().charAt(0);

    String naam = null;
    String categorie;
    char categorieEersteLetter = 0;

    int werknemer = 0;
    int werknemerMetPartner = 0;
    int gast = 0;

    int aantalBroodjes;
    int tijdelijk;

    Inschrijving inschrijving = new Inschrijving(naam, categorieEersteLetter);

    if (eersteLetter != 'n') {
        do {
            System.out.println("Wie mag ik inschrijven? ");
            naam = invoer.next();

            do {
                System.out.printf("Tot welke categorie behoort u?\nTyp w voor een werknemer, p voor een werknemer met partner, g voor een gast: ");

                categorie = invoer.next();
                categorieEersteLetter = categorie.toLowerCase().charAt(0);


                switch (categorieEersteLetter) {
                    case 'w':
                        werknemer++;
                        break;
                    case 'p':
                        werknemerMetPartner++;
                        break;
                    case 'g':
                        gast++;
                        break;
                }

            } while (categorieEersteLetter != 'w' && categorieEersteLetter != 'p' && categorieEersteLetter != 'g');
            int maxBroodjes = (inschrijving.geefAantalPersonen() * 5);
            do {
                System.out.printf("Hoeveel broodjes wil je bestellen? (max %d) ", maxBroodjes);
                tijdelijk = invoer.nextInt();
            } while (tijdelijk > maxBroodjes);
            aantalBroodjes = tijdelijk;
            inschrijving.setAantalBroodjes(aantalBroodjes);

            System.out.println("Zijn er nog inschrijvingen? ");
            antwoord = invoer.next();
            eersteLetter = antwoord.toLowerCase().charAt(0);
        } while (eersteLetter != 'n');

    }
    System.out.printf("Er komen %d werknemer(s) zonder partner, %d werknemer(s) met partner en %d gast(en) naar de receptie. Er dienen %d broodjes besteld te worden.", werknemer, werknemerMetPartner, gast, inschrijving.getAantalBroodjes());

}
}

那么你得到了什么,而不是10?如果可能的话,请显示您的完整输出。 - mangusta
@JBNizet 我也考虑过这个,但它会给我一个错误,说“无法到达的语句”,经过一些研究,我得到了答案,因为一旦到达return,它就不会再执行break。 - Hockz
@mangusta 哦,对不起,现在已经添加了。 - Hockz
@user2948118 抱歉,请忽略我之前的评论,那是错误的。我没有注意到你那里已经有一个返回了。 - JB Nizet
1个回答

1

你的方法存在一些问题,虽然可能能够工作,但你不应该那样做。

首先,你将所有受邀人请求的三明治总数仅存储在一个Inschrijving对象中,这毫无意义!(我需要知道所有请求的三明治总数还是只有我请求的?)所以,请将你的Inschrijving类中的setAantalBroodjes更改为:

public void setAantalBroodjes(int aantalBroodjes) {
  this.aantalBroodjes = aantalBroodjes;
}

第二,要求是获取一个人员列表并对其进行操作,因此您应该考虑使用数据结构来支持存储人员列表,例如 ArrayArrayList,一旦用户停止输入(在您的情况下为eersteLetter == 'n'),则可以对数据进行任何操作。
List<Inschrijving> inschrijven = new ArrayList<>();
try (Scanner invoer = new Scanner(System.in)) { // http://tutorials.jenkov.com/java-exception-handling/try-with-resources.html
  System.out.println("Zijn er nog inschrijvingen? ");
  String antwoord = invoer.nextLine();
  char eersteLetter = antwoord.toLowerCase().charAt(0);
  while (eersteLetter != 'n') {

    Inschrijving inschrijving = null;
    System.out.println("Wie mag ik inschrijven? ");
    String naam = invoer.nextLine();
    char categorieEersteLetter = 0;
    do {
      System.out.printf(
          "Tot welke categorie behoort u?\nTyp w voor een werknemer, p voor een werknemer met partner, g voor een gast: ");
      String categorie = invoer.nextLine();
      categorieEersteLetter = categorie.toLowerCase().charAt(0);
    } while (categorieEersteLetter != 'w' && categorieEersteLetter != 'p' && categorieEersteLetter != 'g');
    inschrijving = new Inschrijving(naam, categorieEersteLetter);

    int maxBroodjes = (inschrijving.geefAantalPersonen() * 5);
    int tijdelijk;
    do {
      System.out.printf("Hoeveel broodjes wil je bestellen? (max %d) ", maxBroodjes);
      tijdelijk = invoer.nextInt();
      invoer.nextLine(); // https://dev59.com/cmcs5IYBdhLWcg3wJQi7 
    } while (tijdelijk > maxBroodjes);
    inschrijving.setAantalBroodjes(tijdelijk);
    inschrijven.add(inschrijving);

    System.out.println("Zijn er nog inschrijvingen? ");
    antwoord = invoer.nextLine();
    eersteLetter = antwoord.toLowerCase().charAt(0);
  }
}

当用户完成输入时:
// Do stuffs with your list of people here
int werknemer = 0;
int werknemerMetPartner = 0;
int gast = 0;
int aantalBroodjes = 0;
for (Inschrijving inschrijving : inschrijven) {
  char categorie = inschrijving.getCategorie();
  switch (categorie) {
    case 'w':
      werknemer++;
      break;
    case 'p':
      werknemerMetPartner++;
      break;
    case 'g':
      gast++;
      break;
  }
  aantalBroodjes += inschrijving.getAantalBroodjes();
}
System.out.printf(
        "Er komen %d werknemer(s) zonder partner, %d werknemer(s) met partner en %d gast(en) naar de receptie. Er dienen %d broodjes besteld te worden.",
        werknemer, werknemerMetPartner, gast, aantalBroodjes);

因为你是Java的新手,我在这里使用foreach循环来进行示例,在学习了面向对象编程并熟悉了Java后,建议你研究Java 8 Stream API和Lambda表达式以处理集合类型。


你能给我建议一个解决方案吗?因为对我来说看起来还不错。我给 char categorieEersteLetter 赋值为0的原因是因为我得到了一个错误,指出它没有被初始化。 - Hockz
你想让你的 Inschrijving 类成为不可变类吗?因为我看到你把你的 setters 设为了私有的。 - Hai Hoang
是的(这是一项大学练习),它明确表示我必须将其设置为私有。 - Hockz
将categorieEersteLetter设置为'p'。 - mangusta
因为您还使用了 nextInt(),它没有读取新行字符(当您按下回车键时)。这个新行将被存储在输入流中,下一次调用 nextLine() 时,它会看到一个新行字符,并立即停止,导致您的 antwoord 得到一个空字符串。根据您的练习要求,我会稍微更新我的答案。 - Hai Hoang
显示剩余3条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接