Java 空指针异常解决方法

Java 空指针异常解决方法,java,Java,我搜索了很多,我对java非常陌生,所以我正在尝试创建一个基本程序,它将执行以下操作 用户将插入出生日期或星座符号 然后,该程序将告诉用户他们的星座是什么,或者特定星座经过的日期范围是什么 我现在正处在这条线。。。 " ourDate.getIndexByDate(myDay); " 给出一个空指针异常。 同时,ourDate调用的方法也是如此 java.lang.NullPointerException at Dates.getIndexByDate(Dates.java:68)

我搜索了很多,我对java非常陌生,所以我正在尝试创建一个基本程序,它将执行以下操作

用户将插入出生日期或星座符号

然后,该程序将告诉用户他们的星座是什么,或者特定星座经过的日期范围是什么

我现在正处在这条线。。。 " ourDate.getIndexByDate(myDay); " 给出一个空指针异常。 同时,ourDate调用的方法也是如此

java.lang.NullPointerException
    at Dates.getIndexByDate(Dates.java:68)
    at Dates.main(Dates.java:49)
我有以下代码:

import java.util.ArrayList;
import java.util.Scanner;

public class Dates {

    private static ArrayList<Double> zodiacDates;
    private static ArrayList<String> zodiac;

    public static void main(String[] args) {
        ArrayList<Double> zodiacDates = new ArrayList<Double>()
        {{ 
            add(1.19);
            add(2.18);
            add(3.20);
            add(4.21);
            add(5.20);
            add(6.20);
            add(7.22);
            add(8.22);
            add(9.22);
            add(10.22);
            add(11.21);
            add(12.21);
        }};
        ArrayList<String> zodiac = new ArrayList<String>()
        {{
            add("Capricorn");
            add("Aquarius");
            add("Pisces");
            add("Aries");
            add("Taurus");
            add("Gemini");
            add("Cancer");
            add("Leo");
            add("Virgo");
            add("Libra");
            add("Scorpio");
            add("Sagittarius");     
        }};
        Scanner keyboard = new Scanner(System.in);
        System.out.println("Enter your birthdate in the form of a double");
        Double myDay = keyboard.nextDouble();
        System.out.println("Enter your horoscope sign if you know it");
        String ourSign = keyboard.nextLine();
        Dates ourDate = new Dates();
        System.out.println("Enter your birthdate in the form of a double");
        ourDate.getIndexByDate(myDay);
        ourDate.getIndexBySign(ourSign);    
    }

    public int getIndexBySign(String pName)
    {
        for (int w = 0; w < zodiac.size(); w++)
        {
            String sign = zodiac.get(w);
            if (pName.equals(sign))
            {
                return w;
            }
        } 

        return -1;
    }

