Title: Eccezioni
1Eccezioni Precisazioni e approfondimenti
- Costruttore il parametro String definisce il
messaggio di errore associato alleccezione - Metodi particolarmente significativi
- getMessage() ritorna listanza di String con il
messaggio di errore specificato allistanziazione
delloggetto - printStackTrace() stampa lo Stack Trace
permettendo di individuare metodo e linea di
codice che ha lanciato leccezione (utile per il
debug) - getStackTrace() ritorna un array di
StackTraceElement lelemento di indice zero è
la cima dello stack - fillInStackTrace() genera larray di
StackTraceElement accessibile mediante
getStackTrace() o il cui contenuto è stampato da
printStackTrace (attenzione diverso da
setStackTrace!) - Classe StackTraceElement rappresenta
uninvocazione di metodo (a parte lelemento in
cima allo stack che è il metodo in esecuzione e
da cui viene generato loggetto Throwable)
2Esercizio 3 filtraggio file di testo
- Dallesercizio 3 dellesecitazione n.5
- Realizzare unapplicazione Java in grado di
cercare una qualunque parola allinterno del file
testo.txt allegato a queste slide, contando il
numero di occorrenze. - Lapplicazione deve inoltre essere in grado di
creare un nuovo file testo2.txt ottenuto da
testo.txt sostituendo a tutte le occorrenze di un
vocabolo il medesimo vocabolo con però tutte le
lettere maiuscole. - La lettura delle specifiche permette di definire,
a livello astratto, lesistenza di un componente
in grado di svolgere due operazioni (ricerca di
una parola con conteggio delle occorrenze
sostituzione delle occorrenze di un vocabolo)
3Soluzione il componente
package esercitazioni05.filtro import
java.io. import java.util.StringTokenizer publ
ic class TextFileAnalyzer private File
file // la classe file implementa un oggetto con
le // caratteristiche di un file (vedi
java.io) public TextFileAnalyzer(String
fileName) throws FileNotFoundException file
new File(fileName) if (! file.exists()) thro
w new FileNotFoundException("Il file " fileName
"non esiste") Nota se si fosse gestita
leccezione dentro il costruttore (anziché
lanciarla), si avrebbe un comportamento cablato
nelloggetto, cosa che impedirebbe a chi crea
listanza di prendere diverse contromisure in
caso di file non trovato
4StringTokenizer
- La classe java.util.StringTokenizer permette di
spezzare una stringa in più sottostringhe (token)
distinguibili perché delimitate da caratteri
considerati come separatori - Costruttore
- StringTokenizer(String s, String delim, boolean
returnDelims) - StringTokenizer(String s, String delim)
- StringTokenizer(String s)
- I separatori sono i singoli caratteri della
stringa delim nel caso si ricorra al costruttore
ad un parametro, delim è automaticamente
impostata al valore di default \t\n\r\f
(nota \t, \n, \r, \f sono considerati come
singoli caratteri) - Metodi significativi (di veda la documentazione
sulle API Java) - hasMoreToken() true se la stringa contiene altri
token - nextToken() restituisce il token
- nextToken(String delim) restituisce il token
individuato usando come separatori quelli del
parametro delim (quello del metodo, non del
costruttore!)
5Soluzione la funzionalità (metodo) di ricerca
- public int searchWord(String word) throws
IOException - BufferedReader lineReader new
BufferedReader(new FileReader(file)) - int counter 0
- String line, token
- StringTokenizer tokenizer
-
- do
- line lineReader.readLine()
- if (line ! null)
- tokenizer new StringTokenizer(line, " \n")
// delimitatori - while (tokenizer.hasMoreTokens())
- token tokenizer.nextToken()
- if (token.equals(word)) counter
-
-
- while (line ! null)
- return counter
6Soluzione il metodo di ricerca e sostituzione
- public void replaceWord(String originalWord,
String newWord) throws IOException - BufferedReader lineReader new
BufferedReader(new FileReader(file)) - BufferedWriter lineWriter new
BufferedWriter(new FileWriter(file.getParent()Fil
e.separator"testo2.txt")) - String originalLine, newLine, token
- StringTokenizer tokenizer
- La scelta di usare BufferedReader e
BufferedWriter deriva dalla disponibilità di
metodi comodi per lapplicazione, quali la
lettura per linee e la corretta scrittura del
newLine.
7Soluzione il metodo di ricerca e sostituzione
do originalLine lineReader.readLine() edite
dLine "" if (originalLine ! null)
tokenizer new StringTokenizer(originalLine,
" \n",true) while (tokenizer.hasMoreTokens())
token tokenizer.nextToken() if
(token.equals(originalWord)) editedLine
editedLine newWord else editedLine
editedLine token lineWriter.write(editedLi
ne) lineWriter.newLine() lineWriter.flush()
// altrimenti il buffer non scrive i dati sul
file while (originalLine ! null)
8Soluzione il main
public class RunTextFileAnalyzer public static
void main(String args) TextFileAnalyzer
analyzer String input boolean searchAgain
true // INPUT DA CONSOLE BufferedReader
stdInput new BufferedReader(newInputStreamReade
r(System.in)) try while (searchAgain)
analyzer new TextFileAnalyzer(args0)
System.out.print("Inserire parola da cercare
") input stdInput.readLine() if
(input.equals("end_search")) searchAgain
false else System.out.println("Numero
occorrenze di " input " "
analyzer.searchWord(input)) // fine
while
9Soluzione il main
// occorre creare una nuova istanza di
TextFileAnalyzer perché il // BufferedReader
usato internamente non permette di riportare il
puntatore // allinizio del file analyzer new
TextFileAnalyzer(args0) String oldWord,
newWord System.out.print("Inserire parola da
rimpiazzare ") oldWord stdInput.readLine()
System.out.print("Inserire parola sostitutiva
") newWord stdInput.readLine() analyzer.repl
aceWord(oldWord, newWord) catch (IOException
e) System.err.println("Attezione "
e.getMessage()) // fine main