空问题需要解释

时间:2015-07-22 02:43:48

标签: java

我是编程和Java的新手,这是我的第一个null,我有点困惑,因为我不知道发生了什么是编码中的那种错误?还是别的什么?请在这种情况下需要你的解释,并在整体上以一种简单的方式关于null

public static void main(String[] args) {
    Scanner input = new Scanner (System.in);
    System.out.println("Enter grades size :");

    int Size = input.nextInt();

    String[] y = new String[Size];
    int[] x = new int[Size];

    int Max = 0;
    int Min = x[0];

    String Max_studen = y[0];
    String Min_studen = y[0];

    for (int i = 0 ; i < Size ; i++) {
        System.out.println("Enter student name #" + (i));
        y[i] = input.next();

        System.out.println("Enter student grade : #" + (i));
        x[i] = input.nextInt();

        if (x[i] > Max) {
            Max = x[i];
            Max_studen = y[i];
        } else if (x[i] < Min) {
            Min = x[i];
            Min_studen = y[i];
        }
    }

    System.out.println("Max Student is: " + Max_studen);
    System.out.println("Max grade is: ");
    System.out.println(Max);
    System.out.println("Min Student is: " + Min_studen);
    System.out.println("Min grade is : ");
    System.out.println(Min);
}

输出是:

Enter grades size :
2
Enter student name #0
Sam
Enter student grade : #0
85
Enter student name #1
Samy
Enter student grade : #1
95
Max Student is: Samy
Max grade is:
95
Min Student is: null
Min grade is :
0 

4 个答案:

答案 0 :(得分:7)

对于初学者来说,这是一个棘手的问题。让我带你走过这个。

第一个重要的是那些:

String[] y = new String[Size];
int[] x = new int[Size];

这两个阵列之间存在重大差异。 xprimitives的数组,而y是一个对象数组。基元在Java中具有明确定义的默认值(通常为0),因此数组x初始化为包含0的所有单元格。对于对象,没有默认值。由于您可以编写自己的类,因此Java不知道什么是良好的默认值,例如Car。因此default value for objects is null。暂时将null想象为“此单元格为空 1 的信号。这意味着y中的每个单元格都包含null

现在到下一个重要的路线:

int Min = x[0];
[...]
String Min_studen = y[0];

如前所述,x初始化为所有0。最后,Min现在是0。您在此处遇到问题,因为在典型情况下,您永远不会输入成绩< 0,因此永远不会覆盖Min。在genereal中,如果您要查找某些最小值/最大值,则应使用Integer.MIN_VALUE(最大值)或Integer.MAX_VALUE(最小值)初始化它们。 longfloatdouble有类似的常量。这些常数通常可以避免给定问题。由于永远不会覆盖Min,因此Min_studen也不会被覆盖。 y的初始值为null s,与Min_studen的值相同。

对您的代码的一些评论:

  • 变量名称应写在camelCase
  • 数组的[]通常是根据类型编写的,没有空白:String[]而不是String []
  • {之后,应始终有换行符。
  • 变量名称应该有意义且具有描述性。您可以使用studentGradesstudentNames代替xy

有许多网站解释编码约定和样式指南,其中一些是herehere 2 。你现在可能不想看它们,但如果你掌握了Java的基础知识并阅读它们,请记住它们。

1 null的实际含义与我给出的描述非常接近,但推理有点复杂,需要堆和堆内存的知识,什么存储在哪里。

2 没有“styleguid”这样的东西。您当然可以自由定义自己的。样式指南是一种使代码更易于阅读的方法。每当您更改样式指南或部分样式指南时,请记住这一点。

答案 1 :(得分:1)

null基本上意味着变量或对象为空。我们来看看这一部分:

String[] y = new String[Size];
int[] x = new int[Size];
...
int Min = x [0];
...
String Min_studen = y[0];

此时,x[0]y[0]仍为空/空元素,因为没有为它们分配值。因此,Min为0,Min_studen为空。

跳到使用MinMin_studen的位置:

else if (x[i] < Min) { Min = x[i];
    Min_studen = y [i];
}

由于x[]中的任何元素都没有定义为小于0,因此if语句永远不会运行,导致Min_studen在打印时显示为空。

由于存在多个逻辑错误,因此没有明确的解决方案,但您需要确保Min不为空,以便程序运行。

答案 2 :(得分:0)

null基本上意味着变量尚未设置为任何东西,因此它指向内存中名为null的特殊位置。您可以在此处详细了解:http://www.programcreek.com/2013/12/what-exactly-is-null-in-java/

我认为您的具体问题来自此代码:

if (x[i] > Max) {
    Max = x[i] ;
    Max_studen = y[i];
} else if (x[i] < Min) {
    Min = x[i];
    Min_studen = y[i];
}
//x[i] == Max???

您没有x[i] == Max的案例。添加该案例(可能通过将当前案例修改为x[i] >= Max来解决空问题。

答案 3 :(得分:0)

唯一的问题是x [0]和y [0]未初始化。因此,字符串y [0]存储为NULL。 x [0]存储为0。

您需要插入额外条件以使用正确的参数初始化x [0]和y [0]。

  

if(i == 0){   Max = x [0];   Min = x [0];   }

检查代码 -

import java.util.Scanner;
public class HelloWorld {
public static void main(String[] args) {

    Scanner input = new Scanner (System.in);
    System.out.println("Enter grades size : ");

    int Size = input.nextInt();
    String[] y = new String[Size];
    int[] x = new int[Size];

    // Initialize string to store student names and grades
    // Student[0] for highest grade
    // Student[1] for lowest grade
    String[] Student = new String[2];
    int Max = 0, Min = 0;

    for (int i = 0 ; i < Size ; i++) {
        System.out.println("Enter student (" + (i) + ") name : ");
        y[i] = input.next();
        System.out.println("Enter student (" + (i) + ") grade : ");
        x[i] = input.nextInt();

        // This extra condition was missing in the above code.
        if (i==0) {
            Max = x[0];
            Min = x[0];
        }
        else {
            if (x[i] > Max) {
                Max = x[i] ;
                Student[0] = y[i];
                }

            else if (x[i] < Min) {
                Min = x[i];
                Student[1] = y[i];
                }
            }
        }

    System.out.println("Student with highest grade is: " + Student[0]);
    System.out.println("Max grade is: " + Max);
    System.out.println("Student with lowest grade is: " + Student[1]);
    System.out.println("Min grade is : " + Min);

   }
}

上述程序的输出在这里 -

Enter grades size : 
3
Enter student (0) name : 
David
Enter student (0) grade : 
34
Enter student (1) name : 
Sam
Enter student (1) grade : 
42
Enter student (2) name : 
Nancy
Enter student (2) grade : 
25
Student with highest grade is: Sam
Max grade is: 42
Student with lowest grade is: Nancy
Min grade is : 25

希望有所帮助......