Objectivos

  1. Utilização de excepções para representar situações de erro num programa;
  2. Apanhar e lançar excepções;
  3. Operações de Entrada e Saída em Java: Serialização e desserialização de objectos;
  4. Praticar a compilação e execução de classes Java com packages;

Actividade

  1. Resolução do enunciado da aula;
  2. 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çãoeditor-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:

  1. 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).
  2. 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. 
  3. 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.
  4. 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. 
  5. 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.