Java 弹丸运动模拟&x27;类型'的非法启动;错误

Java 弹丸运动模拟&x27;类型'的非法启动;错误,java,Java,我有一门课叫PhysicsVector,它处理向量加法等问题,这门课一定很好,因为它是由我的教授写的。我的GravField类计算了g的良好估计,所以我认为这不是问题所在。没有缺少卷括号,方法外没有循环 但它仍然给出“非法开始类型”错误,并指向particle.getNewVelocity方法。在此之前,当它编译时,循环从未结束,y不断增加。所以在某个地方也有一个逻辑错误,但我真的找不到它!不管怎样,我改变了一些东西,现在它停止编译了。我的主要方法是: public class Particle

我有一门课叫PhysicsVector,它处理向量加法等问题,这门课一定很好,因为它是由我的教授写的。我的GravField类计算了g的良好估计,所以我认为这不是问题所在。没有缺少卷括号,方法外没有循环

但它仍然给出“非法开始类型”错误,并指向particle.getNewVelocity方法。在此之前,当它编译时,循环从未结束,y不断增加。所以在某个地方也有一个逻辑错误,但我真的找不到它!不管怎样,我改变了一些东西,现在它停止编译了。我的主要方法是:

public class ParticleSim{

public static void main(String[] args){

    Scanner scanner = new Scanner(System.in);       //User enters initial velocity and size of time interval
    double timeStep = scanner.nextDouble();
    double initialXVelocity = scanner.nextDouble();
    double initialYVelocity = scanner.nextDouble();

    PhysicsVector initialPos = new PhysicsVector();
    initialPos.setVector(0,0);              //Projectile taken to start at origin

    PhysicsVector initialVelocity = new PhysicsVector();
    initialVelocity.setVector(initialXVelocity, initialYVelocity);

    double earthMass = 5.972*Math.pow(10,24);
    double earthRadius = 6371000;

    PhysicsVector g = new PhysicsVector();

    GravField earth = new GravField(earthMass, earthRadius, initialPos);
    g = earth.aDueToGravity(earthMass, earthRadius, initialPos);    //Calculates acceleration due to gravity
                                    //using method in GravField class

    Particle projectile = new Particle(1, initialPos, initialVelocity, timeStep, g);

    double positionY;
    PhysicsVector newPosition= new PhysicsVector();
    PhysicsVector newVelocity = new PhysicsVector();

    do{
        newPosition = projectile.getNewPosition();      //should get the new position of projectile
        g=earth.aDueToGravity(earthMass, earthRadius, newPosition);      //g in new position
        newVelocity = projectile.getNewVelocity();      
        positionY = projectile.positionY();

    }while (positionY>0);
}
然后我的粒子类:

public class Particle{

private double mass;
PhysicsVector initialPosition = new PhysicsVector();
PhysicsVector initialVelocity = new PhysicsVector();

public Particle(){
    mass = 1;
    initialPosition.setVector(0,0);
    initialVelocity.setVector(1,1);
}

public Particle(double mass, PhysicsVector a, PhysicsVector b, double timeStep, PhysicsVector aDueToGravity){

    initialPosition = a;
    initialVelocity = b;

    PhysicsVector v = new PhysicsVector();
    v = initialVelocity;                    
    v = v.scale(timeStep, initialVelocity);     //v = initialVelocity *t    

    PhysicsVector a = new PhysicsVector();
    a = a.scale(timeStep, aDueToGravity);       //a = aDueToGravity*t

    initialPosition.increaseBy(v);          //initialPosition = initialPosition + v
    initialVelocity.increaseBy(a);          //initialVelocity = initialVelocity + a 

    initialPosition.print();
    initialVelocity.print();

}

public double positionY(){
    return initialPosition.getY();  //get y component with method in PhysicsVector
}

public PhysicsVector getNewVelocity(){
        //'illegal start of type' error
    return initialVelocity;
}

public PhysicsVector getNewPosition(){
    //Same error here, 'illegal start of type'
    return initialPosition;
}

}
GravField类:

public class GravField{

public static final double G = 6.674*Math.pow(10,-11);          

private double planetMass;                      
private double planetRadius;                        
PhysicsVector initialPosition = new PhysicsVector();
PhysicsVector distance = new PhysicsVector();
PhysicsVector gravityAcceleration = new PhysicsVector();        


/**
*Default constructor that creates a GravField object with the mass and radius of the earth,
*acting on a projectile starting at x=0, y=0, where the x and y axes are on the surface of the planet
*/
public GravField(){

    double planetMass = 5.972*Math.pow(10,24);
    double planetRadius = 6371000;

}

/** 
*Constructor that creates a GravField object
*@param planetMass Mass of the planet whose field is to be calculated
*@param planetRadius Radius of the planet
*@param projectileX initial x co-ordinate of a projectile moving in the planet's gravitational field
*@param projectileY initial y co-ordinate of the projectile
*/ 
public GravField(double mass, double radius, PhysicsVector initialPos){

    planetMass = mass;
    planetRadius = radius;
    initialPosition = initialPos;

}


//Calculates the acceleration due to the gravitational field of the object
public PhysicsVector aDueToGravity(double planetMass, double planetRadius, PhysicsVector initialPosition){
    double y = planetRadius;
    double x = 0;
    distance.setVector(x,y);
    initialPosition.increaseBy(distance);

    double initialX = initialPosition.getX();
    double initialY = initialPosition.getY();
    double distance = Math.sqrt((initialX)*(initialX)+initialY*initialY);

    double a = (-1*G*planetMass*initialX)/(distance*distance*distance); 
    double b = (-1*G*planetMass*(initialY))/(distance*distance*distance);
    gravityAcceleration.setVector(a,b);
    System.out.println("printing g");
    gravityAcceleration.print();
    return gravityAcceleration;
}

public double magnitude(){

    return gravityAcceleration.magnitude(); 

}

public double componentX(){

    return gravityAcceleration.getX();                  
}

public double componentY(){

    return gravityAcceleration.getY();
}
}

在第二个粒子构造函数中,有一个重复的局部变量“a”。传入一个名为“a”的PhysicsVector,并声明另一个名为“a”的PhysicsVector变量


这是我看到的唯一问题,因为我没有PhysicsVector类。尝试修复它,看看是否有帮助。

在第二个粒子构造函数中有一个重复的局部变量“a”。传入一个名为“a”的PhysicsVector,并声明另一个名为“a”的PhysicsVector变量


这是我看到的唯一问题,因为我没有PhysicsVector类。尝试修复它,看看是否有帮助。

我所做的是创建了一个PhysicsVector类:

public class PhysicsVector {
    double y;
    public void setVector(int i, int i1) {
    }

