Java

Discussioni su qualunque linguaggio di programmazione o engine
Avatar utente
Slime
Membro attivo
Messaggi: 367
Iscritto il: 23/12/2013, 20:21
Specialità: Esistere
Uso: GM:Studio 1.4 Standard
Contatta:

Java

Messaggio da Slime »

Apro questo topic dove inserirò tutti i miei dubbi e (sopratutto) gli errori che mi assaliranno durante questa impresa piena di pericoli e paure (imparare a programmare giochi in java :lol: )

Neanche un minuto che mi decido ad iniziare che sorgono i primi errori :piagne:
Eccolo qui il nostro caro amico rompiballe:

Codice: Seleziona tutto

The serializable class JavaGame does not declare a static final serialVersionUID field of type long
che riscontro sulla quarta riga di questo codice umile e semplice:

Codice: Seleziona tutto

package javagame;
import javax.swing.JFrame;

public class JavaGame extends JFrame {
	public JavaGame() {
		setTitle("JavaGame");
		setResizable(false);
		setSize(500,500);
		setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		setVisible(true);
	}
	
	public static void main(String[] args) {
		new JavaGame();
	}
}
Grazie di cul..cuore a tutti quelle persone che cercheranno di essere comprensive con me e si abbasseranno al mio livello per spiegarmi bene bene con calma cosa non va bene e cosa va poco male.

E' tutto :mrgreen:
Huzzah!

Immagine

Le Tartarughe Spaziali

Avatar utente
Homunculus
Admin
Messaggi: 6840
Iscritto il: 25/11/2007, 20:36
Contatta:

Re: Java

Messaggio da Homunculus »

Quello non é un errore, é solo un warning, dovrebbe comunque compilare e funzionare tutto regolarmente. Quel warning ha a che vedere con la serializzazione e deserializzazione degli oggetti (in pratica, il salvataggio di oggetti su file nello stato in cui si trovano al momento del salvataggio).
Quando si fa questa operazione in genere si assegna (manualmente) un ID di serializzazione che é utilizzato da java per riconoscere se un oggetto serializzato corrisponde realmente alla classe, ed essendo tutti i componenti dell'interfaccia di java serializzabili di default, eclipse e il compilatore ti segnalano la cosa (nel tuo caso é il JFrame che implementa serializable).

Probabilmente non ti serve a un fico secco e quindi puoi tranquillamente ignorare il warning, tanto più che se non lo metti tu ci pensa il compilatore da solo a creare un ID in automatico. Se il warning ti da fastidio, fai generare un ID a eclipse e sei a posto.

Avatar utente
Slime
Membro attivo
Messaggi: 367
Iscritto il: 23/12/2013, 20:21
Specialità: Esistere
Uso: GM:Studio 1.4 Standard
Contatta:

Re: Java

Messaggio da Slime »

Ok grazie :mrgreen:
Huzzah!

Immagine

Le Tartarughe Spaziali

Avatar utente
Slime
Membro attivo
Messaggi: 367
Iscritto il: 23/12/2013, 20:21
Specialità: Esistere
Uso: GM:Studio 1.4 Standard
Contatta:

Re: Java

Messaggio da Slime »

Hola :cappa:
Vi mancavano le mie domande niubbe? :mrgreen:

Codice: Seleziona tutto

import java.util.*;

public class Scanner {
	public static void main(String args[]) {
		Scanner input = new Scanner(System.in);
		int s = input.nextLine();

	}
}
Ricevo edgli errori sulle righe 6 e 7:
The constructor Scanner(InputStream) is undefined
The method nextLine() is undefined for the type Scanner

Che sbaglio?
Huzzah!

Immagine

Le Tartarughe Spaziali

Avatar utente
Homunculus
Admin
Messaggi: 6840
Iscritto il: 25/11/2007, 20:36
Contatta:

Re: Java

Messaggio da Homunculus »

Il problema penso dipenda dal fatto che stai cercando di usare la classe Scanner, ma per fare questo hai chiamato la tua classe alle stesso modo... Cambia nome alla tua classe o specifica che vuoi usare quella interna

Jak
Admin
Messaggi: 12355
Iscritto il: 19/08/2009, 16:20
Specialità: Programmazione 3D
Uso: GM:Studio 2
Contatta:

