Кто-то может сказать мне самые основы того, как программирование работает? [закрытый]

Что такое NullPointerException?

Хорошим местом для начала является JavaDocs . Они охватывают это:

Брошено, когда приложение пытается использовать null в случае, когда требуется объект. К ним относятся:

  • Вызов метода экземпляра нулевого объекта.
  • Доступ или изменение поля нулевого объекта.
  • Выполнение длины null, как если бы это был массив.
  • Доступ или изменение слотов с нулевым значением, как если бы это был массив.
  • Бросать нуль, как если бы это было значение Throwable.

Приложения должны бросать экземпляры этого класса для указания других незаконных видов использования нулевого объекта.

blockquote>

Также, если вы попытаетесь использовать нулевую ссылку с synchronized, который также выдаст это исключение, за JLS :

SynchronizedStatement:
    synchronized ( Expression ) Block
  • В противном случае, если значение выражения равно null, NullPointerException.
blockquote>

Как это исправить?

Итак, у вас есть NullPointerException. Как вы это исправите? Возьмем простой пример, который выдает NullPointerException:

public class Printer {
    private String name;

    public void setName(String name) {
        this.name = name;
    }

    public void print() {
        printString(name);
    }

    private void printString(String s) {
        System.out.println(s + " (" + s.length() + ")");
    }

    public static void main(String[] args) {
        Printer printer = new Printer();
        printer.print();
    }
}

Идентифицирует нулевые значения

. Первый шаг - точно определить , значения которого вызывают исключение . Для этого нам нужно выполнить некоторую отладку. Важно научиться читать stacktrace . Это покажет вам, где было выбрано исключение:

Exception in thread "main" java.lang.NullPointerException
    at Printer.printString(Printer.java:13)
    at Printer.print(Printer.java:9)
    at Printer.main(Printer.java:19)

Здесь мы видим, что исключение выбрано в строке 13 (в методе printString). Посмотрите на строку и проверьте, какие значения равны нулю, добавив протоколирующие операторы или используя отладчик . Мы обнаруживаем, что s имеет значение null, а вызов метода length на него вызывает исключение. Мы видим, что программа перестает бросать исключение, когда s.length() удаляется из метода.

Трассировка, где эти значения взяты из

Затем проверьте, откуда это значение. Следуя вызовам метода, мы видим, что s передается с printString(name) в методе print(), а this.name - null.

Трассировка, где эти значения должны быть установлены

Где установлен this.name? В методе setName(String). С некоторой дополнительной отладкой мы видим, что этот метод вообще не вызывается. Если этот метод был вызван, обязательно проверьте порядок , что эти методы вызывают, а метод set не будет называться после методом печати. ​​

Этого достаточно, чтобы дать нам решение: добавить вызов printer.setName() перед вызовом printer.print().

Другие исправления

Переменная может иметь значение по умолчанию setName может помешать ему установить значение null):

private String name = "";

Либо метод print, либо printString может проверить значение null например:

printString((name == null) ? "" : name);

Или вы можете создать класс, чтобы name всегда имел ненулевое значение :

public class Printer {
    private final String name;

    public Printer(String name) {
        this.name = Objects.requireNonNull(name);
    }

    public void print() {
        printString(name);
    }

    private void printString(String s) {
        System.out.println(s + " (" + s.length() + ")");
    }

    public static void main(String[] args) {
        Printer printer = new Printer("123");
        printer.print();
    }
}

См. также:

Я все еще не могу найти проблему

Если вы попытались отладить проблему и до сих пор не имеете решения, вы можете отправить вопрос для получения дополнительной справки, но не забудьте включить то, что вы пробовали до сих пор. Как минимум, включите stacktrace в вопрос и отметьте важные номера строк в коде. Также попробуйте сначала упростить код (см. SSCCE ).

18
задан Kara 26 January 2016 в 17:42
поделиться

13 ответов

Все это запускается с ЦП или процессора. Каждый тип процессора имеет определенный набор инструкций, которые он может выполнить. Эти инструкции работают по, и обнуляет, которые в свою очередь представляют то, к чему Вы желаете им: числа, буквы, даже сами инструкции.

На самом низком уровне, нуль определяется присутствием определенного напряжения (обычно рядом 0V) в транзисторе, и 1 является присутствием другого напряжения (зависимый ЦП, скажите 5 В)

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