    public int getIndexByDate(Double myDay)
    {
        for (int i = 0; i <= zodiacDates.size(); i++)
        {
            Double variable = zodiacDates.get(i);
            if ((myDay <= variable && myDay > zodiacDates.get(i-1)) || (myDay < 1.19 || myDay >= 12.22 ) )
            {
                return i;
            }   
        }
        return -1;
    }
}
import java.util.ArrayList;
导入java.util.Scanner;
公开课日期{
私人静态排列黄道带;
私人静态排列星座;
公共静态void main(字符串[]args){
ArrayList十二生肖日期=新ArrayList()
{{ 
增加(1.19);
增加(2.18);
增加(3.20);
增加(4.21);
增加(5.20);
增加(6.20);
加(7.22);
增加(8.22);
加(9.22);
加(10.22);
加(11.21);
加(12.21);
}};
ArrayList zodiac=新ArrayList()
{{
加上(“摩羯座”);
添加(“宝瓶座”);
添加(“双鱼座”);
添加(“白羊座”);
添加(“金牛座”);
加上(“双子座”);
添加(“癌症”);
添加(“Leo”);
加上(“处女座”);
添加(“天秤座”);
加上(“天蝎座”);
添加(“射手座”);
}};
扫描仪键盘=新扫描仪(System.in);
System.out.println(“以双精度形式输入您的生日”);
Double myDay=键盘.nextDouble();
System.out.println(“如果你知道,请输入你的星座”);
字符串ourSign=keyboard.nextLine();
Dates ourDate=新日期();
System.out.println(“以双精度形式输入您的生日”);
ourDate.getIndexByDate(myDay);
ourDate.getIndexBySign(ourSign);
}
public int getIndexBySign(字符串pName)
{
对于(int w=0;w
  • 在您的if条件下使用&&for&和| | for |。(和是位运算符)
  • 将for循环更改为
    for(int i=0;i
    如果您使用
    
    
  • 在您的if条件下使用&&for&和| | for |。(和是位运算符)
  • 将for循环更改为
    for(int i=0;i

    如果使用
    调试
    NullPointerException
    ,则当堆栈具有行号时,调试应该相当简单。有了IDE,您应该能够突破这一界限,准确地看到问题所在。还有很好的ole打印语句调试。如果您能够单步执行条件运算符,我打赌您会发现问题所在。在执行布尔逻辑时,您几乎总是希望使用
    &&
    ,因为它会短路并避免您发现的问题
    &
    实际上是用于按位
    ;它将执行运算符的两侧,从而导致看起来像是您的问题。

    当您有一个带有行号的堆栈时,调试
    NullPointerException
    应该相当简单。有了IDE,您应该能够突破这一界限,准确地看到问题所在。还有很好的ole打印语句调试。如果您能够单步执行条件运算符,我打赌您会发现问题所在。在执行布尔逻辑时,您几乎总是希望使用
    &&
    ,因为它会短路并避免您发现的问题
    &
    实际上是用于按位
    ;它将执行运算符的两侧,这可能是您的问题。

    错误来自静态变量以及如何在函数中覆盖它们。你有你的静态(~=global)列表
    private static ArrayList zodiacades
    私人静态数组列表黄道带

    问题是在主函数中再次声明它们,但不是静态的,初始化的变量只是主函数的局部变量。当您在2个函数中调用“全局”静态变量时,它们是未初始化的,这意味着您会得到一个漂亮的NullPointerException,因为变量中没有任何内容。只需在main中删除初始化的声明部分:

    public static void main(String[] args) {
        zodiacDates = new ArrayList<Double>()
        {{ 
            add(1.19);
            add(2.18);
            add(3.20);
            add(4.21);
            add(5.20);
            add(6.20);
            add(7.22);
            add(8.22);
            add(9.22);
            add(10.22);
            add(11.21);
            add(12.21);
        }};
        zodiac = new ArrayList<String>()
        {{
            add("Capricorn");
            add("Aquarius");
            add("Pisces");
            add("Aries");
            add("Taurus");
            add("Gemini");
            add("Cancer");
            add("Leo");
            add("Virgo");
            add("Libra");
            add("Scorpio");
            add("Sagittarius");     
        }};
        Scanner keyboard = new Scanner(System.in);
        System.out.println("Enter your birthdate in the form of a double");
        Double myDay = keyboard.nextDouble();
        System.out.println("Enter your horoscope sign if you know it");
        String ourSign = keyboard.nextLine();
        System.out.println("Enter your birthdate in the form of a double");
        Dates.getIndexByDate(myDay);
        Dates.getIndexBySign(ourSign);    
    }
    

    最后一个类详细信息,Dates类中有一些静态变量,函数
    getIndexBySign
    getIndexByDate
    只使用静态内容,不使用对象相关变量。理想情况下,可以将它们设置为静态,然后使用
    Dates.getIndexBySign(…)
    Dates.getIndexByDate(…)
    调用它们,并且可以删除Dates对象声明


    这就是我的全部

    错误来自静态变量以及如何在函数中覆盖它们。你有你的静态(~=global)列表
    private static ArrayList zodiacades
    私人静态数组列表黄道带

    问题是在主函数中再次声明它们,但不是静态的,初始化的变量只是主函数的局部变量。当您在2个函数中调用“全局”静态变量时,它们是未初始化的,这意味着您会得到一个漂亮的NullPointerException,因为变量中没有任何内容。只需在main中删除初始化的声明部分:

    public static void main(String[] args) {
        zodiacDates = new ArrayList<Double>()
        {{ 
            add(1.19);
            add(2.18);
            add(3.20);
            add(4.21);
            add(5.20);
            add(6.20);
            add(7.22);
            add(8.22);
            add(9.22);
            add(10.22);
            add(11.21);
            add(12.21);
        }};
        zodiac = new ArrayList<String>()
        {{
            add("Capricorn");
            add("Aquarius");
            add("Pisces");
            add("Aries");
            add("Taurus");
            add("Gemini");
            add("Cancer");
            add("Leo");
            add("Virgo");
            add("Libra");
            add("Scorpio");
            add("Sagittarius");     
        }};
        Scanner keyboard = new Scanner(System.in);
        System.out.println("Enter your birthdate in the form of a double");
        Double myDay = keyboard.nextDouble();
        System.out.println("Enter your horoscope sign if you know it");
        String ourSign = keyboard.nextLine();
        System.out.println("Enter your birthdate in the form of a double");
        Dates.getIndexByDate(myDay);
        Dates.getIndexBySign(ourSign);    
    }
    

    最后一个类细节,Dates类中有一些静态变量,函数
    getIndexBySign
    for (int i = 0; i <= zodiacDates.size(); i++)
    {
        Double variable = zodiacDates.get(i);
        if ((myDay <= variable && myDay > zodiacDates.get(i-1)) || (myDay < 1.19 || myDay >= 12.22 ) )
        {
            return i;
        }   
    }
    
    public static int getIndexByDate(Double myDay)
    {
        if (myDay < 1.19 || myDay >= 12.22 ) return 0; //Not necessary
        for (int i = 1; i < zodiacDates.size(); i++)
        {
            Double variable = zodiacDates.get(i);
            if (myDay <= variable && myDay > zodiacDates.get(i-1) )
            {
                return i;
            }   
        }
    
        return -1; //Or return 0; as default case.
    }