Re: Java

Messaggio da Jak »

Veramente quello che dici tu homu è consentito.
L'errore parla chiaro. Non hai creato un costruttore per Scanner che accetta quell'argomento e nemmeno il metodo nextLine.
In pratica stai usando 2 funzioni che non esistono perchè non le hai create.
Time to feel, time to believe
Dare to see what may come of our future
Lift your head, broaden your gaze
Speak your mind and your thoughts they will follow you

Avatar utente
Slime
Membro attivo
Messaggi: 367
Iscritto il: 23/12/2013, 20:21
Specialità: Esistere
Uso: GM:Studio 1.4 Standard
Contatta:

Re: Java

Messaggio da Slime »

Invece cambiando il nome non mi da errore :asd:
Grazie Homu :cappa:
Huzzah!

Immagine

Le Tartarughe Spaziali

Jak
Admin
Messaggi: 12355
Iscritto il: 19/08/2009, 16:20
Specialità: Programmazione 3D
Uso: GM:Studio 2
Contatta:

Re: Java

Messaggio da Jak »

Ah aspetta la classe Scanner è già esistente?
Questo spiega tutto, praticamente l'hai ricreata provocando i problemi descritti da me. In pratica era una fusione dei due problemi con la differenza che io ho letto solo l'errore indicato dal compilatore.
Nessuno ha bisogno di me, sto invecchiando :cry:
Time to feel, time to believe
Dare to see what may come of our future
Lift your head, broaden your gaze
Speak your mind and your thoughts they will follow you

Avatar utente
Slime
Membro attivo
Messaggi: 367
Iscritto il: 23/12/2013, 20:21
Specialità: Esistere
Uso: GM:Studio 1.4 Standard
Contatta:

Re: Java

Messaggio da Slime »

Probabilmente sì, e appartiene a java.util .
Ho ancora bisogno di te Jak :lol:
So che ho scritto degli strafalcioni, vi prego correggeteli :mrgreen:

Il mio obbiettivo è quello di creare una classe che mi permetta di trovare il massimo numero tra quelli scritti tra parentesi (che sono di numero variabile)
Non badate ai nomi, scrivo le prime cose che mi passano per la mente per fare questi esperimenti :lol:
La classe Lama è la classe che mi deve permettere il lavoro descritto sopra, l'altra serve solo per crearne un oggetto e scrivere a schermo il valore massimo
Lama

Codice: Seleziona tutto

public class Lama {
	static int j;
	static int a[];
	static int max;
	
	public Lama(int ... args) {
		j = 0;
		for(int i : args) {
			a[j] = i;
			j++;
		}//Assegno ogni numero immesso con Lama(...) in uno slot dell'array
		
		max = a[0];//Assegno inizialmente alla variabile max il numero posizionato nel primo slot dell'array
		for (int i : a) {
			if (a[i] > max) {
				max = a[i];
			}//Controllo per ogni elemento di a se è maggiore di max, se è vero max diventa quell'elemento
		}
	}
}
Test

Codice: Seleziona tutto

public class Test {
	public static void main(String args[]) {
		new Lama(1,2,3,4,5);//Creo l'oggetto Lama (qua mi sa che ho scritto qualche castronata grave, pardon
		System.out.println(Integer.toString(Lama.max));//Scrivo la variabile max dell'oggeto Lama a schermo
	}
}
L'errore che mi appare è questo

Codice: Seleziona tutto

Exception in thread "main" java.lang.NullPointerException
	at Lama.<init>(Lama.java:9)
	at Test.main(Test.java:4)
Huzzah!

Immagine

Le Tartarughe Spaziali

Jak
Admin
Messaggi: 12355
Iscritto il: 19/08/2009, 16:20
Specialità: Programmazione 3D
Uso: GM:Studio 2
Contatta:

Re: Java

Messaggio da Jak »

Premetto che non conosco java quindi potrei sparare cavolate ma siccome è c-like dovrei cavarmela per cose non particolarmente avanzate.
Tu hai creato un'oggetto Lama ed hai usato il metodo Max che è riferito alla classe e non all'oggetto creato.
Devi prima creare un'istanza della tua classe quindi

