我是编程和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
答案 0 :(得分:7)
对于初学者来说,这是一个棘手的问题。让我带你走过这个。
第一个重要的是那些:
String[] y = new String[Size];
int[] x = new int[Size];
这两个阵列之间存在重大差异。 x
是primitives的数组,而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
(最小值)初始化它们。 long
,float
和double
有类似的常量。这些常数通常可以避免给定问题。由于永远不会覆盖Min
,因此Min_studen
也不会被覆盖。 y
的初始值为null
s,与Min_studen
的值相同。
对您的代码的一些评论:
[]
通常是根据类型编写的,没有空白:String[]
而不是String []
。 {
之后,应始终有换行符。studentGrades
和studentNames
代替x
和y
。有许多网站解释编码约定和样式指南,其中一些是here和here 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
为空。
跳到使用Min
和Min_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
希望有所帮助......