А простой пример. Скажем, машинная команда 001 средство добавляет два числа.

Затем Вы пишете программу, которая добавляет два числа, обычно как это:

4 + 5

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

001 00000100 00000101

с дополнительным шаблонным машинным кодом для размещения 001 инструкции в следующий регистр команд (указатель команд), и двоичный файл закодировал числа в регистрах данных (или RAM).

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

центральные процессоры инструкций могут выполниться, являются довольно основными и простыми, дополнение, разделение, отрицание, считанное из RAM, места в RAM, читают из регистра, и так далее.

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

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

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

А решающий момент произошел при переходе от ассемблера (язык, очень похожий на машинный код, это был первый язык программирования, и это - конкретный ЦП. Каждая инструкция по сборке непосредственно переводит в машинный код) к C (который, является портативным среди различных центральных процессоров и в более высоком уровне абстракции, чем блок: каждая строка кода C представляет много команд машинного кода). Это было огромным увеличением производительности для программистов, они больше не должны были портировать программы между различными центральными процессорами, и они могли думать намного более легко о базовых моделях, ведя к длительному увеличению сложности программного обеспечения, которое мы видели (и даже потребуйте) с 1970-х до сих пор.

незаконченное недостающее звено - то, как управлять, что сделать с той информацией и как получить вход от внешних источников, сказать отображающиеся изображения на экране или записи информации к жесткому диску или печати изображения на принтере или получения клавишных перфораторов с клавиатуры. Это все сделано возможным остальной частью аппаратных средств, существующих в компьютере, которым управляют в некотором роде подобный тому из ЦП, Вы помещаете данные и инструкции в определенных транзисторах в видеокарте или сетевой плате или жестком диске или RAM. ЦП имеет инструкции, которые позволят ему помещать некоторые данные или инструкцию в (или читать информацию из) надлежащее местоположение различных частей аппаратных средств.

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

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

кажется, что я увлекся, я надеюсь, что Вы понимаете что-то из этого :-)

50
ответ дан 30 November 2019 в 05:40
поделиться

Хорошая книга, которая говорит о компьютерах для неинженеров, 'Код' Charles Petzold . Я не вспоминаю точно, если это покрывает точно Ваш вопрос, но я думаю так. Если Вам интересно достаточно для движения дальше, это - хороший выбор.

Код http://ecx.images-amazon.com/images/I/11MYtZPhJEL._BO2,204,203,200_PIsitb-sticker-arrow-click,TopRight,35,-76_AA198_SH20_OU01_.jpg

9
ответ дан 30 November 2019 в 05:40
поделиться

Язык программирования является на самом деле очень абстрактным языком, который преобразовывается вниз на очень очень простой язык, который на самом деле понимают компьютеры.

В основном, компьютеры действительно только понимают машинный язык, который является языком Бэйсик, реализованным в двоичном файле (1's и 0). Один уровень выше этого является ассемблером, который является очень языком примитива, который, по крайней мере, человекочитаем.

На высокоуровневом языке, у нас могло бы быть что-то как:

Person.WalkForward(10 steps)

В Машинном коде это было бы:

Lift Persons Left Foot Up
Lean Forward
Place Left Foot Down
Lift Right Foot up
Lean Forward 
Place Right Foot Down
etc

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

компилятор А берет высокоуровневый язык, который легче для человека понять и преобразовывает его вниз в машинный код, так, чтобы компьютер мог выполнить его.

16
ответ дан 30 November 2019 в 05:40
поделиться

В самом простом случае программа звонила , компилятор берет слова языка программирования, которые Вы пишете, и преобразовывает их в машинный язык , который может понять компьютер. Компиляторы понимают определенный язык программирования (C#, Java, и т.д.), который имеет очень определенные правила о том, как Вы объясняете компилятору, что Вы хотите, чтобы он сделал.

Интерпретация и понимание тех правил являются большей частью того, о чем Переполнение стека. :)

6
ответ дан 30 November 2019 в 05:40
поделиться

Программирование состоит в том, где Вы берете серию шагов, которые решают определенную проблему и выписывают им на определенном языке, который требует определенного синтаксиса. Когда Вы описали те шаги на языке, можно использовать компилятор (согласно комментарию Greg), который переводит из того языка в один, компьютер может интерпретировать.

искусство находится в проверке, что Вы описываете шаги достаточно хорошо :)