Codice: Seleziona tutto

Lama my_lama = new Lama(1,2,3,4,5);
e dopo usare questa istanza

Codice: Seleziona tutto

System.out.println(Integer.toString(my_lama.max));
Ti mancano un po di basi sulla gestione delle classi.
Time to feel, time to believe
Dare to see what may come of our future
Lift your head, broaden your gaze
Speak your mind and your thoughts they will follow you

Avatar utente
Slime
Membro attivo
Messaggi: 367
Iscritto il: 23/12/2013, 20:21
Specialità: Esistere
Uso: GM:Studio 1.4 Standard
Contatta:

Re: Java

Messaggio da Slime »

Grazie, ora ho capito :)
Ma allora la scrittura

Codice: Seleziona tutto

new Lama(1,2,3,4,5)
quando si usa?

Inoltre, anche se ho sostituito come hai detto tu, l'errore rimane :(
Si riferisce alle righe

Codice: Seleziona tutto

a[j] = i;
e

Codice: Seleziona tutto

Lama my_lama = new Lama(1,2,3,4,5);
Huzzah!

Immagine

Le Tartarughe Spaziali

Solid Snake
GMI Advanced
Messaggi: 2093
Iscritto il: 19/12/2010, 16:17
Specialità: Programmazione
Uso: GM:Studio 1.4 Standard
Contatta:

Re: Java

Messaggio da Solid Snake »

Devi dichiarare un oggetto Lama come attributo della classe o come variabile locale e poi istanziarla:

Codice: Seleziona tutto

public class Arancia
{
  private Lama myLama;//Se non sai cosa vuol dire private vallo a leggere, puoi anche usare public se vuoi.
  
  public static void main(String args[])
  {
    myLama=new Lama(1,2,3,4,5,6,7,8);//Instanzi un oggetto di tipo Lama e assegni il reference alla variabile myLama
    
  }
}
Per richiamare gli attributi non statici dell'instanza (variabili e metodi) devi usare il reference:

Codice: Seleziona tutto

myLama.faiQualcosa();//Chiamata ad un metodo dell'istanza myLama
myLama.max//Chiamata alla variabile max dell'istanza myLama
Nella tua classe non hai bisogno di dichiarare i parametri static dato che instanzi la classe Lama.

Per l'errore nell'array:
Non puoi modificare un array di cui non sai le dimensioni. Prima devi dichiarale.

Codice: Seleziona tutto

myArray=new int[4]//da 0 a 3
naturalmente puoi anche dichiarare la dimensione in base ad una variabile:

Codice: Seleziona tutto

myArray=new float[lenght]//da 0 a lenght-1
Nel tuo caso non serve! Perche il parametro args è un array di int, quindi puoi usarlo direttamente senza crearne un altro.
♥♥♥♥♥♥
Immagine
♥♥♥♥♥♥
Spoiler
Immagine

Avatar utente
Slime
Membro attivo
Messaggi: 367
Iscritto il: 23/12/2013, 20:21
Specialità: Esistere
Uso: GM:Studio 1.4 Standard
Contatta:

Re: Java

Messaggio da Slime »

Ok, ho modificato il codice così:

Codice: Seleziona tutto

public class Lama {
	static int j;
	static int max;
	public Lama(int ... args) {
		j = 0;
		for(int i : args) {
			args[j] = i;
			j++;
		}//Assegno ogni numero immesso con Lama(...) in uno slot dell'array
		
		max = args[0];//Assegno inizialmente alla variabile max il numero posizionato nel primo slot dell'array
		for (int i : args) {
			if (args[i] > max) {
				max = args[i];
			}//Controllo per ogni elemento di a se è maggiore di max, se è vero max diventa quell'elemento
		}
	}
}

Codice: Seleziona tutto

public class Test {
	private static Lama my_lama;
	public static void main(String args[]) {
		my_lama = new Lama(1,2,3,4,5);//Creo l'oggetto Lama (qua mi sa che ho scritto qualche castronata grave, pardon
		System.out.println(Integer.toString(my_lama.max));//Scrivo la variabile max dell'oggeto Lama a schermo
	}
}
E mi da questo errore:

Codice: Seleziona tutto

Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: 5
	at Lama.<init>(Lama.java:13)
	at Test.main(Test.java:5)
sulle linee

Codice: Seleziona tutto

if (args[i] > max) {
e

Codice: Seleziona tutto

my_lama = new Lama(1,2,3,4,5);
PS: Mi ero dimenticato di dire che sulla riga 5 della classe Test (questa per intenderci: System.out.println(Integer.toString(my_lama.max));) mi da un warning:

Codice: Seleziona tutto

The static field Lama.max should be accessed in a static way
Huzzah!

Immagine

Le Tartarughe Spaziali

Nix
GMI Advanced
Messaggi: 2437
Iscritto il: 26/12/2008, 18:14
Uso: GM:Studio 2
Contatta:

Re: Java

Messaggio da Nix »

Jak ha scritto:Ti mancano un po di basi sulla gestione delle classi.
Gli mancano le basi di tutto. Da dove lo stai imparando? Il codice è pieno di roba senza senso, ed è evidente che neanche tu ti rendi conto di cosa fa ogni riga. L'errore è abbastanza chiaro: l'indice va oltre i limiti dell'array. Infatti l'array passato al costruttore di Lama va da 1 a 5, e tu usi il suo contenuto come indice per l'array stesso (per giunta nel primo for lo copi su sè stesso, non facendo nulla praticamente). Ma gli indici vanno da 0 a 4, e inoltre se il tuo programma deve calcolare il numero massimo, non ha comunque senso quella cosa di usare il contenuto dell'array come indice per l'array stesso (max = args). Mettendo anche i - 1 per esempio, non potresti trovare il massimo tra 2, 3, 4, 5, 6. E riguardo alla cosa dello static, perché usi i metodi e i campi statici se non sai neanche cosa sono?

Avatar utente
Slime
Membro attivo
Messaggi: 367
Iscritto il: 23/12/2013, 20:21
Specialità: Esistere
Uso: GM:Studio 1.4 Standard
Contatta:

Re: Java

Messaggio da Slime »

Grazie mille della risposta, ora capisco come si sentono i nabbi di GMI :mrgreen:
Nix ha scritto:L'errore è abbastanza chiaro: l'indice va oltre i limiti dell'array. Infatti l'array passato al costruttore di Lama va da 1 a 5, e tu usi il suo contenuto come indice per l'array stesso (per giunta nel primo for lo copi su sè stesso, non facendo nulla praticamente). Ma gli indici vanno da 0 a 4, e inoltre se il tuo programma deve calcolare il numero massimo
Questo ho sbagliato io, mi sono dimenticato di cancellare quella parte dopo aver modificato (mai fare le cose di fretta) il codice ^ , ora modifico ;)
Il resto non ho capito bene. Intendi questo punto?

Codice: Seleziona tutto

for(int i : args)
In questo caso non dovrebbe passarsi tutti i posti dell'array in base alla sua lunghezza (quindi aumentare di 1 i finchè non raggiunge la lunghezza dell'array args)?
Oppure ho interpretato male?
E riguardo alla cosa dello static, perché usi i metodi e i campi statici se non sai neanche cosa sono?
Perchè mi dava warning strani circa il non poter richiamare variabili non statiche da metodi statici (o qualcosa del genere), hai ragione non ho capito cosa siano :oops:
Huzzah!

Immagine

Le Tartarughe Spaziali

Nix
GMI Advanced
Messaggi: 2437
Iscritto il: 26/12/2008, 18:14
Uso: GM:Studio 2
Contatta:

Re: Java

Messaggio da Nix »

Slime ha scritto:Grazie mille della risposta, ora capisco come si sentono i nabbi di GMI :mrgreen:
Il problema non è essere nabbi, ma star imparando male. Quindi:
Nix ha scritto:Da dove lo stai imparando?
Slime ha scritto:
In questo caso non dovrebbe passarsi tutti i posti dell'array in base alla sua lunghezza (quindi aumentare di 1 i finchè non raggiunge la lunghezza dell'array args)?
No, i assume il contenuto dei "posti" dell'array, non il loro indice.
Slime ha scritto:hai ragione non ho capito cosa siano
Per questo ti chiedo come lo stai imparando.

