除数返回无穷大

时间:2019-08-29 03:06:48

标签: java

我正在处理一个包含计时器和计数器的片段。计时器的初始值为编辑文本。当计时器达到0时,我想计算一个比率(计数器/编辑文本输入上显示的#。)我试图将两个值都转换为双精度,但是似乎我在某个地方出错了。当计时器达到0时,速率显示为“无穷大”。任何帮助将不胜感激!

ID

    package com.example.datacollector;

import android.content.ClipData;
import android.content.Context;
import android.content.SharedPreferences;
import android.os.Bundle;
import android.os.CountDownTimer;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.view.inputmethod.InputMethodManager;
import android.widget.Button;
import android.widget.TextView;
import android.widget.EditText;
import android.widget.Toast;

import androidx.fragment.app.Fragment;
import androidx.annotation.NonNull;

import java.util.Locale;

public class fragmentrate extends Fragment {
    private EditText edit_text_input;
    private TextView text_view_countdown;
    private TextView text_view_frequency;
    private TextView text_view_rate;
    private TextView rate_equals;
    private Button button_start_pause;
    private Button button_reset;
    private Button button_set;
    private Button button_frequency;
    private Button button_reset_frequency;
    private CountDownTimer countDownTimer;
    private boolean mTimerRunning;
    private long mStartTimeInMillis;
    private long mTimeLeftInMillis = mStartTimeInMillis;
    private long mEndTime;
    private int mCounter;
    private double denominator;

    View View;

    public View onCreateView(@NonNull LayoutInflater inflater, @NonNull ViewGroup container, @NonNull Bundle savedInstanceState) {
        View = inflater.inflate(R.layout.rate_fragment, container, false);

        text_view_countdown = View.findViewById(R.id.text_view_countdown);
        button_start_pause = View.findViewById(R.id.button_start_pause);
        button_reset = View.findViewById(R.id.button_reset);
        button_frequency = View.findViewById(R.id.button_frequency);
        button_reset_frequency = View.findViewById(R.id.button_reset_frequency);
        edit_text_input = View.findViewById(R.id.edit_text_input);
        button_set = View.findViewById(R.id.button_set);
        text_view_frequency = View.findViewById(R.id.text_view_frequency);
        text_view_rate = View.findViewById(R.id.text_view_rate);
        rate_equals = View.findViewById(R.id.rate_equals);

计数器

 button_frequency.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(android.view.View view) {
                mCounter ++;
                text_view_frequency.setText(Integer.toString(mCounter));
            }
        });

        button_reset_frequency.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(android.view.View view) {
                mCounter = 0;
                text_view_frequency.setText(Integer.toString(mCounter));
            }
        });

计时器和费率计算

