【问题标题】:Java Constructor & ArraysJava 构造函数和数组
【发布时间】:2015-06-13 20:26:09
【问题描述】:

我正在学习java。这是我在网上上的一门课。我的任务完成了。 我正在尝试找出以下原因。

我遇到的两个主要问题是:

1)它似乎只存储一朵花而忽略了其他输入。我该如何纠正这个问题?

2) 展示花卉(例如玫瑰 - 2): 在它显示花朵及其数量后,它会立即给我以下错误消息。

Flower Pack: 

Daffodils  - 1

Roses - 1

Exception in thread "main" java.lang.NullPointerException
    at Assignment2.displayFlowers(Assignment2.java:203)
    at Assignment2.<init>(Assignment2.java:44)
    at Assignment2.main(Assignment2.java:9)

我相信它源于此声明

flowerName = searchingPack[i].getName();

这是我的代码:

    public class Flower {
    private String name;
   private String color;
   private String thorns;
   private String smell;    

    public Flower(){

    }

    public Flower(String flowerName, String flowerColor, String flowerThorns, String flowerSmell){

      name = flowerName;
      color = flowerColor;
      thorns = flowerThorns;
      smell = flowerSmell;

   }

   public String getName(){

      return name;
   }

   public void setName(String flowerName){
      name = flowerName;  
   }

   public String getColor(){

      return color;
   }

   public void setColor(String flowerColor){
      color = flowerColor;  
   }

   public String getThorns(){

      return thorns;
   }

   public void setThorns(String flowerThorns){
      thorns = flowerThorns;  
   }

   public String getSmell(){

      return smell;
   }

   public void setSmell(String flowerSmell){
      smell = flowerSmell;  
   }

}




import java.util.Scanner;

public class Assignment2 {
    public static void main(String[] args){
        new Assignment2 ();
    }

    // This will act as our program switchboard
    public Assignment2 (){

        Scanner input = new Scanner(System.in);
        Flower[] flowerPack = new Flower[25];

        System.out.println("Welcome to my flower pack interface.");
        System.out.println("Please select a number from the options below");
        System.out.println("");

        while(true){
            // Give the user a list of their options
            System.out.println("1: Add an item to the pack.");
            System.out.println("2: Remove an item from the pack.");
            System.out.println("3: Search for a flower.");
            System.out.println("4: Display the flowers in the pack.");
            System.out.println("0: Exit the flower pack interfact.");

            // Get the user input
            int userChoice = input.nextInt();

            switch(userChoice){
                case 1: 
                    addFlower(flowerPack);
                    break;
                case 2: 
                    removeFlower(flowerPack);
                    break;
                case 3: 
                    searchFlowers(flowerPack);
                    break;
                case 4: 
                    displayFlowers(flowerPack);
                    break;
                case 0: 
                    System.out.println("Thank you for using the flower pack interface. See you again soon!");
                    System.exit(0);
            }
        }

    }
     //ADD FLOWERS
    private void addFlower(Flower[] flowerPack) { //This is storing 1 flower but not anything else*********


         Scanner add = new Scanner(System.in);
         String name,color, thorns, smell;

         System.out.println("\nEnter the name of the flower to add: ");
         name = add.nextLine();

         System.out.println("\nEnter the color of the flower: ");
         color = add.nextLine();

         System.out.println("\nAre there thorns present: YES or NO ");
         thorns = add.nextLine();

         System.out.println("\nDoes the flower smell: YES or NO ");
         smell = add.nextLine();

         boolean flowerInserted = false;
         for(int i = 0; i < flowerPack.length; i++){
            if(flowerPack[i] == null){
               Flower newFlower = new Flower(name, color, thorns, smell);
               flowerPack[i] = newFlower;
               flowerInserted = true;
               break;
            }
         } 

         if(flowerInserted){
            System.out.println("Flower inserted.");
            System.out.println();
             }else{
              System.out.println("\nFlower pack is full and could not add another flower.\n");
            }
   }

      //REMOVE FLOWERS
    private void removeFlower(Flower[] flowerPack) {


        Scanner remove = new Scanner(System.in);
        String removeName, removeColor;

        for(int i = 0; i < flowerPack.length; i++){
            System.out.println("\nEnter the name of the flower to remove: ");
            removeName = remove.nextLine();

            System.out.println("\nEnter the color of the flower: ");
            removeColor = remove.nextLine();

            if (flowerPack[i] != null)
            if (flowerPack[i].getName().equalsIgnoreCase(removeName) && flowerPack[i].getColor().equalsIgnoreCase(removeColor)){
               for(int j = i; j < flowerPack.length - 1; j++) {       
                  flowerPack[j] = flowerPack[j + 1];      
                  }      
                  flowerPack[flowerPack.length - 1] = null;
                  System.out.println("\nFlower removed.\n");
                  break;
                  }

            else{
               System.out.println("\nThat flower was not found.\n");
               }
       }
   }

