gpt4 book ai didi

Java 程序在没有警告的情况下停止工作

转载 作者:行者123 更新时间:2023-12-02 07:35:19 25 4
gpt4 key购买 nike

我创建了一个方法:

public double Calculouno(double x1,double x2,double y1,double y2)
{
double ecuacion1;
ecuacion1= (x2-x1)+(y2-y1);
ecuacion1= Math.sqrt(ecuacion1);
return ecuacion1;
}

当我的程序尝试使用数学函数(例如 powsqrt)(至少我怀疑是这样)计算 ecuacion1 时,如果没有编译器,它就会停止工作警告并显示“构建成功”。请帮忙。

当我到达这部分(方法)时,编译器会说“构建成功”,然后就结束了。在这一部分之前我的程序运行良好。

这是完整的源代码。

    import java.util.Scanner;
import java.lang.Math;

public class Ejercicio12
{
public static void main(String args[])
{
double[] x= new double[3];
double[] y= new double[3];
double a,b,c;
int con=0, con2=0;
double[] angulo= new double[3];
Scanner entrada = new Scanner(System.in);
Calculos cal= new Calculos();

for(con=0;con<3;con++)
{
System.out.println("Ingrese un valor x para el punto "+(con+1)+": ");
x[con]= entrada.nextDouble();
System.out.println("Ingrese un valor y para el punto "+(con+1)+": ");
y[con]= entrada.nextDouble();
}

a= cal.Calculouno(x[0],x[1],y[0],y[1]);
b= cal.Calculouno(x[1],x[2],y[1],y[2]);
c= cal.Calculouno(x[2],x[0],y[2],y[0]);

angulo[0]= cal.Angulo(a,b,c);
angulo[1]= cal.Angulo(c,a,b);
angulo[2]= cal.Angulo(b,a,c);

if(angulo[0]>90||angulo[1]>90||angulo[2]>90)
{
System.out.println("El triangulo es obtusangulo");
}
else
{
if(angulo[0]==90||angulo[1]==90||angulo[2]==90)
{
System.out.println("El triangulo es rectangulo");
}
else
{
if(angulo[0]<90&&angulo[1]<90&&angulo[2]<90)
{
System.out.println("El triangulo es acutangulo");
}
}

}
}


}



import static java.lang.Math.sqrt;
import static java.lang.Math.pow;
import static java.lang.Math.acos;
public class Calculos
{
public double Calculouno(double x1,double x2,double y1,double y2)
{
double ecuacion1;
double dx= (x2-x1);
double dy= (y2-y1);
return Math.sqrt(dy+dx);

}


public double Angulo(double a1,double b1, double c1)
{
double ecuacion2;
double a11 = pow(a1,2);
double b11 = pow(b1,2);
double c11 = pow(c1,1);

double xx=(b11+c11-a11);
double zz=(2*b1*c1);

return Math.acos(xx/zz);
}

}

最佳答案

您的代码片段中的代码中没有任何内容会(直接)导致程序“在没有警告的情况下停止”。

  • 不存在会导致构建失败的语法错误(等等)。 (这与您报告的内容相符。)

  • Math.sqrt 提供“错误”输入不会导致其停止,甚至引发异常。 javadoc 说:“[返回] a 的正平方根。如果参数为 NaN 或小于零,则结果为 NaN。” 即错误的输入会给您一个 NaN 值。

  • 错误的输入不会导致 sqrt 调用之前的算术抛出异常。 JLS 表示(对于浮点 +- 运算符)“[i]如果任一操作数为 NaN,则结果为 NaN。”

因此应用程序停止的直接原因一定是应用程序中的其他地方。

我预计正在发生的情况是,当您的代码的其他部分从此方法获得意外结果(可能是 NaN)时,它会抛出异常...并且您的应用程序正在压缩异常(exception)。

<小时/>

我现在明白了问题所在。

发生的情况是算术和/或对 sqrtpow >> 的调用<<生成 NaN 值。当您使用任何关系运算符测试 NaN 值时,表达式的结果始终为假。因此,这意味着您的代码不会进行任何 println 调用。

您的代码实际上并未停止。相反,它正常完成而不产生任何输出。

计算产生 NaN 值的根本原因是......正如 @duffymo 所指出的......你错误地实现了几何公式。

<小时/>

郑重声明,NaN 值在关系表达式中使用时具有特殊的行为。例如:

    double x = 0.0 / 0.0;  // generate a NaN
System.out.println(0.0 == x);
System.out.println(0.0 != x);
System.out.println(0.0 < x);
System.out.println(0.0 > x);
System.out.println(x == x);
System.out.println(x != x);
System.out.println(x < x);
System.out.println(x > x);

以上所有内容都将打印“false”。是的,全部!

测试 NaN 的唯一方法是使用 Double.isNaN(double)Float.isNaN(float)

关于Java 程序在没有警告的情况下停止工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12335911/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com