O botão "cancelar" da JOptionPane.showInputDialog

Pessoal, faz algum tempo que não posto aqui.
Fiz um software que calcula a média das provas digitadas.
O problema está quando o usuário cancela a InputDialog, aí a media dá um valor incorreto. Será que vocês podem me ajudar? Meu código ficou um pouco complicado, espero que os comentários ajudem.

import javax.swing.JOptionPane;

public class CalculaMedia {

		public static void main(String[] args) {
			double num = 0, media = 0;
			int i = 1;
			String nProvas;
			
				JOptionPane.showMessageDialog(null, "ESSE É UM SOFTWARE LIVRE, CRIADO UNICAMENTE COM O INTUITO DE APRENDIZADO\nOBJETIVO: Calcular médias.");
				nProvas = JOptionPane.showInputDialog("Digite o número de provas. ");
			
						int nNProvas = Integer.parseInt(nProvas);
						//O número de Provas é convertido para um número inteiro
						
						System.out.println("A partir de agora, o programa ira calcular os " + nProvas + " Testes." + "\n" + "Tenha atencao ao digitar as notas.");
						System.out.println("Para corrigir uma nota anterior, clique em CANCELAR.");
			
				while (i <= nNProvas) {
				//Calcula enquanto o número o i for menor que nNProvas (número de provas).  i = 1.
					
					//Estrutura para tratar erros.
					try {
						String numS = JOptionPane.showInputDialog("Digite a nota da prova " + i + ".");
						num = Double.parseDouble(numS);
													
					}	
					catch (NumberFormatException ex1) {
						JOptionPane.showMessageDialog(null, "Digite um número válido\nCaso haja casas decimais, utilizar \".\" para separar. +");
						i--;
					}
					catch (NullPointerException ex2) { //Ocorre ao clica no botão cancelar
					
						//Executa apenas se a prova não for a primeira
						if (i > 1) {
							JOptionPane.showMessageDialog(null, "Ao clicar em cancelar, você pode corrigir a nota anterior."); //É alertado ao usuário que ele deve corrigir a nota anterior
							media -= (num * 2);
							/*Como o último número digitado ainda está gravado, ele será cancelado da média aqui, cancelando a última média							
							Como logo abaixo, o num será somado novamente à média, multipliquei ele por 2, tirando assim um número 2x maior, anulando o código abaixo.*/
							i-= 2;
							//Retirei 2 i's exatamente para voltar uma prova, porque ocorre o incremento de +1 i abaixo.
						}
						else {
							i--;
							//Se ali em cima, eu tirava 2 i's, aqui eu tiro 1, e ainda assim, aparece a prova correta(-1 i +1 i = 0).
						}
					}					
					//Executa de qualquer maneira			
					if (num >= 0 && num <= 10) {
					//If para verificar se o número digitado para a prova atual está entre 0 e 10
						media += num;
						num = 0;
						i++;						
													
					}else {
						JOptionPane.showMessageDialog(null, "A nota deve estar entre 0 e 10.");
					}
				}
				media = media / Integer.parseInt(nProvas);
				//Converte a String nProvas para int e já calcula a média.
				JOptionPane.showMessageDialog(null, "Média: " + media + "\n" + "Provas computadas: " + nProvas);
				//Exibe o resultado e as provas calculadas.
					
		}
}

O showInputDialog retorna null sempre que o usuário cancelar a ação. Então, basta testar essa condição num if. É uma má prática usar para isso o teste de NullPointerException.
Se você quer alterar a nota de uma prova, o ideal é guardar todas as notas em um array, e só ao final fazer o cálculo da média. Caso contrário, você perderá a informação das notas anteriores digitadas.

Boa ideia, vou implementar e amanhã de tarde eu posto o resultado.