Errore di inizializzazione Java


double pullPrice(String input){
        if(input.length() < 3){
            System.out.println("Error: 02; invalid item input, valid example: enter code here'milk 8.50'");
            System.exit(0);
        }
        char[] inputArray = input.toCharArray();
        char[] itemPriceArray;
        double price;
        boolean numVal = false;
        int numCount = 0;
        for(int i = 0; i <= inputArray.length-1; i ++){
            //checking if i need to add char to char array of price
            if(numVal == true){
                //adding number to price array
                itemPriceArray[numCount] = inputArray[i];
                numCount++;
            }
            else{
                if(inputArray[i] == ' '){
                    numVal = true;
                    //initializing price array
                    itemPriceArray = new char[inputArray.length - i];
                }
                else{

                }
            }


        }
        price = Double.parseDouble(String.valueOf(itemPriceArray));
        return price;
    }

Problema: tentativo di estrarre la sequenza di caratteri dopo lo spazio bianco tra 'milk 8.50' come input. L'errore di inizializzazione si verifica perché sto inizializzando l'array di caratteri all'interno di un'istruzione if else che inizializzerà l'array se trova spazi bianchi.

Domanda: dal momento che non conosco il mio numero di conteggio dei caratteri finché non trovo uno spazio bianco c'è un altro modo in cui posso inizializzare? Il compilatore non si fida di me che inizializzerò prima di chiamare array.

Inoltre, se mi manca qualcosa o ci sono modi migliori per codificare tutto questo per favore fatemelo sapere. Sono in una classe di strutture dati java e sto imparando strutture dati fondamentali, ma vorrei anche concentrarmi sull'efficienza e sulla modularità allo stesso tempo. Ho anche una funzione pullPrice che fa la stessa cosa ma tira il nome dell'elemento. Mi piacerebbe combinarli in modo da non dover riutilizzare lo stesso codice per entrambi, ma posso restituire solo elementi con lo stesso tipo di dati a meno che non crei una classe. Purtroppo questo esercizio è quello di utilizzare due array dal momento che stiamo praticando come utilizzare borse ADT. Qualsiasi aiuto è molto apprezzato?

Author: user3238382, 2017-09-11

4 answers

Prova qualcosa del genere:

double pullPrice(String input)
{
   try
   {
      // Instantiate a new scanner object, based on the input string
      Scanner scanner = new Scanner(input);
      // We skip the product (EG "milk")
      String prod = scanner.next();
      // and read the price(EG 8.5)
      double price = scanner.nextDouble();
      // We should close the scanner, to free resources...
      scanner.close();
      return price;
   }
   catch (NoSuchElementException ex)
   {
      System.out.println("Error: 02; invalid item input, valid example: enter code here 'milk 8.50'");
      System.exit(0);
   }

}
 2
Author: Usagi Miyamoto, 2017-09-10 21:58:14

Se sei sicuro che il programma otterrà solo i dati di input corretti, inizializza semplicemente l'array con null:

char[] itemPriceArray = null;

Il problema principale per cui il compilatore si lamenta: cosa succede se il tuo programma accede a variabili non inizializzate (ad esempio con dati di input errati)? Il compilatore Java impedisce completamente questo tipo di situazioni.

 0
Author: algrid, 2017-09-10 21:59:07

Aggiungerò alle altre risposte, poiché non è possibile modificare la dimensione di un array una volta creato. Devi assegnarlo più grande di quanto pensi di aver bisogno o accettare il sovraccarico di dover riallocare che deve crescere di dimensioni. Quando lo fa dovrai allocarne uno nuovo e copiare i dati dal vecchio al nuovo:

int oldItems[] = new int[10];
for (int i=0; i<10; i++) {
  oldItems[i] = i+10;
}
int newItems[] = new int[20];
System.arraycopy(oldItems, 0, newItems, 0, 10);
oldItems = newItems;
 0
Author: , 2017-09-10 22:06:01
char[] itemPriceArray = new char[inputArray.length];
 0
Author: M.Fneish, 2017-09-11 08:33:28