Avatar utente
Slime
Membro attivo
Messaggi: 367
Iscritto il: 23/12/2013, 20:21
Specialità: Esistere
Uso: GM:Studio 1.4 Standard
Contatta:

Re: Java

Messaggio da Slime »

No, i assume il contenuto dei "posti" dell'array, non il loro indice.
Ah ecco dove sbagliavo :spat: pensavo che in quel caso stesse per la lunghezza dell'array.
Ok ho risolto così:

Codice: Seleziona tutto

for(int i = 0; i<args.length; i++)
Inizialmente imparavo seguendo questi tutorial https://www.youtube.com/playlist?list=P ... 9D83EE3E28 , poi però mi sono stancato (erano veramente troppi) e ho iniziato a leggere la guida di html.it http://www.html.it/guide/guida-java/ ma a un certo punto pensavo di essere pronto per scrivere un programmino, così ho iniziato.

Comunque ora il programma funziona :first:

Codice: Seleziona tutto

public class Lama {
	static int j;
	static int max;
	public Lama(int ... args) {
		max = args[0];//Assegno inizialmente alla variabile max il numero posizionato nel primo slot dell'array
		for(int i = 0; i<args.length; i++) {
			if (args[i] > max) {
				max = args[i];
			}//Controllo per ogni elemento di a se è maggiore di max, se è vero max diventa quell'elemento
		}
	}
}

Codice: Seleziona tutto

public class Test {
	private static Lama my_lama;
	public static void main(String args[]) {
		my_lama = new Lama(1,9,3,4,5);//Creo l'oggetto Lama (qua mi sa che ho scritto qualche castronata grave, pardon
		System.out.println(Integer.toString(my_lama.max));//Scrivo la variabile max dell'oggeto Lama a schermo
	}
}
Ma mi appare comunque il warning soprascritto ^ : |
Huzzah!

Immagine

Le Tartarughe Spaziali

Nix
GMI Advanced
Messaggi: 2437
Iscritto il: 26/12/2008, 18:14
Uso: GM:Studio 2
Contatta:

Re: Java

Messaggio da Nix »

Slime ha scritto:Inizialmente imparavo seguendo questi tutorial https://www.youtube.com/playlist?list=P ... 9D83EE3E28 , poi però mi sono stancato (erano veramente troppi) e ho iniziato a leggere la guida di html.it http://www.html.it/guide/guida-java/ ma a un certo punto pensavo di essere pronto per scrivere un programmino, così ho iniziato.
Mi aspettavo che avresti detto o youtube, o html.it, e invece li hai citati entrambi. È questo il problema. Non conosco una buona guida per il Java, visto che, conoscendo già altri linguaggi simili come il C#, per me è diverso da te che vieni dal GML, ma è probabile che quelle che hai messo fanno schifo. Su YouTube perché fare delle guide video sulla programmazione è tipico dei nabbi, ed è in ogni caso una cosa stupida, mentre per html.it ho visto che molte guide sulla programmazione (quelle sul web development sono molto meglio) sono pessime, quindi probabilmente anche quella per il Java lo è. Ti consiglio comunque di studiare sempre in inglese, c'è molto più materiale e questo è molto più serio e preciso.

Riguardo allo static comunque, il problema è che chiami un metodo statico da un'istanza, mentre ciò che è statico "appartiene" alla classe.

Avatar utente
Slime
Membro attivo
Messaggi: 367
Iscritto il: 23/12/2013, 20:21
Specialità: Esistere
Uso: GM:Studio 1.4 Standard
Contatta:

Re: Java

Messaggio da Slime »

E' più probabile che io abbia seguito male i tutorial :mrgreen:
Comunque, allora come risolvo?
Huzzah!

Immagine

Le Tartarughe Spaziali

Nix
GMI Advanced
Messaggi: 2437
Iscritto il: 26/12/2008, 18:14
Uso: GM:Studio 2
Contatta:

Re: Java

Messaggio da Nix »

Slime ha scritto:E' più probabile che io abbia seguito male i tutorial :mrgreen:
Secondo me è al contrario.
Slime ha scritto:Comunque, allora come risolvo?
Togliendo static.

Rispondi

Chi c’è in linea

Visitano il forum: Nessuno e 9 ospiti