[Java] definire variabili riferimento a oggetto in una classe
ciao a tutti,
è possibile definire una variabile riferimento a oggetto di una classe all'interno della sua stessa classe? In base all'errore che ottengo a riga 50 (segnato da un commento nel codice) mi verrebbe da pensare di no:
Sostanzialmente è una classe che dovrebbe imitare la classe String, nel metodo concat ottengo l'errore "MyString cannot be resolved to a variable" e "tempAr cannot be resolved to a variable". Perché?
Nella soluzione dell'esercizio anzichè creare un nuovo oggetto MyString identico alla stringa di partenza su cui fare l'elaborazione si fa tutto su un array di caratteri (che di fatto è ciò che contiene l'oggetto MyString) e si conclude il metodo con return new MyString(array di caratteri);
Quindi qual è la differenza tra le due cose?
è possibile definire una variabile riferimento a oggetto di una classe all'interno della sua stessa classe? In base all'errore che ottengo a riga 50 (segnato da un commento nel codice) mi verrebbe da pensare di no:
public class MyString {IndexOutOfBoundsException indexBounds = new IndexOutOfBoundsException(); NullPointerException nullo = new NullPointerException(); //COSTRUTTORI public MyString(String s) {ar = new char[s.length()]; for(int i=0; i<ar.length; i++) ar[i] = s.charAt(i); } private MyString(char[] charactersSequence) { ar = charactersSequence; } //METODI public int length() {return ar.length;} public char charAt(int index) {if(index<0 || index>=ar.length) throw indexBounds; else return ar[index]; } public int compareTo(MyString s) {if(s == null) throw nullo; for(int i=0; i<ar.length && i<s.length(); i++) { if(ar[i] != s.charAt(i)) return ar[i] - s.charAt(i); } if(ar.length == s.length()) return 0; else return ar.length - s.length(); } public MyString concat(MyString s) { if(s == null) throw nullo; if(s.length() == 0) return this; else MyString tempAr = new MyString(ar); //RIGA 50 } //VARIABILE DI ESEMPLARE private char[] ar; }
Sostanzialmente è una classe che dovrebbe imitare la classe String, nel metodo concat ottengo l'errore "MyString cannot be resolved to a variable" e "tempAr cannot be resolved to a variable". Perché?
Nella soluzione dell'esercizio anzichè creare un nuovo oggetto MyString identico alla stringa di partenza su cui fare l'elaborazione si fa tutto su un array di caratteri (che di fatto è ciò che contiene l'oggetto MyString) e si conclude il metodo con return new MyString(array di caratteri);
Quindi qual è la differenza tra le due cose?
Risposte
Ciao, così funziona. Prova a vedere cosa è cambiato:
public MyString concat(MyString s) throws NullPointerException { if(s == null) throw nullo; if(s.length() == 0) return this; else { MyString tempAr = new MyString(ar); // Qui fai la concatenazione con la MyString s return tempAr; } }
è bastato mettere le parentesi graffe e l'errore è sparito, ma perché? sintatticamente cosa c'era di scorretto?
Ammetto che non ne sono sicuro... Forse gli dava fastidio il fatto che quel metodo non ritornasse un oggetto MyString ma non so se sia questo il motivo. Comunque ricorda sempre una cosa fondamentale per i programmatori: link.

haha ok me ne farò una ragione, grazie delle risposte
No beh in realtà ci sarà una risposta razionale. Con i computer c'è quasi sempre... Forse qualcuno ci illuminerà, comunque almeno puoi procedere con il tuo esercizio!
Minomic ha ragione, l'errore è dovuto al fatto che non ritorni alcun valore se s.length() è diverso da 0.
Puoi omettere il return soltanto con funzioni "void", se dichiari una funzione affinché ritorni qualcosa, qualcosa deve ritornare!
Puoi omettere il return soltanto con funzioni "void", se dichiari una funzione affinché ritorni qualcosa, qualcosa deve ritornare!