    public PhysicsVector scale(double timeStep, PhysicsVector initialVelocity) {
        return initialVelocity;
    }

    public void increaseBy(PhysicsVector a) {
    }

    public double getY() {
        return y;
    }

    public void print() {
    }
}
我的粒子类看起来像:

public class Particle{
    private double mass;
    private PhysicsVector initialPosition = new PhysicsVector();
    private PhysicsVector initialVelocity = new PhysicsVector();

    public Particle(){
        mass = 1;
        initialPosition.setVector(0,0);
        initialVelocity.setVector(1,1);
    }

    public Particle(double mass, PhysicsVector a, PhysicsVector b, double timeStep, PhysicsVector aDueToGravity){
        initialPosition = a;
        initialVelocity = b;

        PhysicsVector v = new PhysicsVector();
        v = initialVelocity;
        v = v.scale(timeStep, initialVelocity);     //v = initialVelocity *t

        PhysicsVector a = new PhysicsVector();
        a = a.scale(timeStep, aDueToGravity);       //a = aDueToGravity*t

        initialPosition.increaseBy(v);          //initialPosition = initialPosition + v
        initialVelocity.increaseBy(a);          //initialVelocity = initialVelocity + a

        initialPosition.print();
        initialVelocity.print();
    }

    public double positionY(){
        return initialPosition.getY();  //get y component with method in PhysicsVector
    }

    public PhysicsVector getNewVelocity(){
        return initialVelocity;
    }

    public PhysicsVector getNewPosition(){
        return initialPosition;
    }
}
我得到的唯一错误/警告是
变量“a”已在作用域中定义。
我肯定你在你的问题上遗漏了一些信息,或者问题代码与你的代码不同


创建一个示例来演示您的问题。这将帮助您更好地理解和解决问题

我所做的是创建一个PhysicsVector类:

public class PhysicsVector {
    double y;
    public void setVector(int i, int i1) {
    }

