每当运行代码时获取java.lang.NullPointerException

每当运行代码时获取java.lang.NullPointerException,java,nullpointerexception,logic,Java,Nullpointerexception,Logic,为了在这个夏天练习我的基本编程技能,我决定写一个一维运动物理问题求解器。每当我尝试运行程序时,都会出现java.lang.Nullpointerexception错误。我想不出我写错了什么来给我这个错误。注意:为了修复此错误,我现在假设solveFor变量的输入为“加速度”: import java.util.Scanner; public class PhysicsProblem { private double vI; // initial velocity private doubl

为了在这个夏天练习我的基本编程技能,我决定写一个一维运动物理问题求解器。每当我尝试运行程序时,都会出现java.lang.Nullpointerexception错误。我想不出我写错了什么来给我这个错误。注意:为了修复此错误,我现在假设solveFor变量的输入为“加速度”:

import java.util.Scanner;

public class PhysicsProblem
{
private double vI; // initial velocity  
private double vF; // final velocity    
private double t;  // time 
private double deltaX;  // change in the x value
private double accel;
private String missingVar;

public PhysicsProblem (double acceleration, double initialV, double finalV, double time, double changePosition) 
{
    acceleration = accel;
    initialV = vI;
    finalV = vF;
    time = t;
    changePosition = deltaX;    
}

Scanner scan = new Scanner(System.in);

public void getUnknownsAccel()
{
    //-----------
    // checks for another unknown value that is not accel
    //-----------
    if (missingVar.equalsIgnoreCase("time"))
    {
        System.out.println("Please enter the value for time: ");
        t = scan.nextDouble();
        while (t <= 0 || !scan.hasNextDouble())
        {
            System.out.println("That is not an acceptable value!");
            t = scan.nextDouble();
        }
    }       
    if (missingVar.equalsIgnoreCase("initial velocity"))
    {
        System.out.println("Please enter the value for initial velocity: ");
        vI = scan.nextDouble();
        while (!scan.hasNextDouble())
        {
            System.out.println("That is not an acceptable value!");
            vI = scan.nextDouble();
        }
    }
    if (missingVar.equalsIgnoreCase("final velocity"))
    {
        System.out.println("Please enter the value for final velocity: ");
        vF = scan.nextDouble();
        while (!scan.hasNextDouble())
        {
            System.out.println("That is not an acceptable value!");
            vF = scan.nextDouble();
        }
    }
    if (missingVar.equalsIgnoreCase("delta X"))
    {
        System.out.println("Please enter the value for delta X: ");
        deltaX = scan.nextDouble();
        while (!scan.hasNextDouble())
        {
            System.out.println("That is not an acceptable value!");
            deltaX = scan.nextDouble();
        }
    }
}

它为什么会抛出异常?

missingVar
显然是空的。回顾代码,找出原因。这样做的时候,问问自己,在PhysicsProblem类中,在哪里给变量一个字符串

回答:你没有

请注意,在不同范围内声明的两个名称相同的变量不是相同的变量。仅仅因为您的两个类有一个missingVar字符串变量并不意味着它们共享同一个变量,正如您所发现的,它们实际上不共享。解决方案:在尝试使用之前,在PhysicProblem类中设置missingVar变量。为此为类指定一个setter方法

i、 e


然后在使用变量之前调用该方法。

您从不初始化
missingVar
任何内容,因此它是
null
。你需要给它赋值,这样它就不是空的

顺便说一句,您可以在调用中切换顺序,以避免出现
NullPointerException

while (!"none".equalsIgnoreCase(missingVar) ||
       !"accelmissingVar".equalsIgnoreCase(missingVar));
还有,在这条线上

if (missingVar == "none");
删除分号,因为分号被解释为
if
块的主体,导致下面的实际块与
if
不关联(无论
if
中的条件如何,它将始终被执行)

不要将字符串值与
==
进行比较,这将比较两个对象引用以查看它们是否引用同一个对象。使用
equals
方法:

if ("none".equals(missingVar))

missingVar
显然为空。回顾代码,找出原因。在PhysicsProblem类中,您在哪里为变量指定了字符串??回答:你没有!!!我希望我能用[howtouseadebugger]替换[nullpointerexception]。。见(和其他);作为开发人员,您必须是调试自己代码的人。在程序的主体中:System.out.println(“为加速而解决”);System.out.println(“是否还有其他未知项?(输入'none'或变量名“+”);missingVar=scan.nextLine();汤姆伊德:你错了。请查看我的答案以了解原因。我认为明确指出不同的作用域很重要,即使“两个[不同]”应该暗示它。@user2246674:谢谢您的改进!谢谢你的洞察力!那么我应该在类文件中调用该方法还是调用main方法?更明确地说,我是在getUnknownsAccel方法中调用它,还是在我询问用户missingVar值的正文中调用它?好的,所以我知道我不应该在一个线程中问多个问题,但是。。。现在,在我运行程序之后(在我修复了您提到的所有内容之后),程序在获取缺少的变量之一的值后停止运行。这是令人费解的,因为我在主体中有一个do/while循环,这样程序就不会仅仅结束。切换顺序是个坏主意-如果字符串为null,它将无声地失败并增加调试时间;如果字符串为null,最好显式检查null并执行调试代码
if (missingVar == "none");
if ("none".equals(missingVar))