【问题标题】:Java programming, how to break from an infinite loop?Java编程,如何摆脱无限循环?
【发布时间】:2015-10-16 13:46:21
【问题描述】:

我有这个程序供我学习,但我找不到如何结束这个循环。你能帮助我吗?我真的找不到如何退出这个循环,我不是必须使用 while 函数,也不允许使用 break 函数

import java.io.BufferedReader;
import java.io.InputStreamReader;

public class Ld2141reb130 {
    public static void main(String[] args) {
        BufferedReader br = new BufferedReader(
            new InputStreamReader(System.in));
        double g=9.81, a=40;
        a = Math.toRadians(a);
        double t, x = 0, y=0, v0;
        boolean hitTarget=false;
        String s;
        System.out.println("Artūrs Škutāns IRDBF1 000RDB111");
        try {
            System.out.print("v0=");
            s = br.readLine();
            v0 = Double.parseDouble(s);
        } catch(Exception e){
            System.out.println("input-output error");
            return;
        }
        System.out.println("t  \t  x \t  y");
        t = 0.05;
        while (hitTarget=true)  {
            x = v0*t*Math.cos(a);
            y = v0*t* Math.sin(a) - (g*t*t)/2;;
            System.out.printf("%3.2f\t%7.3f\t%7.3f\n", t, x, y);
            if (x>=15 && x<=18 && y<=6 && y>4) {
                hitTarget = true;
            }
            t += 0.05;
        } 
        while ( y>=0 || x>=10 && y>=4 );
        if (hitTarget)
            System.out.println("the target was destroyed");
        else
            System.out.println("shot off the target");
    }
}

【问题讨论】:

  • while (hitTarget=true) { 你可能想要 while (hitTarget==true) (double equals)
  • 这个while ( y&gt;=0 || x&gt;=10 &amp;&amp; y&gt;=4 ); 应该在做什么?
  • 我认为您实际上想要while (!hitTarget),即循环直到击中目标。之后的循环:while ( y&gt;=0 || x&gt;=10 &amp;&amp; y&gt;=4 );,我不知道你想用它做什么。
  • 我有这个任务:prntscr.com/8ry1bg 所以我想显示具有给定速度值(用户输入 v0)的射击轨迹和射击角度(a)也应该循环如果 hitTarget 击中绿色或红色字段,则结束,如果目标(红色字段)被击中或未命中(绿色字段),则打印不同的消息。我从给出的示例中复制了大部分代码,但我不擅长 Java 编程,无法解释它显示的所有内容。谢谢你的帮助顺便说一句!但是现在没有输出数字:(

标签: java cycle


【解决方案1】:

你的问题是

while (hitTarget=true)  {

这会将 hitTarget 分配给 true,然后检查它是否为 true(即是)

改成

while (hitTarget==true)  {

甚至更好

while (hitTarget)  {

但是由于您从 hitTarget 开始为 false,您可能希望将 hitTarget 的声明更改为 true,或者将循环更改为 do while,而不是至少执行一次,并且还有一些将 hotTarget 设置为 false 的条件。

然后你有一个空循环

while ( y>=0 || x>=10 && y>=4 );

如果你进入它,那将是一个无限循环(因为它不会改变任何状态)

也许你想要类似的东西

do {
    x = v0*t*Math.cos(a);
    y = v0*t* Math.sin(a) - (g*t*t)/2;;
    System.out.printf("%3.2f\t%7.3f\t%7.3f\n", t, x, y);
    if (x>=15 && x<=18 && y<=6 && y>4) {
        hitTarget = true;
    }
    t += 0.05;
} while (hitTarget || y>=0 || x>=10 && y>=4 );

【讨论】:

  • 即便如此,hitTarget 永远不会在循环内设置为 false。
【解决方案2】:

里面有两个明显的错误:

a) 写 while (hitTarget)while (hitTarget == true) (您的代码中的内容会将值 分配 true 给 hitTarget;直接将您的代码翻译成 while(true)

最重要的是:

b) 您需要在循环中将hitTarget 的值更改为false

换句话说:你指示你的循环永远运行;然后你想知道为什么它永远不会停止?

最后:考虑将代码分解为更小的方法。会更容易阅读和理解。

【讨论】:

  • 非常感谢您的帮助!我对 Java 和编程真的很陌生,所以我对此很挣扎。再次感谢!
【解决方案3】:

我敢打赌,当 hitTarget 设置为 true 时,您想结束循环。要结束该循环,您必须检查 hitTarget != false:

while (hitTarget != false)

或者简单地说:

while (!hitTarget)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-01-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-03-17
    • 2013-06-20
    • 2016-06-21
    相关资源
    最近更新 更多