0^2 或 sqrt(0) 应用程序崩溃
0^2 or sqrt(0) Crashing App
我正在尝试制作一个应用程序来计算线段的距离,但是当距离应该为 0 时,应用程序崩溃了。我假设它与尝试平方或平方根 0 有关,但我可能是错的。有什么问题,我该如何解决?
我的代码:
package com.jenglanddev.quikformcalclite;
import java.math.BigDecimal;
import android.app.Activity;
import android.os.Bundle;
import android.view.View;
import android.view.Window;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.EditText;
import android.widget.TextView;
public class Distance extends Activity implements OnClickListener {
EditText x1, y1, x2, y2;
Button calc;
TextView dist1, dist2;
String X1, Y1, X2, Y2;
@Override
protected void onCreate(Bundle savedInstanceState) {
// TODO Auto-generated method stub
super.onCreate(savedInstanceState);
requestWindowFeature(Window.FEATURE_NO_TITLE);
setContentView(R.layout.distance);
x1 = (EditText) findViewById(R.id.distance_x1);
y1 = (EditText) findViewById(R.id.distance_y1);
x2 = (EditText) findViewById(R.id.distance_x2);
y2 = (EditText) findViewById(R.id.distance_y2);
calc = (Button) findViewById(R.id.distance_calc);
dist1 = (TextView) findViewById(R.id.distance_distance1);
dist2 = (TextView) findViewById(R.id.distance_distance2);
calc.setOnClickListener(this);
}
@Override
public void onClick(View v) {
// TODO Auto-generated method stub
BigDecimal f;
X1 = x1.getText().toString();
if (X1.contentEquals("")) {
X1 = "0";
}
Y1 = y1.getText().toString();
if (Y1.contentEquals("")) {
Y1 = "0";
}
X2 = x2.getText().toString();
if (X2.contentEquals("")) {
X2 = "0";
}
Y2 = y2.getText().toString();
if (Y2.contentEquals("")) {
Y2 = "0";
}
BigDecimal x1 = new BigDecimal(X1);
BigDecimal y1 = new BigDecimal(Y1);
BigDecimal x2 = new BigDecimal(X2);
BigDecimal y2 = new BigDecimal(Y2);
BigDecimal a = x2.subtract(x1);
BigDecimal b = y2.subtract(y1);
BigDecimal c = a.multiply(a);
BigDecimal d = b.multiply(b);
BigDecimal e = c.add(d);
f = sqrt(e);
dist1.setText("Distance = The Square Root Of " + e + " Units");
dist2.setText("Distance = " + f + " Units");
}
public static BigDecimal sqrt(BigDecimal value) {
BigDecimal x = new BigDecimal(Math.sqrt(value.doubleValue()));
return x.add(new BigDecimal(value.subtract(x.multiply(x)).doubleValue()
/ (x.doubleValue() * 2.0)));
}
}
当距离是任何其他数字而不是 0 时,这可以正常工作。
问题不在于 sqrt,而是你除以零。
当值为零时,x 将为零,并且您除以 x * 2.0。
当值为零时,只需对 return 零添加一个检查。
if(value.compareTo(BigDecimal.ZERO) == 0)
return BigDecimal.ZERO;
我正在尝试制作一个应用程序来计算线段的距离,但是当距离应该为 0 时,应用程序崩溃了。我假设它与尝试平方或平方根 0 有关,但我可能是错的。有什么问题,我该如何解决?
我的代码:
package com.jenglanddev.quikformcalclite;
import java.math.BigDecimal;
import android.app.Activity;
import android.os.Bundle;
import android.view.View;
import android.view.Window;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.EditText;
import android.widget.TextView;
public class Distance extends Activity implements OnClickListener {
EditText x1, y1, x2, y2;
Button calc;
TextView dist1, dist2;
String X1, Y1, X2, Y2;
@Override
protected void onCreate(Bundle savedInstanceState) {
// TODO Auto-generated method stub
super.onCreate(savedInstanceState);
requestWindowFeature(Window.FEATURE_NO_TITLE);
setContentView(R.layout.distance);
x1 = (EditText) findViewById(R.id.distance_x1);
y1 = (EditText) findViewById(R.id.distance_y1);
x2 = (EditText) findViewById(R.id.distance_x2);
y2 = (EditText) findViewById(R.id.distance_y2);
calc = (Button) findViewById(R.id.distance_calc);
dist1 = (TextView) findViewById(R.id.distance_distance1);
dist2 = (TextView) findViewById(R.id.distance_distance2);
calc.setOnClickListener(this);
}
@Override
public void onClick(View v) {
// TODO Auto-generated method stub
BigDecimal f;
X1 = x1.getText().toString();
if (X1.contentEquals("")) {
X1 = "0";
}
Y1 = y1.getText().toString();
if (Y1.contentEquals("")) {
Y1 = "0";
}
X2 = x2.getText().toString();
if (X2.contentEquals("")) {
X2 = "0";
}
Y2 = y2.getText().toString();
if (Y2.contentEquals("")) {
Y2 = "0";
}
BigDecimal x1 = new BigDecimal(X1);
BigDecimal y1 = new BigDecimal(Y1);
BigDecimal x2 = new BigDecimal(X2);
BigDecimal y2 = new BigDecimal(Y2);
BigDecimal a = x2.subtract(x1);
BigDecimal b = y2.subtract(y1);
BigDecimal c = a.multiply(a);
BigDecimal d = b.multiply(b);
BigDecimal e = c.add(d);
f = sqrt(e);
dist1.setText("Distance = The Square Root Of " + e + " Units");
dist2.setText("Distance = " + f + " Units");
}
public static BigDecimal sqrt(BigDecimal value) {
BigDecimal x = new BigDecimal(Math.sqrt(value.doubleValue()));
return x.add(new BigDecimal(value.subtract(x.multiply(x)).doubleValue()
/ (x.doubleValue() * 2.0)));
}
}
当距离是任何其他数字而不是 0 时,这可以正常工作。
问题不在于 sqrt,而是你除以零。
当值为零时,x 将为零,并且您除以 x * 2.0。
当值为零时,只需对 return 零添加一个检查。
if(value.compareTo(BigDecimal.ZERO) == 0)
return BigDecimal.ZERO;