Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/311.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java BigDecimal导致NumberFormatException_Java_Android_Currency_Bigdecimal_Numberformatexception - Fatal编程技术网

Java BigDecimal导致NumberFormatException

Java BigDecimal导致NumberFormatException,java,android,currency,bigdecimal,numberformatexception,Java,Android,Currency,Bigdecimal,Numberformatexception,我正在开发一个金融应用程序,我必须使用BigDecimal计算货币。现在我正在尝试进行一个入口活动,在SharedReferences中搜索以前的注册,如果他们是一个,则开始另一个活动,如果没有,它将启动注册活动。问题是注册活动导致NumberFormatException错误,而我正在尝试构造一个新的时间利润对象(利润类包含BigDecimal字段)。此外,我不太确定我是否正确使用了SharedReferences。我不太确定我的想法和编码是否正确,因为我是android开发的新手,我一直在解

我正在开发一个金融应用程序,我必须使用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;
}