簡體   English   中英

java.lang.ArrayIndexOutOfBoundsException:在二進制搜索中,長度為 7 的索引 -1 越界

[英]java.lang.ArrayIndexOutOfBoundsException: Index -1 out of bounds for length 7 on a binary search

我必須編寫一個程序來通過輸入“Prezzo”值來搜索“Nomi”的通訊員,但是當我進行二分搜索時,出現錯誤:

java.lang.ArrayIndexOutOfBoundsException:在二進制搜索中,長度為 7 的索引 -1 越界

這是代碼:

import java.io.*;

public class Blackfriday {
    public static int ricercaBinaria(Double prezzi[], Double chiave) {
        int inf = 0, sup = prezzi.length - 1;
        while (inf <= sup) {
            int med = (inf + sup) / 2;
            if (prezzi[med] == chiave)
                return med;
            if (prezzi[med] < chiave)
                inf = med + 1;
            else
                sup = med - 1;
        }
        return -1;
    }

    public static void main(String args[]) {
        try {
            InputStreamReader isr;
            BufferedReader br;
            double cerca;
            isr = new InputStreamReader(System.in);// abilitato la lettura da tastiera
            br = new BufferedReader(isr);// abilitato la lettura un rigo per volta
            String nomi[] = { "picones", "vinile di Speranza", "Laurea", "King Mufasa", "Pentium Gold",
                    "Aethey Wind breaker ORO", "HeelCompletoSpaic1we" };
            Double prezzi[] = { 2.0, 13.50, 23.0, 99.50, 120.0, 75.20, 999.99 };
            System.out.println("Quanto vuoi spendere?");
            String xStringa = br.readLine();// ricevo la digitazione in String
            cerca = Double.parseDouble(xStringa);// Trasformo la String in double
            System.out.println("Puoi comprare: " + nomi[ricercaBinaria(prezzi, cerca)]);

        } catch (Exception e) {
            System.out.println(e);
        }
    }
}

您的代碼至少有兩個問題。

  1. ricercaBinaria一個前提是底層數據數組是有序的。 您在測試中使用了無序數據
  2. ricercaBinaria將返回給定參數 ( Double ) 在您的數組中所在的索引。 如果未找到,則返回-1 因此,在將其用作索引數組之前,您需要檢查返回的索引以驗證它確實為正值 - 否則該方法將失敗並出現您看到的異常
  3. 當心雙重平等,但那是另一個問題。

這是一個功能代碼:

  1. 在異常捕獲的情況下始終顯示堆棧跟蹤,這將有助於調試
  2. 如果您管理對象“Double”並嘗試將它們與 == 進行比較,它將比較它們的引用(內存中的地址)而不是它們內部包含的值。 所以使用簡單類型的 double OR 比較對象與 equals() 方法。
public class Blackfriday {
    public static int ricercaBinaria(double prezzi[], Double chiave) {
        int inf = 0, sup = prezzi.length - 1;
        while (inf <= sup) {
            int med = (inf + sup) / 2;
            if (prezzi[med] == chiave)
                return med;
            if (prezzi[med] < chiave)
                inf = med + 1;
            else
                sup = med - 1;
        }
        return -1;
    }

    public static void main(String args[]) {
        try {
            InputStreamReader isr;
            BufferedReader br;
            double cerca;
            isr = new InputStreamReader(System.in);//abilitato la lettura da tastiera
            br = new BufferedReader(isr);//abilitato la lettura un rigo per volta
            String nomi[] = {"picones", "vinile di Speranza", "Laurea", "King Mufasa", "Pentium Gold", "Aethey Wind breaker ORO", "HeelCompletoSpaic1we"};
            double prezzi[] = {2.0, 13.50, 23.0, 99.50, 120.0, 75.20, 999.99};
            System.out.println("Quanto vuoi spendere?");
            String xStringa = br.readLine();//ricevo la digitazione in String
            cerca = Double.parseDouble(xStringa);//Trasformo la String in double
            System.out.println("Puoi comprare: " + nomi[ricercaBinaria(prezzi, cerca)]);


        } catch (Exception e) {
            e.printStackTrace();
        }
    }//main
}//classe

暫無
暫無

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

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