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