【问题标题】:Trying to print data shows Null尝试打印数据显示 Null
【发布时间】:2020-03-18 09:03:01
【问题描述】:

我需要一些关于我作为示例编写的代码的帮助。 我目前正在使用 Atom 记事本作为我的代码。

问题陈述:

获取用户输入的平面详细信息。

预期输出:

打印用户输入的数据。

问题:

我能够成功地从用户那里获取输入,但是在打印时,所有值都显示为NULL

代码:

import java.util.*;
class Planes{
  String Name;
  int Number_of_Pylons;
  String Type;

  void EnterValues()
    {
      Scanner s=new Scanner(System.in);
      System.out.println("NAME: ");
      String Name=s.nextLine();
      System.out.println("PYLONS: ");
      int Number_of_Pylons=s.nextInt();
      s.nextLine();
      System.out.print("TYPE OF CRAFT: ");
      String Type=s.nextLine();
    }


};
class Base{
  public static void main(String args[]){
    Planes air[]=new Planes[2];//DID NOT CREATE OBJECTS, REFERENCE ARRAY!!!!!!!!!
    for(int j=0;j<2;j++){
      air[j]=new Planes();
    }// CREATED OBJECTS OF CLASS PLANE!!!!!!!!!
    int i=0;
    for(i=0;i<2;i++)
    {
      System.out.println("Enter values for the planes:");
      air[i].EnterValues();
    }
    System.out.println(air[0].Name);//Test for Print, prints NULL idk why :(
      for(i=0;i<2;i++)//Display the Entered Details
      {
      System.out.println("Name: "+air[i].Name+"Number of Pylons: "+air[i].Number_of_Pylons+"Type: "+air[i].Type);
      }
    }
  };

这是一个相当简单的代码,但我似乎无法让它工作。 我也为我的英语道歉。它不是我的母语。

【问题讨论】:

  • 我“认为”您的问题的原因是:stackoverflow.com/q/13102045/592355(当使用nextInt()nextLine() 时出现意外值)
  • 解决方案:OR(1.) 通过 int Number_of_Pylons=Integer.valueOf(s.nextLine()); //possible runtime exception! 获取您的 int ...OR(2.) 通过 s.next() 获取(全部)您的“字符串”(2 的问题。-它只读取到“空白”)
  • 但是s.next 只会取第一个标记值而不是整个句子,对吗?
  • 选项 3(如引用和接受的答案中所述):在 nextInt() 之后调用 nextLine() ;)

标签: java arrays object null


【解决方案1】:

这是一个经典的范围问题。我认为您在 Java 中没有很好地学习范围概念。

class Planes{
  String Name;  //instance variable
  int Number_of_Pylons;//instance variable
  String Type;//instance variable

  void EnterValues()
    {
      Scanner s=new Scanner(System.in);
      System.out.println("NAME: ");
      String Name=s.nextLine(); //local variable
      System.out.println("PYLONS: ");
      int Number_of_Pylons=s.nextInt(); //local variable
      s.nextLine();
      System.out.print("TYPE OF CRAFT: ");
      String Type=s.nextLine(); //local variable
    }


};

我已经评论了上面关于您使用的变量类型的代码。所以,如果你写类似

String Name=s.nextLine(); 

它只是将值分配给您的局部变量Name,其范围仅在函数内部。这不会为您的对象分配任何内容。如果你想为对象属性赋值,它必须像

this.Name=s.nextLine();

当您指定此this 时,范围是实例级别。现在您的对象属性Name 具有值。对其他人也是如此。您可以修复剩余部分并使其正常工作。

顺便说一句,使用的命名约定、代码格式等,感觉就像一个.Net 模型。熟悉 Java 编码中的最佳实践 - 因为它在这里都被打破了!。

【讨论】:

  • 那么,对于局部变量获取用户值this关键字重要吗?
  • 如果你想用对象访问值,你必须给实例变量赋值。如果分配给局部变量,它们不是对象属性,所以对象属性将为空
  • 好的,现在开始记住这一点。 Atom Notepad 也可以用于编写 Java 代码,因为我必须使用终端来运行我的代码
  • 好吧,酷!我是一年级学生,我对环境不是很熟悉。谢谢
  • 你拥有世界上所有的时间!万事如意
【解决方案2】:

您确实要求用户提供值,但您没有将这些值设置为当前对象

void EnterValues(){
    Scanner s = new Scanner(System.in);

    System.out.println("NAME: ");
    this.name = s.nextLine(); // assign the value to the object's name

    System.out.println("PYLONS: ");
    this.number_of_Pylons=s.nextInt();
    s.nextLine();

    System.out.print("TYPE OF CRAFT: ");
    this.type=s.nextLine();
}

另外,Java 约定对于变量名是 lowerCamelCase

【讨论】:

    猜你喜欢
    • 2018-09-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-10-05
    • 2017-12-09
    • 2022-11-20
    • 2013-12-15
    相关资源
    最近更新 更多