Why does my character jump higher sometimes?

I have two ways to control the jump of my character. One is using the “up” key and the otherone is clicking in a button i have in a canvas. With the first one the bug doesn’t show up but with the second it does. I dont know why. It just jumps higher like if it was doing a double or a triple jump. This bug ocurs when jumping and colliding with a wall but sometimes it just happens when jumping from the normal ground.

My code:

public class NinjaController : MonoBehaviour
{
    public static NinjaController ninja;
    public bool canJump=true;
    public int points;
    private bool stopped=false, afterJump=true;
    private float prevJumpY;
    void Start()
    {
        points = 0;
        ninja = this;
    }
    // Update is called once per frame
    void Update()
    {
        if((afterJump&&(transform.position.y-prevJumpY)>0.185f)||transform.position.y<=prevJumpY) //Stops "going forward force" until reaches certain high
        {
            afterJump = false;
            stopped = false;
            prevJumpY = -999999999;
        }
        if(!stopped)
        {
            gameObject.GetComponent<Animator>().SetBool("Stopped", false);
            gameObject.transform.Translate(1.5f * Time.deltaTime, 0, 0);
        }else
        { 
            gameObject.GetComponent<Animator>().SetBool("Stopped", true);
        }
            
        Quaternion rotation = new Quaternion();
        gameObject.transform.rotation = rotation;
        
        if (canJump&&Input.GetKeyDown("up")) //Using this the bug doesn't show up
        {
            jump();
        }
    }
    private void OnCollisionEnter2D(Collision2D collision)
    {
        if (collision.transform.tag == "Ground")
        {
            canJump = true;
        }
        if(collision.transform.tag=="Wall")
        {
            canJump = true;
            stopped = true;
        }
        if(collision.transform.tag=="Top")
        {
            canJump = false;
        }
        if (collision.transform.tag == "Lava")
        {
            if (PlayerPrefs.HasKey("HighScore"))
            {
                if(PlayerPrefs.GetInt("HighScore") <points)
                {
                    PlayerPrefs.SetInt("HighScore", points);
                }
            }
            else
            {
                PlayerPrefs.SetInt("HighScore", points);
            }
            SceneManager.LoadScene("MainMenu");
            Destroy(gameObject);
        }
        if (collision.transform.tag == "Coin")
            points++;
    }
    public void jump()
    {
        prevJumpY = transform.position.y;
        canJump = false;
        afterJump = true;
        gameObject.GetComponent<Rigidbody2D>().AddForce(new Vector2(0, 395));
    }

    public Vector3 CameraFollower()
    {
        Vector3 pos = new Vector3(gameObject.transform.position.x, gameObject.transform.position.y, -10);
        return pos;
    }
    public Vector3 whereIsPlayerFull()
    {
        
        return gameObject.transform.position;
    }
}

The button code:

public class JumpButton : MonoBehaviour, IPointerDownHandler, IPointerUpHandler
{
    private bool pressed = false;
    private void Update()
    {
        if (NinjaController.ninja != null)
            if (NinjaController.ninja.canJump && pressed)
            {
                NinjaController.ninja.jump();
            }
    }
    public void OnPointerDown(PointerEventData eventData)
    {
        pressed = true;
    }

    public void OnPointerUp(PointerEventData eventData)
    {
        pressed = false;
    }

}

I have had a similar issue at one point or another. The best way I found to fix it is to clamp the y velocity.

Add a Debug.Log(gameObject.GetComponent<Rigidbody2D>().velocity.y); to your script so that you can determine what the velocity should be versus the velocity when it bugs. Decide on what you want your maximum y velocity to be and then add this to the end of your update function.

gameObject.GetComponent<Rigidbody2D>().velocity = new Vector2(gameObject.GetComponent<Rigidbody2D>().velocity.x, Mathf.Clamp(gameObject.GetComponent<Rigidbody2D>().velocity.y, -MaxVelocity, MaxVelocity));