      //SEARCH FOR FLOWERS
    private void searchFlowers(Flower[] flowerPack) {

      Scanner flowerSearch = new Scanner(System.in);
      String name, color, thorns, smell;
      int options;

      System.out.println("1: Seach by name.");
      System.out.println("2: Seach by color.");
      System.out.println("3: Seach for flowers with thorns.");
      System.out.println("4: Seach for flowers that smell.");
      options = flowerSearch.nextInt();

      flowerSearch.nextLine();      

      boolean found = false;
      for(int i = 0; i < flowerPack.length; i++){
         if(options == 1){
            System.out.println("\nEnter the name of the flower: ");
            name = flowerSearch.nextLine();
            if (flowerPack[i] != null) {
            if (flowerPack[i].getName().equalsIgnoreCase(name)) {
               found = true;
               System.out.println("\nFlower was found at index " + i + ".");
               break;
            }
            }
         }
         if(options == 2){
            System.out.println("\nEnter the color of the flower: ");
            color = flowerSearch.nextLine();
            if (flowerPack[i] != null) {
            if (flowerPack[i].getColor().equalsIgnoreCase(color)) {
               found = true;
               System.out.println("\nFlower was found at index " + i + ".");
               break;
            }
            }
         }
         if(options == 3){
            System.out.println("\nFlowers with thorns or no thorns: YES or NO ");
            thorns = flowerSearch.nextLine();
            if (flowerPack[i] != null) {
            if (flowerPack[i].getThorns().equalsIgnoreCase(thorns)) {
               found = true;
               System.out.println("\nFlower was found at index " + i + ".");
               break;
            }
            }
         }
         if(options ==4){
            System.out.println("\nFlower with aroma or no aroma: YES or NO ");
            smell = flowerSearch.nextLine();
            if (flowerPack[i] != null) {
            if (flowerPack[i].getSmell().equalsIgnoreCase(smell)) {
               found = true;
               System.out.println("\nFlower was found at index " + i + ".");
               break;
                  }
                  }
         }

      if(!found){
        System.out.println("\nSorry, no match found.");      
      }

      }
   }

      //DISPLAY FLOWERS 
    private void displayFlowers(Flower[] flowerPack) {

      System.out.println("Flower Pack: \n");   
      Flower[] searchingPack = new Flower[flowerPack.length];
        for (int i = 0; i < searchingPack.length; i++) {    
                 searchingPack[i] = flowerPack[i];   

        }

      String flowerName = null;   
      int count = 0;   
         for(int i = 0; i < searchingPack.length; i++) {   
                i = 0;   
                flowerName = searchingPack[i].getName(); // this line is giving me an error!***********************************
                if (searchingPack[i].getName() == null || searchingPack[i].getName().equals(null)) {     
                break;

                }

                for (int j = 0; j < flowerPack.length; j++) {    
                     if (flowerPack[j] != null) {     
                        if (flowerPack[j].getName().equalsIgnoreCase(flowerName)) {       
                           count++;       
                           }     
                        }    
                     }

                      for (int k = 0; k < count; k++) {     
                           silentRemove(searchingPack, flowerName);    
                       }

                        System.out.println(flowerName + " - " + count);
                        System.out.println();    
                        count = 0;

                     }
                  }


      private void silentRemove(Flower flowerPack[], String flowerName) {   
         for (int i = 0; i < flowerPack.length; i++) {   
            if (flowerPack[i] != null) {     
               if (flowerPack[i].getName().equalsIgnoreCase(flowerName)) {    
                  for (int j = i; j < flowerPack.length - 1; j++) {       
                     flowerPack[j] = flowerPack[j + 1];      
                     }      

                     flowerPack[flowerPack.length - 1] = null;      
                     break;     
                     }   
                  }   
               }
            }
         }

【问题讨论】:

  • “在同一个流上使用多个扫描器是根本问题。扫描器可以(并且将)消耗流 - 这可能(将)导致意想不到的副作用。最好不要这样做它。” 你也永远不会关闭input。另一件事,你不应该在一个类的默认构造函数中有一个无限循环,这只是一个糟糕的做法。 (我确信有一些理由这样做,这不是那个原因)
  • 我是初学者。这是我第一次这样做,你能解释一下你刚才所说的在默认构造函数中有一个无限循环吗?
  • Assignment2的默认构造函数是public Assignment2() { ... },在你有while(true) { ... }的那个块内,while循环将迭代直到它是false或通过break退出或System.exit()。这意味着每当你通过Assignment2 foo = new Assignment2() 实例化一个Assignment2 对象时,就会运行一个无限循环。
  • 最好让循环在public static void main(String[] args) { ... } 方法中运行,并让Assignment2 类来处理抽象和方法调用。
  • 我现在明白了。谢谢你。我的教授给了我们那部分代码,我不应该改变它。我在这里提问的原因之一是因为我认为她并不真正知道自己在做什么。她会不断地给我一些建议,但总是给我同样的错误。

标签: java arrays for-loop constructor java.util.scanner


【解决方案1】:

它需要是一个数组吗? List&lt;Flower&gt; 在这里更合适。发生的事情是你只添加了 2 朵花,但循环遍历数组中的所有 25 个元素,其中一些仍然是 null

【讨论】:

  • 是的,我不允许使用列表。
  • 好的。在尝试访问它们之前,只需确保数组元素不是 null
【解决方案2】:

问题出在

flowerName = searchingPack[i].getName();

因为 searchingPack[i] 可能为空,然后您正试图访问一个不存在的地址。

做这样的事情:

if(searchingPack[i]==null)
    flowerName="";
else
   flowerName = searchingPack[i].getName();

如果您计划执行相同类型的操作,您可能会考虑在数组中的每个索引处放置一个“空”花,这样就不会引发错误。

【讨论】:

    猜你喜欢
    • 2013-12-22
    • 1970-01-01
    • 2015-05-31
    • 1970-01-01
    • 1970-01-01
    • 2013-07-30
    • 2020-08-07
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多