2
ответ дан 30 November 2019 в 05:40
поделиться

Вы могли выдержать сравнение как программирование работ к переводу между языками. Скажите, что Вы были на необитаемом острове с 2 другими людьми. Вы только говорите на французском языке. Человек номер 1 (мы назовем его Fred) только говорит на французском и японском языке. Человек 2 (Bob) только говорит на японском языке. Скажите, что необходимо попросить, чтобы Bob, чтобы пойти помочь Вам собрал некоторые дрова. Вообразите в этом случае, что Вы - программа, и Bob является компьютером. Вы говорите Fred на французском языке, "Может Вы говорить, что Bob для прибытия помогает мне". Fred переводит на японский язык и просит, чтобы Bob помог Вам. В этом случае Fred был бы компилятором. Он переводит запрос во что-то, что Bob может понять. Это - вид того, как работает компьютерная программа.

существует польза статья How Stuff Works , которая объясняет вещи.

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

1
ответ дан 30 November 2019 в 05:40
поделиться

ЦП имеет регистр (штука, которая может сохранить число), названный указателем команд. Указатель команд говорит что адрес в памяти вытянуть инструкцию от. ЦП вытягивает инструкцию, выполняет ее и переходит к следующей инструкции, если в инструкции, что она выполнилась, не говорилось для движения где-то в другом месте. Эти инструкции довольно слабы. Добавьте это число к тому числу. Сохраните это число там. Возьмите следующую инструкцию из-за там. Программа звонила, компилятор анализирует Вашу программу и превращает ее в машинный код (я пропускаю несколько шагов здесь).

Две книги, которые дадут Вам достойный обзор этого процесса, SICP и ДЕТЕКТИВЫ .

0
ответ дан 30 November 2019 в 05:40
поделиться

Несколько человек уже предоставили сводки процесса перевода с типичного языка программирования вниз к фактическому машинному коду, который может выполнить процессор.

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

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

Как альтернатива, существует большая старая игра, названная Corewar, в котором Вы пишете небольшие программы с помощью упрощенного машинного языка. Эти программы затем борются друг против друга за выживание. Можно записать основные программы в необработанном машинном языке, и затем существует система макросов, таким образом, Вы не должны повторять себя так, и это - первый шаг к полнофункциональному языку.

Другой легкий, вознаграждение, но вещь низкого уровня сделать должен программировать простой встроенный контроллер как Ардуино . Существует много легких введений как этот доступно. Вы будете все еще использовать компилятор, но получающийся машинный код легче понять (если Вы хотите к), потому что возможности процессора настолько более просты.

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

1
ответ дан 30 November 2019 в 05:40
поделиться

Очень просто программирование является действием предоставления компьютера ряда инструкций на языке, что это может понять. Программисты обычно пишут инструкции на высокоуровневом языке программирования и тех, которые инструкция затем переводится на двоичный язык, который понимает компьютер. Программы, которые делают этот перевод, называют компиляторами.

1
ответ дан 30 November 2019 в 05:40
поделиться

У меня есть два сумасшедших предложения. Возвратитесь вовремя!

1. Получите программируемый калькулятор.

А программируемый калькулятор является обычным калькулятором, можно сделать обычный материал с ним: введите номера, введите операционные знаки, и после нажатия equel клавиши, можно считать результат на крошечном дисплее. Кроме того, программируемый калькулятор может сохранить короткие последовательности нажатий клавиш как программа, которая позже может быть "воспроизведена" с единственным нажатием клавиши. Скажите, Вы устанавливаете эту последовательность как программу (одна инструкция на строку):

(Start)
*
2
+
1
=
(Stop)

Теперь Вы переносите пользовательскую операцию: нажатие ключа "программы" (или к какому Вы присвоились) он выполнит последовательность без Вашей дополнительной помощи и умножит содержание дисплея с 2 и добавит 1 - это - программа!

Позже можно попробовать более расширенные методы: хранение временных результатов к памяти, перейдите на результате.

