Quote Originariamente inviata da Sevenis Visualizza il messaggio
Allora, prima di passare a settare il codice con le eccezioni, sto creando quello base ipotizzando nessun errore.
In primis volevo sapere se la logica che ho adottato è giusta o se ci sarebbe qualche algoritmo più performante per indicizzare l'array, per il check "disponibilità ora" e al posto dello switch. Non so poi come settare il ciclo facendomi restituire una condizione d'uscita valida. Scrivere nel System.out.println("Digitare 0 per le ore 13, 1 per le ore 14, etc etc" per poter così lavorare con i giusti indici è da evitare?
Innanzitutto potresti sfruttare il null (che è pure il valore di default degli elementi nell'array String[]) per indicare che è "vuoto".

Sulle eccezioni, a dire il vero, dovresti considerarle fin da subito. Per evitare di scrivere codice lungo e contorto, dovresti separare le cose in più metodi. Visto che di Scanner agganciato a System.in ne devi avere solo UNO, dovresti tenerlo da qualche parte in modo che sia riutilizzabile. NON pensare ad un campo "static". Sarebbe meglio sfruttare una istanza di PianificareAppuntamenti, mantenendo Scanner, l'array ed eventualmente altro come "stato" dell'oggetto.
Quindi dovresti cambiare radicalmente approccio e per ottime ragioni.

Riguardo il come associare le ore agli indici, ci sono varie soluzioni, anche più "object oriented" di quello che hai fatto finora. Come ad esempio definire una classe Appuntamento che modella solo l'appuntamento (niente input qui dentro!) con l'ora e la descrizione. L'ora chiaramente sarebbe già presente fin dall'inizio negli oggetti. E poi chiaramente avere un array Appuntamento[] .

Quote Originariamente inviata da Sevenis Visualizza il messaggio
Altra cosa, non so come mai ma nello switch se metto "descrizione.next()" mi legge la parola che digito mentre se metto "descrizione.nextLine()" il programma si chiude senza darmi possibilità di inserire input.
Questo per via del solito "annoso" mix di nextLine con gli altri nextXXX (es. nextInt). Se ad un nextInt l'utente digita 123<invio>, il nextInt restituisce 123 ma il newline resta ancora in Scanner e sarà usato come delimitatore per la prossima lettura. NON viene buttato via subito.
Ma se appena dopo fai un nextLine(), esso "vede" una riga vuota e questo è il motivo di quel comportamento. Che NON è un "baco" di Scanner, funziona così e basta.