簡體   English   中英

在Java數組中設置布爾值

[英]Setting Boolean Values in Java Array

這是我非常精簡的版本,僅包含布爾值和其周圍的結構:

public int payoffDebt(Double totalDebt) {

    boolean booIsPaid[] = new boolean[c.getCount()];
    int bb = 0; 
    int bbb = 0;


    for (c.moveToFirst(); !c.isAfterLast(); c.moveToNext()) {
        booIsPaid[bb++] = false;
    }

    while (totalDebt > 0) {

        for (int i : rowCounter) { 

            if ((indBal[p] <= 0) && (booIsPaid[bbb] == false)) {
                booIsPaid[bbb++] = true;
            } 


        }

    }
    return monthTotal;
}

這就是我要嘗試做的事情,一開始,我遍歷用戶“債務”並為每個名為booIsPaid的布爾值分配一個布爾值。 將它們設置為false可以正常工作。 但是,在下面,我認為我沒有正確地遍歷它們,因為在我的Android應用程序中,我在調用此方法的Activity中得到了Window Leaking LogCat。 我注釋掉了將其設置為true並且一切運行良好。 有人可以看到哪里不對嗎?

編輯:Stacktrace:

12-02 21:14:35.121: E/AndroidRuntime(8832): FATAL EXCEPTION: AsyncTask #1
12-02 21:14:35.121: E/AndroidRuntime(8832): java.lang.RuntimeException: An error occured while executing doInBackground()
12-02 21:14:35.121: E/AndroidRuntime(8832):     at android.os.AsyncTask$3.done(AsyncTask.java:299)
12-02 21:14:35.121: E/AndroidRuntime(8832):     at java.util.concurrent.FutureTask$Sync.innerSetException(FutureTask.java:273)
12-02 21:14:35.121: E/AndroidRuntime(8832):     at java.util.concurrent.FutureTask.setException(FutureTask.java:124)
12-02 21:14:35.121: E/AndroidRuntime(8832):     at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:307)
12-02 21:14:35.121: E/AndroidRuntime(8832):     at java.util.concurrent.FutureTask.run(FutureTask.java:137)
12-02 21:14:35.121: E/AndroidRuntime(8832):     at android.os.AsyncTask$SerialExecutor$1.run(AsyncTask.java:230)
12-02 21:14:35.121: E/AndroidRuntime(8832):     at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1076)
12-02 21:14:35.121: E/AndroidRuntime(8832):     at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:569)
12-02 21:14:35.121: E/AndroidRuntime(8832):     at java.lang.Thread.run(Thread.java:856)
12-02 21:14:35.121: E/AndroidRuntime(8832): Caused by: java.lang.ArrayIndexOutOfBoundsException: length=4; index=4
12-02 21:14:35.121: E/AndroidRuntime(8832):     at com.---.---.DebtDataSource.payoffDebt(DebtDataSource.java:290)
12-02 21:14:35.121: E/AndroidRuntime(8832):     at com.---.---.Planner$PlannerTask.doInBackground(Planner.java:73)
12-02 21:14:35.121: E/AndroidRuntime(8832):     at com.---.---.Planner$PlannerTask.doInBackground(Planner.java:1)
12-02 21:14:35.121: E/AndroidRuntime(8832):     at android.os.AsyncTask$2.call(AsyncTask.java:287)
12-02 21:14:35.121: E/AndroidRuntime(8832):     at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:305)
12-02 21:14:35.121: E/AndroidRuntime(8832):     ... 5 more
12-02 21:14:35.128: W/ActivityManager(291):   Force finishing activity com.---.---/.Planner
12-02 21:14:35.175: W/ActivityManager(291):   Force finishing activity com.---.---/.ManageDebts
12-02 21:14:35.285: W/ActivityManager(291): Duplicate finish request for ActivityRecord{41e0b390 com.---.---/.Planner}
12-02 21:14:35.496: I/ActivityManager(291): Displayed com.---.---/.Planner: +557ms
12-02 21:14:35.605: E/WindowManager(8832): Activity com.---.---.Planner has leaked window com.android.internal.policy.impl.PhoneWindow$DecorView@4175e930 that was originally added here
12-02 21:14:35.605: E/WindowManager(8832): android.view.WindowLeaked: Activity com.---.---.Planner has leaked window com.android.internal.policy.impl.PhoneWindow$DecorView@4175e930 that was originally added here
12-02 21:14:35.605: E/WindowManager(8832):  at android.view.ViewRootImpl.<init>(ViewRootImpl.java:374)
12-02 21:14:35.605: E/WindowManager(8832):  at android.view.WindowManagerImpl.addView(WindowManagerImpl.java:292)
12-02 21:14:35.605: E/WindowManager(8832):  at android.view.WindowManagerImpl.addView(WindowManagerImpl.java:224)
12-02 21:14:35.605: E/WindowManager(8832):  at android.view.WindowManagerImpl$CompatModeWrapper.addView(WindowManagerImpl.java:149)
12-02 21:14:35.605: E/WindowManager(8832):  at android.view.Window$LocalWindowManager.addView(Window.java:547)
12-02 21:14:35.605: E/WindowManager(8832):  at android.app.Dialog.show(Dialog.java:277)
12-02 21:14:35.605: E/WindowManager(8832):  at com.---.---.Planner$PlannerTask.onPreExecute(Planner.java:56)
12-02 21:14:35.605: E/WindowManager(8832):  at android.os.AsyncTask.executeOnExecutor(AsyncTask.java:586)
12-02 21:14:35.605: E/WindowManager(8832):  at android.os.AsyncTask.execute(AsyncTask.java:534)
12-02 21:14:35.605: E/WindowManager(8832):  at com.---.---.Planner.onCreate(Planner.java:36)
12-02 21:14:35.605: E/WindowManager(8832):  at android.app.Activity.performCreate(Activity.java:5008)
12-02 21:14:35.605: E/WindowManager(8832):  at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1079)
12-02 21:14:35.605: E/WindowManager(8832):  at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2023)
12-02 21:14:35.605: E/WindowManager(8832):  at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2084)
12-02 21:14:35.605: E/WindowManager(8832):  at android.app.ActivityThread.access$600(ActivityThread.java:130)
12-02 21:14:35.605: E/WindowManager(8832):  at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1195)
12-02 21:14:35.605: E/WindowManager(8832):  at android.os.Handler.dispatchMessage(Handler.java:99)
12-02 21:14:35.605: E/WindowManager(8832):  at android.os.Looper.loop(Looper.java:137)
12-02 21:14:35.605: E/WindowManager(8832):  at android.app.ActivityThread.main(ActivityThread.java:4745)
12-02 21:14:35.605: E/WindowManager(8832):  at java.lang.reflect.Method.invokeNative(Native Method)
12-02 21:14:35.605: E/WindowManager(8832):  at java.lang.reflect.Method.invoke(Method.java:511)
12-02 21:14:35.605: E/WindowManager(8832):  at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:786)
12-02 21:14:35.605: E/WindowManager(8832):  at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:553)
12-02 21:14:35.605: E/WindowManager(8832):  at dalvik.system.NativeStart.main(Native Method)

