2015-03-26 3 views
3

Я использую ссылку this как ссылку для создания пользовательских исключений. Для моей практики в классе, если ни один файл не выбран или не передан, должно возникнуть мое пользовательское исключение UnknownFileException, но когда я иду и запускаю свой драйвер и помещаю недопустимое имя файла, вместо этого я получаю исключение nullpointerexception?Создание пользовательского исключения

Мой водитель, который имеет Adventure adventure = new Adventure(args[0]).

Мой заказ исключение:

import java.io.FileNotFoundException; 

public class UnknownFileException extends FileNotFoundException { 

    public UnknownFileException() { 
     super("We couldn't tell what file this is");  
    } 

    public UnknownFileException(String message) { 
     super(message); 
    } 
} 

Код:

public class practice { 
    public String[] array; 
    public String line; 
    public PrintWriter outputStream = null; 
    public Scanner inputStream = null; 

    public practice(String fileName) throws UnknownFileException { 
     array = new String[100]; 

     try { 
      inputStream = new Scanner(new FileReader(fileName)); 
      line = inputStream.nextLine(); 
      array[0] = line; 

      for (int i = 1; i < array.length; i++) { 
       array[i] = inputStream.nextLine(); 
      } 
      outputStream = new PrintWriter(new 
       FileOutputStream("newFile.txt")); 
     } catch(UnknownFileException e) { 
      System.out.println(e.getMessage()); 
     } catch (FileNotFoundException e) { 
      throw new UnknownFileException(e.getMessage()); 
     } finally { 
      inputStream.close(); 
     } 
    } 
}   

ответ

2

Вероятно, у вас есть трассировка стека, которая должна была указывать на линию, бросающую NullPointerException. Я предполагаю, что именно эта линия:

inputStream.close(); 

Проблема заключается в том, что если вы поставите в неверном имени файла, new Scanner(new FileReader(fileName)) выбросит, и inputStream никогда не будет назначена. Однако, поскольку у вас есть блок finally, перед тем, как он выберет ваше собственное исключение, он попытается выполнить команду finally. Но это дает NullPointerException, потому что inputStream - null, и это исключение имеет приоритет, я считаю (мне нужно было бы проверить языковые правила, чтобы убедиться в том, что происходит в этом случае).

Исправить ваш finally блок для проверки того, inputStream is null.

Подробнее: Это §14.20.2 JLS. Это довольно сложно, но в основном, если какое-либо исключение выбрано из блока finally, любое предыдущее исключение, выброшенное или пойманное, отбрасывается.

+0

Вижу, большое спасибо! Как только я получу 15 повторений, я обязательно отвечу на ваш ответ. Еще раз спасибо! – code

2

inputstream еще null

сделать следующие изменения:

 } finally { 
     if (inputStream != null) { 
      inputStream.close(); 
     } 
    } 

или вместо этого использовать try-with-resources.

+0

Я вижу, большое спасибо! Как только я получу 15 повторений, я обязательно отвечу на ваш ответ. Еще раз спасибо! – code

+0

@ajb - Спасибо. –

Смежные вопросы