button_set.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(android.view.View view) {
                String input = edit_text_input.getText().toString();
                if (input.length() == 0) {
                    Toast.makeText(getActivity(), "Fill it in, loser", Toast.LENGTH_SHORT).show();
                    return;
                }
                long millisInput = Long.parseLong(input) * 60000;
                if (millisInput == 0) {
                    Toast.makeText(getActivity(), "Please enter a positive number", Toast.LENGTH_SHORT).show();
                    return;
                }

                setTime(millisInput);
                edit_text_input.setText("");
            }
        });

        button_start_pause.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(android.view.View view) {
                if (mTimerRunning) {
                    pauseTimer();
                } else {
                    startTimer();
                }
            }
        });

        button_reset.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(android.view.View view) {
                if(mTimerRunning) {
                    resetTimer();
                } else{
                    resetTimer();
                }
            }
        });
        return View;
    }

    private void setTime(long milliseconds) {
        mStartTimeInMillis = milliseconds;
        resetTimer();
    }

    private void startTimer() {
        mEndTime = System.currentTimeMillis() + mTimeLeftInMillis;
        countDownTimer = new CountDownTimer(mTimeLeftInMillis, 100) {
            @Override
            public void onTick(long millisUntilFinished) {
                mTimeLeftInMillis = millisUntilFinished;
                updateCountDownText();
            }

            @Override
            public void onFinish() {
                mTimerRunning = false;
                button_start_pause.setText("Start");
                button_start_pause.setVisibility(android.view.View.INVISIBLE);
                button_reset.setVisibility(android.view.View.VISIBLE);

                try {
                    double denominator = Integer.parseInt(edit_text_input.getText().toString());
                }
                catch (NumberFormatException e)
                {
                    double denominator = 0;
                }
                double rate = ((double)mCounter/denominator);
                text_view_rate.setText(Double.toString(rate));

            }
        }.start();
mTimerRunning = true;
        button_start_pause.setText("Pause");
    }

    private void pauseTimer() {
        countDownTimer.cancel();
        mTimerRunning = false;
        updateCountDownText();
        button_start_pause.setText("Start");
    }

    private void resetTimer() {
        if (mTimerRunning) {
            countDownTimer.cancel();
            mTimeLeftInMillis = (mStartTimeInMillis + 1000);
            updateWatchInterface();
            startTimer();
        } else {
        }
        mTimeLeftInMillis = (mStartTimeInMillis);
        updateCountDownText();
        updateWatchInterface();
        button_reset.setVisibility(android.view.View.VISIBLE);
        button_start_pause.setVisibility(android.view.View.VISIBLE);
    }

    private void updateCountDownText() {
        int minutes = (int) (mTimeLeftInMillis/1000)/60;
        int seconds = (int) (mTimeLeftInMillis/1000)%60;

        String timeLeftFormatted = String.format(Locale.getDefault(),
                timeLeftFormatted = String.format(Locale.getDefault(), "%02d:%02d", minutes, seconds));
        text_view_countdown.setText(timeLeftFormatted);
    }

    private void updateWatchInterface() {
        if (mTimerRunning) {
            edit_text_input.setVisibility(android.view.View.INVISIBLE);
            button_set.setVisibility(android.view.View.INVISIBLE);
            button_reset.setVisibility(android.view.View.VISIBLE);
            button_start_pause.setText("Pause");
        } else {
            edit_text_input.setVisibility(android.view.View.VISIBLE);
            button_set.setVisibility(android.view.View.VISIBLE);
            button_reset.setVisibility(android.view.View.VISIBLE);
            button_start_pause.setText("Start");

            if (mTimeLeftInMillis <100) {
                button_start_pause.setVisibility(android.view.View.INVISIBLE);
            } else {
                button_start_pause.setVisibility(android.view.View.VISIBLE);
            }
        }
    }

    @Override
    public void onStop() {
        super.onStop();

        SharedPreferences preferences = this.getActivity().getSharedPreferences("prefs", Context.MODE_PRIVATE);
        SharedPreferences.Editor editor = preferences.edit();

        editor.putLong("startTimeInMillis", mStartTimeInMillis);
        editor.putLong("millisLeft", mTimeLeftInMillis);
        editor.putBoolean("timerRunning", mTimerRunning);
        editor.putLong("endTime", mEndTime);
        editor.apply();

        if(countDownTimer !=null); {
            countDownTimer.cancel();
        }
    }

    @Override
    public void onStart() {
        super.onStart();

        SharedPreferences preferences = this.getActivity().getSharedPreferences("prefs", Context.MODE_PRIVATE);

        mStartTimeInMillis = preferences.getLong("startTimeInMillis", 0);
        mTimeLeftInMillis = preferences.getLong("millisLeft", mStartTimeInMillis);
        mTimerRunning = preferences.getBoolean("timerRunning", false);

        updateCountDownText();
        updateWatchInterface();

        if (mTimerRunning) {
            mEndTime = preferences.getLong("endTime", 0);
            mTimeLeftInMillis = mEndTime - System.currentTimeMillis();

            if (mTimeLeftInMillis <0) {
                mTimeLeftInMillis = 0;
                mTimerRunning = false;
                updateCountDownText();
                updateWatchInterface();
            } else {
                startTimer();
            }
        }
    }

1 个答案:

答案 0 :(得分:2)

您正在专门捕获NumberFormatException,将分母设置为零,然后除以该数字。根据设计,您的结果将是Infinity

引用Java 8 JLS:

  

将非零有限值除以零会导致有符号无穷大。该标志由上述规则确定。

https://docs.oracle.com/javase/specs/jls/se8/html/jls-15.html#jls-15.17.2