    public PhysicsVector scale(double timeStep, PhysicsVector initialVelocity) {
        return initialVelocity;
    }

    public void increaseBy(PhysicsVector a) {
    }

    public double getY() {
        return y;
    }

    public void print() {
    }
}
我的粒子类看起来像:

public class Particle{
    private double mass;
    private PhysicsVector initialPosition = new PhysicsVector();
    private PhysicsVector initialVelocity = new PhysicsVector();

    public Particle(){
        mass = 1;
        initialPosition.setVector(0,0);
        initialVelocity.setVector(1,1);
    }

    public Particle(double mass, PhysicsVector a, PhysicsVector b, double timeStep, PhysicsVector aDueToGravity){
        initialPosition = a;
        initialVelocity = b;

        PhysicsVector v = new PhysicsVector();
        v = initialVelocity;
        v = v.scale(timeStep, initialVelocity);     //v = initialVelocity *t

        PhysicsVector a = new PhysicsVector();
        a = a.scale(timeStep, aDueToGravity);       //a = aDueToGravity*t

        initialPosition.increaseBy(v);          //initialPosition = initialPosition + v
        initialVelocity.increaseBy(a);          //initialVelocity = initialVelocity + a

        initialPosition.print();
        initialVelocity.print();
    }

    public double positionY(){
        return initialPosition.getY();  //get y component with method in PhysicsVector
    }

    public PhysicsVector getNewVelocity(){
        return initialVelocity;
    }

    public PhysicsVector getNewPosition(){
        return initialPosition;
    }
}
我得到的唯一错误/警告是
变量“a”已在作用域中定义。
我肯定你在你的问题上遗漏了一些信息,或者问题代码与你的代码不同



创建一个示例来演示您的问题。这将帮助您更好地理解和解决问题

同一个包中是否有PhysicsVector类?你能分享PhysicsVector的代码吗。可能是构造函数是私有的,或者您需要向它传递一些值。@StackFlowed Yes。使用PhysicsVector和PhysicsVector方法的早期版本已经编译。仔细查看您的代码,如果删除这些行,您的代码应该可以正常工作。实际上,您只需要返回initialVelocity;&返回初始位置;仅供参考,在创建newVelocity但使用newPosition时,getNewPosition出现编译错误。PhysicsVector是否声明为公共?您需要发布所有代码。没有它很难把发生的事情拼凑起来。在同一个包中有PhysicsVector类吗?你能分享PhysicsVector的代码吗。可能是构造函数是私有的,或者您需要向它传递一些值。@StackFlowed Yes。使用PhysicsVector和PhysicsVector方法的早期版本已经编译。仔细查看您的代码,如果删除这些行,您的代码应该可以正常工作。实际上,您只需要返回initialVelocity;&返回初始位置;仅供参考,在创建newVelocity但使用newPosition时,getNewPosition出现编译错误。PhysicsVector是否声明为公共?您需要发布所有代码。如果没有它,很难将正在发生的事情拼凑起来。仍然无法编译,但这会导致后续问题!谢谢。基本上,我想在主方法中使用位置和速度的计算值。我无法直接从构造函数中获取它们,这就是为什么我尝试使用单独的方法来获取位置和速度。有没有更简单的方法?我不清楚你的程序想做什么,所以我不能回答这个问题。我会说你的代码对我来说很好。然而,我不得不创建我自己的PhysicsVector版本。仍然无法编译,但这会导致后续问题!谢谢。基本上,我想在主方法中使用位置和速度的计算值。我无法直接从构造函数中获取它们,这就是为什么我尝试使用单独的方法来获取位置和速度。有没有更简单的方法?我不清楚你的程序想做什么,所以我不能回答这个问题。我会说你的代码对我来说很好。但是我必须创建自己版本的PhysicsVector。非常好的主意!!!帮我找到了错误!谢谢,有很多代码需要处理。很高兴它能帮上忙。别忘了在问题结束时将此标记为正确答案。好主意!!!帮我找到了错误!谢谢,有很多代码需要处理。很高兴它能帮上忙。别忘了在问题结束时将此标记为正确答案。