[Java] definire variabili riferimento a oggetto in una classe

Usernamer1
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:
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
minomic
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;
		}
	}

Usernamer1
è bastato mettere le parentesi graffe e l'errore è sparito, ma perché? sintatticamente cosa c'era di scorretto?

minomic
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. :-D

Usernamer1
haha ok me ne farò una ragione, grazie delle risposte

minomic
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!

dab1
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!

Rispondi
Per rispondere a questa discussione devi prima effettuare il login.