本人Java菜鸟,请高手赐教
程序不能运行,Eclipse显示Exception in thread "main" java.lang.NullPointerException
at Pro.main(Pro.java:23)
public class Pro {
class Point{
int x;
int y;
public int retx(){
return x;
}
public int rety(){
return y;
}
public Point(){
x=(int)Math.random();
y=(int)Math.random();
}
}
public static void main(String arg[]){
int a,b;
int i,j,temp;
Point[] array=new Point[10];
int[] array1=new int[10];
for(i=0;i<10;i++){
a=array[i].retx();
b=array[i].rety();
array1[i]=(int) Math.sqrt((int) (Math.pow(a,2)+Math.pow(b,2)));
}
for(i=0;i<10;i++){
for(j=1;j<10-i;j++){
if(array1[i]>array1[j]){
temp=array1[i];
array1[i]=array1[j];
array1[j]=temp;
}
}
for(i=0;i<10;i++){
System.out.print(array[i]+" ");
}
}
}
}
程序不能运行,Eclipse显示Exception in thread "main" java.lang.NullPointerException
at Pro.main(Pro.java:23)
public class Pro {
class Point{
int x;
int y;
public int retx(){
return x;
}
public int rety(){
return y;
}
public Point(){
x=(int)Math.random();
y=(int)Math.random();
}
}
public static void main(String arg[]){
int a,b;
int i,j,temp;
Point[] array=new Point[10];
int[] array1=new int[10];
for(i=0;i<10;i++){
a=array[i].retx();
b=array[i].rety();
array1[i]=(int) Math.sqrt((int) (Math.pow(a,2)+Math.pow(b,2)));
}
for(i=0;i<10;i++){
for(j=1;j<10-i;j++){
if(array1[i]>array1[j]){
temp=array1[i];
array1[i]=array1[j];
array1[j]=temp;
}
}
for(i=0;i<10;i++){
System.out.print(array[i]+" ");
}
}
}
}
Point[] array=new Point[10]; 只是定义了十个Point对象数组
但是没有赋值
Point[] array=new Point[10];
实际上是创建一个数组,指定数组长度为10构造方法是在实例化一个对象的时候调用,也就是当你对一个类对象进行new操作的时候,就会执行构造函数。
class A {
private int x;
private int y; public A(){
this.x = x;
this.y = y; }}public class B {
public static void main(String[] args) { //使用new进行实例化时,会自动调用构造函数
A a = new A(); }
}
class Point{
int x;
int y;
public int retx(){
return x;
}
public int rety(){
return y;
}
public Point(int x,int y){ //错误3
x=(int)Math.random();
y=(int)Math.random();
}
}
public static void main(String arg[]){
int a,b;
int i,j,temp;
Point[] array=new Point[10]; ///错误1
int[] array1=new int[10];
for(i=0;i <10;i++){
a=array[i].retx(); ///这里错误2
b=array[i].rety();
array1[i]=(int) Math.sqrt((int) (Math.pow(a,2)+Math.pow(b,2)));
}
for(i=0;i <10;i++){
for(j=1;j <10-i;j++){
if(array1[i]>array1[j]){
temp=array1[i];
array1[i]=array1[j];
array1[j]=temp;
}
}
for(i=0;i <10;i++){
System.out.print(array[i]+" ");
}
}
}
}
-----------------------------------------
看我注释,首先看错误1,因为在注释为"错误1"那个只是创建了一个Point类型,长度为10的数组对象array,但是该数组对象没有初始化,所以array是指向空的,即null。在“错误2”中,你对一个为null(即空指向的对象)的array[i]赋值当然会出错.
--------------
按我下面这样改
import java.util.Random;import com.sun.java_cup.internal.production;public class Pro {
public class Point{
int x;
int y;
public int retx(){
return x;
}
public int rety(){
return y;
}
public Point(int x,int y){
this.x=x;
this.y=y;}
}
public static void main(String arg[]){
int a,b;
int i,j,temp;
int ranvaluex=0;
int ranvaluey=0;
Pro p=new Pro();
Pro.Point[] array=new Point[10];
int[] array1=new int[10];
Random r=new Random();for(i=0;i <10;i++){
ranvaluex=r.nextInt();
ranvaluey=r.nextInt();
array[i]=p.new Point(ranvaluex,ranvaluey);
a=array[i].retx();
b=array[i].rety();
array1[i]=(int) Math.sqrt((int) (Math.pow(a,2)+Math.pow(b,2)));
}
for(i=0;i <10;i++){
for(j=1;j <10-i;j++){
if(array1[i]>array1[j]){
temp=array1[i];
array1[i]=array1[j];
array1[j]=temp; }
}
for(i=0;i <10;i++){
System.out.print(array1[i]+" ");
}
}
}
}
你原来的代码是为一个空指针的声明赋值,就好像你在c++中为一片没有内存地址的"内存单元"赋值一样
Point[] array=new Point[10]; //这只是说有这么一个数组。里面应该是没有东西的。说下原因,你在这里用到了内部类,应该注意一点,内部类是不能在外部类的静态方法里被实例化的。你说的构造方法是自动条用是没有错的,你这里的也自动调用了。但是没用。所以,我把你的代码改了下。这样是可以的,不知道是否何你的意?public class Pro {
class Point {
int x;
int y; public int retx() {
return x;
} public int rety() {
return y;
} public Point() {
x = (int) Math.random();
y = (int) Math.random();
}
} public static void main(String arg[]) {
int a, b;
int i, j, temp;
//Point[] array = new Point[10];
Pro p = new Pro();
int[] array1 = new int[10];
for (i = 0; i < 10; i++) {
Pro.Point point = p.new Point();
//a = array[i].retx();
//b = array[i].rety();
a = point.retx();
b = point.rety();
array1[i] = (int) Math
.sqrt((int) (Math.pow(a, 2) + Math.pow(b, 2)));
}
for (i = 0; i < 10; i++) {
for (j = 1; j < 10 - i; j++) {
if (array1[i] > array1[j]) {
temp = array1[i];
array1[i] = array1[j];
array1[j] = temp;
}
}
for (i = 0; i < 10; i++) {
System.out.print(array1[i] + " ");
}
}
//这里测试你的构造方法是否被调用了。
/*
Pro pro = new Pro();
Pro.Point point = pro.new Point();
System.out.println(point.x);
System.out.println(point.y); */
}
}
for(int p; p < array.length; p++){
array[p] = new Point();
}
问题出在Point[],不是int[].
java中的ArrayList底层实现也是数组,不认为用数组就是面向过程了.回到这个问题上来,可不可以这样理解:
List<Point> list = new ArrayList<Point>();
和
Point[] array = new Point[10];
是等效的. list是空的,只不过是没有大小的限制而已.