2013-12-10 4 views
0

Хорошо, вот исходный код -Java.lang.nullpointer исключения в исходном коде

Программа должна быть в состоянии запустить), если аргументы не заданы, задать имя файла с арг б) если есть являются args, получают эти аргументы в качестве параметров для метода 'parametr'

Проблема в том, что программа отлично работает с вводом файла, но если аргументы заданы из CMD или Eclipse. С моей точки зрения, код полностью прекрасен, но IDK ...

// блок кода, который создает выходной файл +, который должен передать // над Integer в метод 'parametr' из арг массив

else if (args.length > 0) { 

       try { 

        PrintStream ps = new PrintStream("vystup.txt"); 

        for (int i = 0; i < args.length; i++) { 

         parametr(Integer.parseInt(args[i])); 
        } 
        ps.close(); 
       } 
       catch (Exception g) { 

        g.printStackTrace(); 
        System.exit(1); 
       } 

      } 
     } 

это указывает при методе «Parametr» >>

// этот метод должен просто создать массив с именем «метод pseudoposloupnost'via //» Posloupnost», а затем скопировать этот массив в новый массив с именем «serazenaPosloupnost» // остальная часть кода не важна

public static void parametr (int n) { 

       Posloupnost(n); //Another method to count array 'pseudo...' 
       serazenaPosloupnost = new int [pseudoposloupnost.length]; 
       for (int k = 0; k < pseudoposloupnost.length; k++) { 
        serazenaPosloupnost[k] = pseudoposloupnost[k]; 
       } 

       serazeniPosloupnosti(serazenaPosloupnost); 

     ps.println(pseudoposloupnost.length + " " + Arrays.toString(pseudoposloupnost)); 
     ps.println(serazenaPosloupnost.length + " " + Arrays.toString(serazenaPosloupnost)); 
     ps.println(); 
     drawPosloupnost(); 

    } 

Java указывает на эти два блока как исключение nullpointer, когда я пытаюсь запустить код из CMD с указанными аргументами.

+1

Какие массивы являются параметрами, работающими с (например, что такое «псевдополюсность» и «serazenaPosloupnost»?) Также почему? Что-то пустое, посмотрите номер строки в вашей трассе стека. –

+0

1) Чтобы лучше помочь, опубликуйте [SSCCE] (http://sscce.org/). 2) Всегда копировать/вставлять вывод ошибок и исключений. –

ответ

2

Думаю, у вас есть две переменные, называемые ps. Один из них является локальным для вашего блока try, а другой (вероятно) представляет собой статическую переменную класса. «Возможно», потому что вы не показываете нам свою декларацию.

Упрощенный вниз:

public class myClass { 
    private static PrintStream ps; // we'll refer to this as "ps1" 

    public static void parametr(int n) { 
     ... 
     ps.println("foo"); 
    } 

    public static void myMethod() { 
     try { 
      PrintStream ps = 
       new PrintStream("x.txt"); // we'll refer to this as "ps2" 
      parametr(1); 
      ps.close(); 
     } catch (...) { 
     } 
    } 
} 

Это вопрос сферы.

ps1 и ps2 - две разные переменные.

ps1 определен, но не инициализирован, поэтому он имеет значение null в течение всей программы.

ps2 является локальным для окружающего его блока try. Он не передается параметру(), поэтому parametr() его не видит.

Когда parametr() выполняет ps.println(), он смотрит на ps1, который является нулевым, следовательно, исключение NullPointerException.

Одним из способов вы можете исправить это, чтобы не создавать PS1, и передать ps2 в Parametr():

public class myClass { 

    public static void parametr(int n, PrintStream printStream) { 
     ... 
     printStream.println("foo"); 
    } 

    public static void myMethod() { 
     try { 
      PrintStream ps = 
       new PrintStream("x.txt"); // we'll refer to this as "ps2" 
      parametr(1, ps); 
      ps.close(); 
     } catch (...) { 
     } 
    } 
} 

Это вообще хорошо делать такого рода вещи, потому что вы можете точно узнать, какие переменные ваши методы нужно и может коснуться.

Другой способ устранения этого вопроса - удалить PrintStream из инструкции ps = ... в блоке try, поэтому вы назначаете переменную класса. Это часто не такая хорошая идея, потому что вы скрываете управление этим PrintStream от читателя кода.


Еще один совет: вы вызываете метод posloupnost(n) (я изменил свое первое письмо в нижнем регистре, так как Java-программисты предпочитают что). Могу предположить, что либо:

  • этот метод является пустой тратой времени (так как ее единственным параметром является целым числом, так что метод не может изменить его)
  • этот метод имеет побочные эффекты на переменную класса или глобальная переменная.

Почти всегда лучше передавать объекты, на которые повлияет метод, так что ясно, какие последствия у него будут. Даже если вы собираетесь печатать на экране, лучше сделать следующее:

System.out.println (posloupnost (n));

... или ...

posloupnost (п, System.out);

+0

Вот именно проблема ... большое спасибо :) – user3087667

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