Objectivos
- Utilização de excepções para representar situações de erro num programa;
- Apanhar e lançar excepções;
- Operações de Entrada e Saída em Java: Serialização e desserialização de objectos;
- Praticar a compilação e execução de classes Java com packages;
Actividade
- Resolução do enunciado da aula;
- Apoio ao projecto.
Enunciado da Aula
Esta aula está dividida em três partes. A primeira tem como objectivo corrigir erros relacionados com excepções e compilar e executar código Java com packages. Na segunda parte pretende-se alterar a aplicação Editor desenvolvida na aula de laboratório anterior por forma a utilizar o mecanismo de excepções do Java para representar situações de erro. Finalmente, a terceira parte consiste em adicionar a funcionalidade de guardar e recuperar o estado da aplicação Editor utilizando o mecanismo de serialização do Java.
Correcção de Erros de Compilação
Veja com atenção as classes Exemplo.java e ArgumentoInvalidoException.java e tente encontrar os erros de compilação presente na classe Exemplo.
Verifique se encontrou os erros todos utilizando o compilador de java. Compile as duas classes via linha de comandos e corrija os erros encontrados. Atenção, que as duas classes não pertencem ao mesmo package.
Execute o método main da classe Exemplo.
Representar Situações de Erro com Excepções
As situações de erro que aconteçam durante a execução de um comando devem ser representadas como uma instância de DialogException (ou de uma sua subclasse).
Altere a aplicação por forma a que quando se pede uma forma ao editor com um dado identificador, caso esta não exista então deve ser lançada a excepção editor.core.NoSuchIdentifierException (note-se que a principal razão para fazer esta alteração é apenas para praticar a utilização do mecanismo de excepções. A versão anterior desta funcionalidade não estava errada). Os métodos getForm e remove de Editor devem ser alterados para lançarem esta excepção sempre que é referido um identificador que não esteja associado a uma forma do editor. Após ter feito estas alterações compile o código do domínio da aplicação.
Após ter feito esta alteração, concretize agora o comando editor.app.DoRemove (esqueleto desta classe) , que deverá remover a forma que tem o identificador igual ao número indicado pelo utilizador. Caso não exista nenhuma forma com esse identificador deverá ser lançada a excepção editor.app.NoSuchFormException. Adicione este comando ao menu principal da aplicação. Compile o código e execute-o.
Adicione agora o comando DoMove. Este comando deve pedir ao utilizador o identificador da forma a mover e o deslocamento a aplicar. Caso não haja nenhuma forma com o identificador indicado, então deverá ser lançada a excepção editor.app.NoSuchFormException. Para mover uma forma pode aplicar o método move(int dx, int dy) à forma a mover. Adicione esta nova opção ao menu da aplicação, compile o código e execute a aplicação.
Solução: editor-ap8.jar
Guardar e Recuperar o Estado do Editor
Altere agora a aplicação Editor por forma a que esta seja capaz de guardar o seu estado, podendo recuperá-lo mais tarde. Na concretização desta funcionalidade deverá utilizar o mecanismo de serialização/desserialização suportado pela linguagem Java. Na concretização desta funcionalidade deve:
- Definir bem o que constitui o estado persistente desta aplicação. Não se esqueça que as classes dos objectos que podem pertencer ao estado persistente da aplicação têm que concretizar (directa ou indirectamente a interface java.io.Serializable).
- Concretize o método void save(String fileName) em Editor que deverá guardar o estado do editor no ficheiro com o nome referenciado por fileName. Este método não deve tratar as possíveis excepções que podem acontecer no processo de serialização.
- Concretize um método estático Editor load(String fileName) em Editor que devolve uma instância de Editor com um estado igual ao serializado anteriormente no ficheiro com o nome referenciado por fileName. A seguinte secção apresenta dois excertos de código que demonstram a aplicação do mecanismo de serialização e desserialização do Java.
- Acrescentea seguinte funcionalidade ao método estático main que representa o ponto de entrada da aplicação: Quando a aplicação começa, primeiro deverá recuperar o estado persistente guardado num ficheiro indicado pelo utilizador, caso seja indicado algum ficheiro, e no fim, antes de sair da aplicação, caso seja indicado algum ficheiro de saída, a aplicação deve guardar o seu estado persistente no ficheiro indicado. Os dois ficheiros a utilizar são indicados utilizando o mecanismo de propriedades do Java.
- Uma propriedade em Java é definida por um par chave-valor. Em Java é possível aceder ao valor de uma propriedade através da invocação do método estático getProperty de System, o qual recebe como argumento uma cadeia de caracteres com o nome da chave a que se quer aceder. Se a propriedade estiver definida, é devolvido o valor associado à chave em causa. Se a propriedade não estiver definida, então este método devolve null. As propriedades a utilizar para representar os ficheiros de entrada e saída devem ter como chaves input e ouput, respectivamente. Para indicar o valor de uma propriedade deve indicar na linha de comandos (antes de colocar o nome da classe a executar) o seguinte formato -Dchave=valor.