Профессионалы:

  • калькулятор А является знакомой средой. У Вас уже есть основы.
  • Это просто. Вы не должны изучать партию инструкций и методов программирования.
  • современные языки программирования далеки от земли, в то время как программируемые калькуляторы "находятся на ней". Вы изучите основные принципы: память, ответвление, элементарные операции. Компьютеры работают точно то же (на уровне машинного языка).
  • Вы встретите проблемы низкого уровня: память, деление на нуль.
  • Это чрезвычайно прохладно.

Недостатки:

  • Это является устаревшим. Необходимо выучить современный язык программирования, который будет отличаться.
  • Это неудобно (гм, это - про вместо этого: Вы не можете использовать удобные игрушки щелчка-и-игры). Возможно, Вы не можете даже сохранить свой код.
  • Это не тривиальная задача получить ту. Можно примерить eBay. Кроме того, не будет никакой проблемы с документацией, большинство моделей имеет большие группы пользователей в Интернете.

лучший выбор, по моему скромному мнению, TI-59.

2. Выучите язык Basic с помощью эмулятора.

при включении машины, которые имеют встроенное язык Basic интерпретатор, это готово принять команды и работает, как Вы вводите. Во-первых, можно попробовать некоторые инструкции в командном режиме, например:

PRINT 5*4

Это распечатает "20" в следующей строке, ничего себе. Если Вы играли достаточно в командном режиме, можно организовать инструкции в программы, то можно выполнить, отредактировать, улучшить его.

Профессионалы:

  • ОСНОВНОЙ реальный язык программирования, разработанный для образования.
  • , Когда Вы позже встретите современный язык программирования и обнаружите различия, Вы будете видеть прогресс методов программирования (например, процедурный, структуры и т.д.) прошлых 30 лет.
  • здорово, особенно если Вы получаете реальный, не только эмулятор.

Недостатки

  • Это является устаревшим. Почти 30 лет передали начиная с того возраста.
  • Старые машины являются компактными, закрытыми системами. Нет никаких файлов (в форме сегодня, мы используем их), папки, типы файлов, она может смутить новичков.

Моя любимая Базовая система Commodore 16 (Плюс/4) , который очень похож на известный C64. но более удобный. Я предпочитаю эмулятор YAPE , он может сохранить/загрузить снимки памяти или ОСНОВНЫЕ программы в файл.

1
ответ дан 30 November 2019 в 05:40
поделиться

Как люди уже отмечают, существует некоторая предварительная программа (обычно "компилятор"), который переводит слова Вашей программы на более многоречивый "более низкий уровень" язык, названный "машинным кодом".

машинный код состоит из очень простых инструкций, которые уже "поняты" под (или, по крайней мере, имейте смысл с точки зрения), базовый процессор. Например, инструкция, которая копирует данные из ячейки памяти, и в специальную часть процессора (названный "аккумулятором", где простой arithetic может быть сделан к нему.) или инструкция добавить содержание двух из слотов в аккумуляторе.

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

0
ответ дан 30 November 2019 в 05:40
поделиться

Компьютер имеет предварительно установленное количество инструкций; вещь, которую это уже знает, как сделать. Компьютерная программа является просто списком инструкций, что компьютер выполнится последовательно.

Ранние программы были записаны непосредственно на машинном языке. Программисты, для создания их жизней легче, начали создавать абстракции для упрощения программ, которые они должны записать. Со временем все больше абстракций добавляется, как слои луковицы, но все это сводится к по существу тому же самому - выполнение ряда инструкций.

, Если Вы хотите узнать о программировании, не фокусируясь на компиляторах, технологии, и т.д., Вы получаете хороший признак того, что - программа, когда Вы начинаете создавать 3D сцены в Alice. Alice избавлена от Университета Карнеги-Меллон. Вы заканчиваете, учатся как программированию, не пытаясь изучить протрамбовку.

, Если бы однако Вы хотите узнать больше о технических деталях, Ваш лучший выбор состоял бы в том, чтобы посмотреть на некоторые вводные compi-научные университетские учебники. Следующий , Как C Программирующие Работы мог бы также дать Вам некоторые ответы.

0
ответ дан 30 November 2019 в 05:40
поделиться

В основном Вы начинаете с чем-то простым, таким как:

print("Hello World");

Затем Вы просто опрыскиваете синтаксические сахарные и волшебные маркеры по нему, пока это не делает то, что Вы хотите!

-2
ответ дан 30 November 2019 в 05:40
поделиться
Другие вопросы по тегам:

Похожие вопросы: