使用对象时的java.lang.nullPonterException';s法

使用对象时的java.lang.nullPonterException';s法,java,arrays,object,parameters,nullpointerexception,Java,Arrays,Object,Parameters,Nullpointerexception,嗨,我有一个叫做矩形的对象,下面是代码: class Rectangle{ private double length, breath, area, perimeter; private static double largestArea; public void setSideDetails(double length, double breath){ this.length = length; this.breath = breath;

嗨,我有一个叫做矩形的对象,下面是代码:

class Rectangle{
    private double length, breath, area, perimeter;
    private static double largestArea;
    public void setSideDetails(double length, double breath){
        this.length = length;
        this.breath = breath;
    }

    public double getArea(){
        area = length*breath;
        return area;
    }

    public double getPerimeter(){
        perimeter = 2*(length+breath);
        return perimeter;
    }

    public static void setLargestArea(double areas[]){
        for(int i = 0; i < areas.length; i++){
            if(areas[i] > largestArea){
                largestArea = areas[i];
            }
        }
    }

    public static double getLargestArea(){
        return largestArea;
    }

    public void drawRectangle(){
        System.out.print(" ");
        for(int i = 0; i < length; i++){
            System.out.print("_");
        }
        System.out.println();
        for(int i = 0; i < breath; i++){
            System.out.print("|");
            for(int j = 0; j < length; j++){
                System.out.print(" ");
            }
            System.out.println("|");
        }
        System.out.print(" ");
        for(int i = 0; i < length; i++){
            System.out.print("¯");
        }
        System.out.println();
    }
}
类矩形{
私人双倍长度、呼吸、面积、周长;
私有静态双大面积;
公共空间细节(双倍长度,双呼吸){
这个长度=长度;
这个呼吸=呼吸;
}
公共区域(){
面积=长度*呼吸;
返回区;
}
公共双边界{
周长=2*(长度+呼吸);
返回周长;
}
公共静态空隙集总面积(双面积[]){
对于(int i=0;i大面积){
大面积=面积[i];
}
}
}
公共静态双getlargestrea(){
回归大面积;
}
公共空矩形(){
系统输出打印(“”);
for(int i=0;i
以及使用它的类:

import java.util.*;
class UsingRectangle{
    public static void main(String args[]){
        Scanner in = new Scanner(System.in);
        in.useDelimiter("\n");

        int number = 0;
        boolean isError = false;
        String units;

        System.out.print("How many rectangles do you want to create? ");
        do{
            try{
                number = in.nextInt();
                number = Math.abs(number);
                isError = false;
            }catch(InputMismatchException e){
                System.out.println("Your input was not accepted. Please try again.");
                in.next();
                isError = true;
            }
        }while(isError);
        do{
            isError = false;
            System.out.print("Please enter the units in mm, cm or m: ");
            units = in.next();
            if(!(units.equalsIgnoreCase("mm"))&&!(units.equalsIgnoreCase("cm"))&&!(units.equalsIgnoreCase("m"))){
                System.out.println("Your input was not accepted. Please try again.");
                isError = true;
            }
        }while(isError);

        Rectangle[] r = new Rectangle[number]; //The actual rectangles are instanceiated here.
        double areas[] = new double[number]; //This will be used to collect the areas to be sent to a static method.

        for(int i = 0; i < r.length; i++){
            double length = 0;
            double breath = 0;
            do{
                isError = false;
                try{
                    System.out.print("Please enter the length of Rectangle "+(i+1)+": ");
                    length = Math.abs(in.nextInt());
                }catch(InputMismatchException e){
                    System.out.println("Your input was not accepted. Please try again.");
                    in.next();
                    isError = true;
                }
            }while(isError);
            do{
                isError = false;
                try{
                    System.out.print("Please enter the breath of Rectangle "+(i+1)+" ");
                    breath = Math.abs(in.nextInt());
                }catch(InputMismatchException e){
                    System.out.println("Your input was not accepted. Please try again.");
                    in.next();
                    isError = true;
                }
            }while(isError);
            r[i].setSideDetails(length, breath);
        }
        for(int i = 0; i < r.length; i++){
            r[i].drawRectangle();
            areas[i] = r[i].getArea();
            System.out.println("Area: "+areas[i]+units+"2   Perimeter: "+r[i].getPerimeter()+units);
        }

        System.out.print("The largest area is:  ");
        Rectangle.setLargestArea(areas);
        System.out.print(Rectangle.getLargestArea());
    }
}
import java.util.*;
类使用矩形{
公共静态void main(字符串参数[]){
扫描仪输入=新扫描仪(系统输入);
in.useDelimiter(“\n”);
整数=0;
布尔isError=false;
弦单位;
System.out.print(“要创建多少个矩形?”);
做{
试一试{
number=in.nextInt();
数字=数学abs(数字);
isError=错误;
}捕获(输入不匹配异常e){
System.out.println(“您的输入未被接受,请重试”);
in.next();
isError=真;
}
}while(isError);
做{
isError=错误;
系统输出打印(“请输入单位mm、cm或m:”;
单位=in.next();
if(!(单位等信号量(“mm”)和&!(单位等信号量(“cm”)和&!(单位等信号量(“m”)){
System.out.println(“您的输入未被接受,请重试”);
isError=真;
}
}while(isError);
矩形[]r=新矩形[number];//实际矩形在此处实例化。
double area[]=new double[number];//这将用于收集要发送到静态方法的区域。
对于(int i=0;i
我的问题是:

其中表示
r[i].setSideDetails(长度、呼吸)出现运行时错误-
java.lang.nullPointerException null
。我不知道是什么原因造成的。任何搜索都没有结果,我想知道原因、结果和预防,以及如何解决它

谢谢


顺便说一句,我是两年后参加考试的A级学生,所以如果我是专业人士,不要表现得好像我应该知道这些。

那是因为你刚刚声明了
Rectangle[]r=new Rectangle[number]并且尚未初始化此数组中的元素。默认情况下,数组中的每个元素都是
null
,在尝试对其调用方法时提供NPE。在对数组中的每个元素调用方法之前对其进行初始化

例如:

Rectangle[]r=新矩形[number];
对于(int i=0;i
这是因为您刚刚声明了
矩形[]r=new Rectangle[number]并且尚未初始化此数组中的元素。默认情况下,数组中的每个元素都是
null
,在尝试对其调用方法时提供NPE。在对数组中的每个元素调用方法之前对其进行初始化

例如:

Rectangle[]r=新矩形[number];
对于(int i=0;i
由于引用
r[i]
指向nothing/
null
,您将获得一个NullPointerException。因此,您必须实例化
矩形
对象并将
Rectangle[] r = new Rectangle[number];
for(int i = 0; i < r.length; i++){
    r[i] = new Rectangle(); // You can use either this or some other constructor you have.
}
for(int i = 0; i < r.length; i++)
    r[i] = new Rectangle(); // creating a new Rectangle object here