編輯:我重做了一切,這是我的新方法:

while (totalDebt > 0) {

booIsPaid = false;
remainingBalance = 0;

// Increment month
monthTotal = monthTotal + 1;

// update INDIVIDUAL debt Here
for (int i : rowCounter) { 

nameList.add(indName[r++]);

// Zero Balance, set Boolean true, add to Remainder     
if ((indBal[p] <= 0) && !booIsPaid) { 
        booIsPaid = true;
        remainingbalance = remainingbalance + indPay[q];
        indPay[q] = 0;
        indBal[p] = 0;
        payList.add(Double.valueOf(IndPay));
    // First balance after zero; set Boolean false, add to remainder to payment.
    } else if  ((indBal[p] > 0) && booIsPaid) { 
       booIsPaid = false;       
       indPay[q] = indPay[q] + remainingbalance;
        indPay[q] = Math.round(indPay[q] * 100.00) / 100.00;
        IndPay = myFormat.format(indPay[q]);
        payList.add(Double.valueOf(IndPay));

 // Other remaining balances
    } else if  ((indBal[p] > 0) && !booIsPaid) {        indPay[q] = 0;
        indPay[q] = Math.round(indPay[q] * 100.00) / 100.00;
        IndPay = myFormat.format(indPay[q]);
        payList.add(Double.valueOf(IndPay));
    }

// indPay[q] (should or should not include remainder here!
    indBal[p] = indBal[p] - (indPay[q] - interestFee);
    totalDebt = totalDebt - (indPay[q++] - interestFee);

    IndBal = myFormat.format(indBal[p++]);
    indBalList.add(Double.valueOf(IndBal));
    feeList.add(Double.valueOf(InterestFee));
}
}

注意:輸出存儲在此處的四個ArrayList中,將按月打印給用戶。

整個實際應用也提出了還債策略。 我尚未對此進行測試,並將向您舉報。 任何反饋? 讓我知道!

這是你的問題:

Caused by: java.lang.ArrayIndexOutOfBoundsException: length=4; index=4
at com.---.---.DebtDataSource.payoffDebt(DebtDataSource.java:290)

您正在嘗試訪問數組范圍之外的索引。 請查閱ArrayIndexOutOfBoundsException文檔。

您可以張貼以下特定行代碼:

DebtDataSource.payoffDebt(DebtDataSource.java:290)

您需要檢查變量bbb是否在數組的邊界內。 我認為這是問題所在,請嘗試將代碼更改為此:

if ((indBal[p] <= 0) && (booIsPaid[bbb] == false) && (bbb <= booIsPaid.length)){
      booIsPaid[bbb++] = true;
} 

我還將建議您在循環代碼的某個點將bbb的值重新設置為零。

希望能幫助到你!

以下是一些問題/觀察:

  1. 不需要第一個循環,因為boolean []已被初始化為false

  2. 不需要與false進行boolean比較,因為您可以簡單地編寫if ((indBal[p] <= 0) && !booIsPaid[bbb]) {

  3. 在while循環中不檢查數組長度( 這會導致問題 )。 如下添加:

     while (totalDebt > 0 && bbb <booIsPaid.length) { for (int i : rowCounter) { if (indBal[p] <= 0 && !booIsPaid[bbb] && bbb <booIsPaid.length) { booIsPaid[bbb++] = true; } } } 

首先,您不必將布爾數組中的每個值都設置為false 默認情況下以這種方式設置它們。

其次,您的循環確實有點懷疑。 以下將解決您得到的AIOOBException。

while (totalDebt > 0) {
    for (int i : rowCounter) { 
        if (indBal[p] <= 0 && !booIsPaid[bbb]) {
            booIsPaid[bbb++] = true;
        } 
    }
    bbb = 0;
}
return monthTotal;

原因:在while for迭代時, bbb增長。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM