Java BigDecimal导致NumberFormatException
我正在开发一个金融应用程序,我必须使用BigDecimal计算货币。现在我正在尝试进行一个入口活动,在SharedReferences中搜索以前的注册,如果他们是一个,则开始另一个活动,如果没有,它将启动注册活动。问题是注册活动导致NumberFormatException错误,而我正在尝试构造一个新的时间利润对象(利润类包含BigDecimal字段)。此外,我不太确定我是否正确使用了SharedReferences。我不太确定我的想法和编码是否正确,因为我是android开发的新手,我一直在解决这个问题,所以我给你所有的课程 登记活动:Java BigDecimal导致NumberFormatException,java,android,currency,bigdecimal,numberformatexception,Java,Android,Currency,Bigdecimal,Numberformatexception,我正在开发一个金融应用程序,我必须使用BigDecimal计算货币。现在我正在尝试进行一个入口活动,在SharedReferences中搜索以前的注册,如果他们是一个,则开始另一个活动,如果没有,它将启动注册活动。问题是注册活动导致NumberFormatException错误,而我正在尝试构造一个新的时间利润对象(利润类包含BigDecimal字段)。此外,我不太确定我是否正确使用了SharedReferences。我不太确定我的想法和编码是否正确,因为我是android开发的新手,我一直在解
public class Registration extends Activity {
private static String enteredPassword;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
final EditText password1 = (EditText) findViewById(R.id.password1);
final EditText password2 = (EditText) findViewById(R.id.password2);
final EditText availability = (EditText) findViewById(R.id.availability);
EditText profitEditText = (EditText) findViewById(R.id.profit);
Spinner spinner = (Spinner) findViewById(R.id.period_spinner);
Button registrationButton = (Button) findViewById(R.id.registrationButton);
DatePicker picker = (DatePicker) findViewById(R.id.thePicker);
ArrayAdapter<CharSequence> adapter = ArrayAdapter.createFromResource(this,
R.array.periods_array, android.R.layout.simple_spinner_item);
adapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
spinner.setAdapter(adapter);
final String balance = availability.getText().toString().replace(",",".");
String profitPeriod = ((Period) spinner.getSelectedItem()).name();
final Profit profit = new Profit("regular_profit", profitEditText.getText().toString(),
profitPeriod ,picker);
registrationButton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
if (password1.getText().toString().equals(password2.getText().toString())) {
enteredPassword = password1.getText().toString();
Repository.setPassword(enteredPassword, mContext);
}
Repository.setBalance(balance, mContext);
Repository.setProfit(profit, mContext);
}
});
}
}
入学活动
public class EnterActivity extends Activity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_enter);
CountDownTimer timer = new CountDownTimer(3000, 100) {
public void onTick(long millisUntilFinished) {
}
public void onFinish() {
if(Repository.getPassword(mContext.getApplicationContext()).equals("No Value")){
Intent registrationIntent = new Intent(mContext, Registration.class);
startActivity(registrationIntent);
}
else{
Intent configurationIntent = new Intent(mContext, Configuration.class);
startActivity(configurationIntent);
}
}
}.start();
}
}
存储库
public class Repository {
public static SharedPreferences sharedPreferences;
private static SharedPreferences getPrefs(Context context) {
return context.getSharedPreferences(PREF_NAME, Context.MODE_PRIVATE);
}
public static String getPassword(Context context){
return getPrefs(context).getString(PASSWORD,"No Value");
}
public Repository() {
}
public static void setPassword(String password, Context context){
SharedPreferences.Editor editor = getPrefs(context).edit();
editor.putString(PASSWORD, password);
editor.commit();
}
public static void setBalance(String balance, Context context){
SharedPreferences.Editor editor = getPrefs(context).edit();
editor.putString(BALANCE, balance);
editor.commit();
}
public static void setProfit(Profit profit, Context context){
SharedPreferences.Editor editor = getPrefs(context).edit();
editor.putString(BALANCE, profit.getValue().toString());
editor.commit();
}
}
输出
E/AndroidRuntime: FATAL EXCEPTION: main
E/AndroidRuntime: java.lang.RuntimeException: Unable to start activity ComponentInfo{/.Registration}: java.lang.NumberFormatException: Bad offset/length: offset=0 len=0 in.length=0
E/AndroidRuntime: at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1956)
E/AndroidRuntime: at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:1981)
E/AndroidRuntime: at android.app.ActivityThread.access$600(ActivityThread.java:123)
E/AndroidRuntime: at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1147)
E/AndroidRuntime: at android.os.Handler.dispatchMessage(Handler.java:99)
E/AndroidRuntime: at android.os.Looper.loop(Looper.java:137)
E/AndroidRuntime: at android.app.ActivityThread.main(ActivityThread.java:4424)
E/AndroidRuntime: at java.lang.reflect.Method.invokeNative(Native Method)
E/AndroidRuntime: at java.lang.reflect.Method.invoke(Method.java:511)
E/AndroidRuntime: at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:784)
E/AndroidRuntime: at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:551)
E/AndroidRuntime: at dalvik.system.NativeStart.main(Native Method)
E/AndroidRuntime: Caused by: java.lang.NumberFormatException: Bad offset/length: offset=0 len=0 in.length=0
E/AndroidRuntime: at java.math.BigDecimal.<init>(BigDecimal.java:282)
E/AndroidRuntime: at java.math.BigDecimal.<init>(BigDecimal.java:438)
E/AndroidRuntime: at .Profit.<init>(Profit.java:41)
E/AndroidRuntime: at .Registration.onCreate(Registration.java:57)
E/AndroidRuntime: at android.app.Activity.performCreate(Activity.java:4466)
E/AndroidRuntime: at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1049)
E/AndroidRuntime: at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1920)
E/AndroidRuntime: at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:1981)
E/AndroidRuntime: at android.app.ActivityThread.access$600(ActivityThread.java:123)
E/AndroidRuntime: at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1147)
E/AndroidRuntime: at android.os.Handler.dispatchMessage(Handler.java:99)
E/AndroidRuntime: at android.os.Looper.loop(Looper.java:137)
E/AndroidRuntime: at android.app.ActivityThread.main(ActivityThread.java:4424)
E/AndroidRuntime: at java.lang.reflect.Method.invokeNative(Native Method)
E/AndroidRuntime: at java.lang.reflect.Method.invoke(Method.java:511)
E/AndroidRuntime: at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:784)
E/AndroidRuntime: at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:551)
E/AndroidRuntime: at dalvik.system.NativeStart.main(Native Method)
E/AndroidRuntime:致命异常:主
E/AndroidRuntime:java.lang.RuntimeException:无法启动活动ComponentInfo{/.Registration}:java.lang.NumberFormatException:错误偏移量/长度:偏移量=0 len=0 in.长度=0
E/AndroidRuntime:at-android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1956)
E/AndroidRuntime:at-android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:1981)
E/AndroidRuntime:android.app.ActivityThread.access$600(ActivityThread.java:123)
E/AndroidRuntime:at-android.app.ActivityThread$H.handleMessage(ActivityThread.java:1147)
E/AndroidRuntime:at-android.os.Handler.dispatchMessage(Handler.java:99)
E/AndroidRuntime:at-android.os.Looper.loop(Looper.java:137)
E/AndroidRuntime:at-android.app.ActivityThread.main(ActivityThread.java:4424)
E/AndroidRuntime:at java.lang.reflect.Method.Invokenactive(本机方法)
E/AndroidRuntime:at java.lang.reflect.Method.invoke(Method.java:511)
E/AndroidRuntime:com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:784)
E/AndroidRuntime:com.android.internal.os.ZygoteInit.main(ZygoteInit.java:551)
E/AndroidRuntime:at dalvik.system.NativeStart.main(本机方法)
E/AndroidRuntime:由以下原因引起:java.lang.NumberFormatException:错误偏移量/长度:偏移量=0 len=0 in.长度=0
E/AndroidRuntime:at java.math.BigDecimal.(BigDecimal.java:282)
E/AndroidRuntime:at java.math.BigDecimal.(BigDecimal.java:438)
E/AndroidRuntime:at.Profit.(Profit.java:41)
E/AndroidRuntime:at.Registration.onCreate(Registration.java:57)
E/AndroidRuntime:at-android.app.Activity.performCreate(Activity.java:4466)
E/AndroidRuntime:at-android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1049)
E/AndroidRuntime:at-android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1920)
E/AndroidRuntime:at-android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:1981)
E/AndroidRuntime:android.app.ActivityThread.access$600(ActivityThread.java:123)
E/AndroidRuntime:at-android.app.ActivityThread$H.handleMessage(ActivityThread.java:1147)
E/AndroidRuntime:at-android.os.Handler.dispatchMessage(Handler.java:99)
E/AndroidRuntime:at-android.os.Looper.loop(Looper.java:137)
E/AndroidRuntime:at-android.app.ActivityThread.main(ActivityThread.java:4424)
E/AndroidRuntime:at java.lang.reflect.Method.Invokenactive(本机方法)
E/AndroidRuntime:at java.lang.reflect.Method.invoke(Method.java:511)
E/AndroidRuntime:com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:784)
E/AndroidRuntime:com.android.internal.os.ZygoteInit.main(ZygoteInit.java:551)
E/AndroidRuntime:at dalvik.system.NativeStart.main(本机方法)
您没有正确地将字符串解析为大小数
在您的利润承包商中:
if(value!=null)
{
this.value = new BigDecimal(value);
}
else
{
this.value = new BigDecimal("0.0");
}
需要将字符串解析为BigDecimal。如下所示,此.value
为BigDecimal类型:
this.value = (BigDecimal) decimalFormat.parse(value);
还要记住,decimalFormat.parse
可以引发ParseException
。您将需要使用try/catch或throw来处理它。您只在代码中的一个位置实例化了一个利润:
Profit profit = new Profit("regular_profit", profitEditText.getText().toString(),
profitPeriod, picker);
如果这导致出现NumberFormatException
异常,则它必须来自profice
构造函数中的此代码:
if(value!=null){this.value = new BigDecimal(value);}else{ this.value = new BigDecimal("0.0");};
由于值
字符串将来自对对象调用toString()
,因此您可以依赖它不为null
(无论如何,如果它为null
,那么您将以新的BigDecimal(“0.0”)
结束,您可以自己验证它是否正常工作)。这使得我们将新的BigDecimal(value)
作为罪魁祸首。提供参数字符串的预期格式的详细信息。如果参数不符合该格式,则将抛出NumberFormatException
在您描述的场景中,您可能会想到的更可能是格式错误的字符串中有一个空字符串,它与Java中的null
不同。鉴于文本来自UI字段,您还必须注意有趣且难以发现的异常,例如前导和尾随空格
也许最好这样写构造函数的受影响部分:
if (value != null) {
value = value.trim();
this.value = value.length() == 0 ? BigDecimal.ZERO : new BigDecimal(value);
} else {
this.value = BigDecimal.ZERO;
}
请注意,即使进行了此更改,在发生其他类型的异常时,此构造函数仍将抛出NumberFormatException
。如果您不确定数据的有效性,则应准备好处理此类异常。欢迎使用堆栈溢出。在我们帮助您之前,我们需要您对您的问题进行更多的研究。您尚未显示堆栈跟踪,但已显示
if (value != null) {
value = value.trim();
this.value = value.length() == 0 ? BigDecimal.ZERO : new BigDecimal(value);
} else {
this.value = BigDecimal.ZERO;
}