1

为了在夏天练习我的基本编程技能,我决定编写一个一维运动物理问题求解器。每当我尝试运行程序时,都会收到 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();
        }
    }
}

这是程序的类文件。我在第 36 行遇到错误:“if (missingVar.equalsIgnoreCase("time"))”

以及在程序主体的第 40 行出现错误:“problem1.getUnknownsAccel();”

public static void main (String[] args)
{

    String missingVar;      // other missing variable
    double vI = 0;
    double vF = 0;
    double t = 0;
    double deltaX = 0;
    double accel = 0;
    Scanner scan = new Scanner(System.in);

    PhysicsProblem problem1 = new PhysicsProblem (accel, vI, vF, t, deltaX);

    System.out.println("Which variable are you solving for? ");
    String solveFor = scan.nextLine();


    // after receiving solveFor input, assesses data accordingly

    if (solveFor.equalsIgnoreCase("acceleration"))
    {
        System.out.println("Solving for Acceleration!");
        System.out.println("Are there any other unknowns? (enter 'none' or the name " +
                "of the variable)");
        missingVar = scan.nextLine();
        do
        {
            problem1.getUnknownsAccel();
            System.out.println("Are there any other unknowns? (enter 'none' or the name " +
                    "of the variable)");
            missingVar = scan.nextLine();
        }   
        while (!missingVar.equalsIgnoreCase("none") || !missingVar.equalsIgnoreCase("acceleration"));

        if (missingVar == "none");
        {
            // Write code for finding solutions
            System.out.println("Assuming you have given correct values, the solution is: ");
        }
    }

为什么会抛出异常?

4

2 回答 2

1

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

答:你没有!

请注意,在不同作用域中声明的两个同名变量不是同一个变量。仅仅因为您的两个类有一个 missingVar String 变量并不意味着它们共享相同的变量,并且正如您所发现的那样,它们实际上没有。解决方案:在 PhysicsProblem 类中设置 missingVar 变量,然后再尝试使用它。为此,给类一个 setter 方法。

IE,

public void setMissingVar(String missingVar) {
  this.missingVar = missingVar;
}

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

于 2013-07-13T00:20:26.000 回答
1

你永远不会初始化missingVar任何东西,所以它是null. 您需要为其分配一些东西,使其不为空。

顺便说一句,您可以在通话中切换顺序以避免出现NullPointerException此处:

while (!"none".equalsIgnoreCase(missingVar) ||
       !"accelmissingVar".equalsIgnoreCase(missingVar));

另外,在这条线上

if (missingVar == "none");

删除分号,因为该分号被解释为if块的主体,导致您下面的实际块不关联if(它总是会被执行,无论您的条件如何if)。

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

if ("none".equals(missingVar))
于 2013-07-13T00:21:09.907 回答