PROBLEMA Java-Accesso a variabili determinate in fase di esecuzione

MrPhilGamer

Nuovo Utente
25
5
Ciao a tutti, sto realizzando un progetto in Java che, dati una serie di dati catastali, elabora il tutto e calcola l'ampiezza dello skyline relativa ad un determinato anno. I dati catastali sui quali andare a lavorare vengono importati in una struttura dati di tipo ArrayList (ovviamente in fase di esecuzione): ad ogni posizione corrisponde un record contenente questi dati.
L'operazione di import viene effettuata da un metodo statico che ritorna ArrayList di una classe (Classe 1)diversa da quella in cui si trova il main. Vengono poi importati i comandi e l'operazione di calcolo dell'ampiezza viene eseguita da un metodo statico di un'altra classe ancora. Per esempio:

public static void main{
ArrayList<> lista = Classe1.Importa dati(nomefile);
...metodo per importare i comandi;
}

Il problema è che quando compilo il package il compilatore segnala "cannot fin symbol" alla riga (classe 2, quella che esegue l'operazione) in cui accedo ai singoli dati dell'arraylist per elaborarli. Questo ovviamente perché la variabile lista esiste solo in fase di esecuzione e quindi non può essere "controllata" dal compilatore.

Qualcuno ha dei suggerimenti come ovviare al problema?

Grazie in anticipo
 

BAT

Moderatore
Staff Forum
Utente Èlite
22,668
11,452
CPU
1-Neurone
Dissipatore
Ventaglio
RAM
Scarsa
Net
Segnali di fumo
OS
Windows 10000 BUG
Serve l'errore completo e più codice; invece l'affermazione
la variabile lista esiste solo in fase di esecuzione e quindi non può essere "controllata" dal compilatore
non ha senso in quanto la variabile lista viene creata nella prima riga del main;
più probabilmente l'errore è nelle righe successive
 

DispatchCode

Moderatore
Staff Forum
Utente Èlite
2,208
1,845
CPU
Intel I9-10900KF 3.75GHz 10x 125W
Dissipatore
Gigabyte Aorus Waterforce X360 ARGB
Scheda Madre
Asus 1200 TUF Z590-Plus Gaming ATX DDR4
HDD
1TB NVMe PCI 3.0 x4, 1TB 7200rpm 64MB SATA3
RAM
DDR4 32GB 3600MHz CL18 ARGB
GPU
Nvidia RTX 3080 10GB DDR6
Audio
Integrata 7.1 HD audio
Monitor
LG 34GN850
PSU
Gigabyte P850PM
Case
Phanteks Enthoo Evolv X ARGB
Periferiche
MSI Vigor GK30, mouse Logitech
Net
FTTH Aruba, 1Gb (effettivi: ~950Mb / ~480Mb)
OS
Windows 10 64bit / OpenSUSE Tumbleweed
ListaDati intendi, immagino.
Il compilatore ti sta dicendo che non esiste, non è definita (in effetti in quel contesto non si vede). Dove crei quello che pare essere un'ArrayList? Vedo che compare nel main ma non ne ho capito bene il significato visto che non la utilizzi.
 

BAT

Moderatore
Staff Forum
Utente Èlite
22,668
11,452
CPU
1-Neurone
Dissipatore
Ventaglio
RAM
Scarsa
Net
Segnali di fumo
OS
Windows 10000 BUG
Vedo anche l'istruzione
Record rx = new Record();
ma non vedo la classe Record: dov'è? stai cercando di creare un oggetto di cui non esiste la classe che lo definisce
inoltre non vedo programmazione a oggetti, solo metodi statici... un modo caotico di programmare in Java.
I nomi di metodo devono iniziare per minuscola: importaDati (con la prima "i" minuscola), altrimenti il compilatore compila, ma chi lègge il codice rischia di non capire che si tratta di un metodo (le classi iniziano con la maiuscola).
Ci sono poi piccole "bizzarrie stilistiche" che dovresti correggere:
MAI --> while (b == true && d == true)
BASTA --> while (b && d)
Ad un certo punto vedo un Vector... se non hai bisogno di sincronizzazione puoi tranquillamente sostituirlo con un più efficiente ArrayList
La cosa più importante comunque sono le classi e la loro relazione.
 

MrPhilGamer

Nuovo Utente
25
5
ListaDati intendi, immagino.
Il compilatore ti sta dicendo che non esiste, non è definita (in effetti in quel contesto non si vede). Dove crei quello che pare essere un'ArrayList? Vedo che compare nel main ma non ne ho capito bene il significato visto che non la utilizzi.
L'ArrayList viene creato dal metodo importaDatiCat, ritorna l'array list creato e viene messo in un riferimento ListaDati.

Vedo anche l'istruzione
Record rx = new Record();
ma non vedo la classe Record: dov'è? stai cercando di creare un oggetto di cui non esiste la classe che lo definisce
inoltre non vedo programmazione a oggetti, solo metodi statici... un modo caotico di programmare in Java.
I nomi di metodo devono iniziare per minuscola: importaDati (con la prima "i" minuscola), altrimenti il compilatore compila, ma chi lègge il codice rischia di non capire che si tratta di un metodo (le classi iniziano con la maiuscola).
Ci sono poi piccole "bizzarrie stilistiche" che dovresti correggere:
MAI --> while (b == true && d == true)
BASTA --> while (b && d)
Ad un certo punto vedo un Vector... se non hai bisogno di sincronizzazione puoi tranquillamente sostituirlo con un più efficiente ArrayList
La cosa più importante comunque sono le classi e la loro relazione.
Aggiornato Git. Per le "bizzarrie stilistiche" l'avevo notato anch'io :ok:, ma avrei poi corretto in fasi successive. Per quanto riguarda i metodi di import li devo fare (per natura del progetto) statici: non vengono eseguiti da un oggetto in particolare, come poi quelli per l'ampiezza e l'altezza dello skyline.
 

BAT

Moderatore
Staff Forum
Utente Èlite
22,668
11,452
CPU
1-Neurone
Dissipatore
Ventaglio
RAM
Scarsa
Net
Segnali di fumo
OS
Windows 10000 BUG
L'errore è quello che ti ha segnalato @DispatchCode , ossia non hai definito la variabile ListaDati (che dovresti chiamare listaDati con "L" minuscola) perché nel file Edificio.java ti limiti a dare l'istruzione
int y = ListaDati.size();
ma non hai definito listaDati (PRIMA della precedente istruzione) né esempio come attributo di Edificio né come variabile interna del metodo public static double size(int x)
quello che devi fare è qualcosa simile a
ArrayList<Record> listaDati = new ArrayList<Record>();// nota che uso la minuscola per l'inizio del nome
oppure devi costruirlo con la funzione definita nell'altro file (Dati.java) dove il metodo costruisce l'ArrayList, qualcosa come
ArrayList<Record> listaDati =Dati.ImportaDatiCat(inserireQuiStringaNome);
 
Ultima modifica:

Entra

oppure Accedi utilizzando
Discord Ufficiale Entra ora!