Salve a tutti,
sto scrivendo un programma in java che gestisce dei titoli azionari.
Ad un certo punto nell'esecuzione del programma trovo una null pointer exception di cui non riesco a liberarmi, mi sembra di aver inizializzato e riempito tutto ciò che serve ma evidentemente mi sono persa qualcosa. Posto la parte della classe principale che mi dà errori e le classi ad essa legate che servono nel metodo in questione.
La quinta riga nel metodo addAsk della classe StockExchange è quella che mi genera la nullPointerException, la riposto qui :
if(users.get(userId).getWallet().getTitoliAcquistati().get(t)<quantity) throw new WalletException();
Da quello che sono riuscita a capire titoliAcquistati non viene riempito ma non riesco proprio a capire il perchè.
Grazie mille a chiunque tenterà di darmi una mano.
Questa è la classe principale:
public class StockExchange {
private int numTitoli;
private int numUsers;
Map<String,Titolo> titoli;
Map<Integer,User> users;
public StockExchange() {
numTitoli=0;
numUsers=0;
titoli= new HashMap<>();
users= new HashMap<>();
}
public int defineStocks(String... stocks) {
numTitoli=0;
for(String s:stocks) {
String[] st = s.split("[: ]+");
if(!st[0].equals("")) {
if(!titoli.containsKey(st[0])){
Titolo t = new Titolo(st[0],st[1]);
t.setCode(st[0]);
t.setName(st[1]);
titoli.put(st[0], t);
numTitoli++;
}
}}
return numTitoli;
}
public String getStock(String stockCode) throws StockException {
if(!titoli.containsKey(stockCode)) throw new StockException();
return titoli.get(stockCode).toString();
}
public int registerUser(String name) {
numUsers++;
User u = new User(numUsers, name);
users.put(numUsers, u);
return numUsers;
}
public String getUser(int userId) throws UserException {
if(!users.containsKey(userId)) throw new UserException();
return users.get(userId).toString();
}
public void addToBalance(int userId, double amount) throws UserException {
if(!users.containsKey(userId)) throw new UserException();
users.get(userId).setSaldo(users.get(userId).getSaldo()+amount);
}
public double getBalance(int userId) throws UserException {
if(!users.containsKey(userId)) throw new UserException();
return users.get(userId).getSaldo();
}
public void addToWallet(int userId, String stockCode, int quantity) throws UserException, StockException {
if(!users.containsKey(userId)) throw new UserException();
if(!titoli.containsKey(stockCode)) throw new StockException();
Titolo t = titoli.get(stockCode);
if(users.get(userId).getWallet().getTitoliAcquistati().containsKey(t)) {
users.get(userId).getWallet().addQuantityToTitle(t, quantity);
} else {
users.get(userId).getWallet().addTitleToWallet(t, quantity);
}
}
public Collection<String> getWallet(int userId) throws UserException {
if(!users.containsKey(userId)) throw new UserException();
return users.get(userId).getWallet().elencoTitoli();
}
public void addAsk(int userId, String stockCode, int quantity, double minPrice) throws UserException, StockException, WalletException {
System.out.println(users.get(userId).getWallet().getTitoliAcquistati());
if(!users.containsKey(userId)) throw new UserException();
if(!titoli.containsKey(stockCode)) throw new StockException();
Titolo t = titoli.get(stockCode);
if(users.get(userId).getWallet().getTitoliAcquistati().get(t)<quantity) throw new WalletException();
users.get(userId).getWallet().removeTitle(titoli.get(stockCode), quantity);
Integer i = userId;
Integer q = users.get(userId).getWallet().getTitoliAcquistati().get(t);
Double d = minPrice;
Proposta proposta =new Proposta(userId,quantity,minPrice);
titoli.get(stockCode).addProposta(proposta);
}
}
Questa è la classe user:
public class User {
private int id;
private String name;
private double saldo;
private Wallet wallet;
public User(int id, String name) {
this.id=id;
this.name=name;
saldo=0;
wallet = new Wallet();
}
public String toString() {
return id+": "+name;
}
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public double getSaldo() {
return saldo;
}
public void setSaldo(double saldo) {
this.saldo = saldo;
}
public Wallet getWallet() {
return wallet;
}
public void setWallet(Wallet wallet) {
this.wallet = wallet;
}
public long getNumTitoliInWallet() {
return wallet.getTitoliAcquistati().size();
}
}
E questa è la classe wallet:
public class Wallet {
private Map<Titolo, Integer> titoliAcquistati; //l'integer contiene la quantità per ogni titolo
public Wallet() {
titoliAcquistati= new HashMap<Titolo, Integer>();
}
public void addQuantityToTitle(Titolo t, int quantity) {
int newQuantity = titoliAcquistati.get(t)+quantity;
titoliAcquistati.put(t, newQuantity);
}
public void addTitleToWallet(Titolo t, int qty) {
titoliAcquistati.put(t, qty);
}
public Map<Titolo, Integer> getTitoliAcquistati() {
return titoliAcquistati;
}
public void setTitoliAcquistati(Map<Titolo, Integer> titoliAcquistati) {
this.titoliAcquistati = titoliAcquistati;
}
public Collection<String> elencoTitoli(){
List<String> elencoTitoli = new LinkedList<>();
for(Titolo t:titoliAcquistati.keySet()) {
String s = t.getCode()+": "+titoliAcquistati.get(t);
elencoTitoli.add(s);
}
return elencoTitoli;
}
public void removeTitle(Titolo t, int quantity) {
if((titoliAcquistati.get(t)-quantity)!=0) {titoliAcquistati.put(t,(titoliAcquistati.get(t)-quantity));} titoliAcquistati.remove(t);
}
public int quantityPerTitle(Titolo t) {
return titoliAcquistati.get(t).intValue();
}
}