Когда вы объявляете ссылочную переменную (т. е. объект), вы действительно создаете указатель на объект. Рассмотрим следующий код, в котором вы объявляете переменную примитивного типа int
:
int x;
x = 10;
В этом примере переменная x является int
, и Java инициализирует ее для 0. Когда вы назначаете его 10 во второй строке, ваше значение 10 записывается в ячейку памяти, на которую указывает x.
Но когда вы пытаетесь объявить ссылочный тип, произойдет что-то другое. Возьмите следующий код:
Integer num;
num = new Integer(10);
Первая строка объявляет переменную с именем num
, но она не содержит примитивного значения. Вместо этого он содержит указатель (потому что тип Integer
является ссылочным типом). Поскольку вы еще не указали, что указать на Java, он устанавливает значение null, что означает «Я ничего не указываю».
Во второй строке ключевое слово new
используется для создания экземпляра (или создания ) объекту типа Integer и переменной указателя num
присваивается этот объект. Теперь вы можете ссылаться на объект, используя оператор разыменования .
(точка).
Exception
, о котором вы просили, возникает, когда вы объявляете переменную, но не создавали объект. Если вы попытаетесь разыменовать num
. Перед созданием объекта вы получите NullPointerException
. В самых тривиальных случаях компилятор поймает проблему и сообщит вам, что «num не может быть инициализирован», но иногда вы пишете код, который непосредственно не создает объект.
Например, вы можете имеют следующий метод:
public void doSomething(SomeObject obj) {
//do something to obj
}
В этом случае вы не создаете объект obj
, скорее предполагая, что он был создан до вызова метода doSomething
. К сожалению, этот метод можно вызвать следующим образом:
doSomething(null);
В этом случае obj
имеет значение null. Если метод предназначен для того, чтобы что-то сделать для переданного объекта, целесообразно бросить NullPointerException
, потому что это ошибка программиста, и программисту понадобится эта информация для целей отладки.
Альтернативно, там могут быть случаи, когда цель метода заключается не только в том, чтобы работать с переданным в объекте, и поэтому нулевой параметр может быть приемлемым. В этом случае вам нужно будет проверить нулевой параметр и вести себя по-другому. Вы также должны объяснить это в документации. Например, doSomething
может быть записано как:
/**
* @param obj An optional foo for ____. May be null, in which case
* the result will be ____.
*/
public void doSomething(SomeObject obj) {
if(obj != null) {
//do something
} else {
//do something else
}
}
Наконец, Как определить исключение & amp; причина использования Трассировки стека
Опыт является ключевым, зная "правила", и синтаксис языка является, конечно, необходимостью, но это - только основа. Изучение распространенных ошибок и идиом для того, чтобы сделать вещи правильно является ключевым.
Знание, что, если какие-либо ресурсы существуют для получения справки от того, в то время как программирование, и конечно, зная Вы - набор инструментальных средств. Я знал много C++ "эксперты", которые никогда не использовали отладчик или средство отслеживания памяти. Если Вы спрашиваете меня, быть экспертом в чем-то отличается от того, чтобы быть опытным в чем-то в Вас знающий все аспекты его.
Как насчет того, что считал "Опытное Программирование C" липой Peter van der и запоминанием всего он покрыл?
Я думаю, что справедливый ответ понял бы все intracies ISO C.
действительность, как любой comp.lang.c постоянный клиент скажет Вам, то, что почти ничто, что должны сделать люди, не может быть сделано в чистом ISO C, поскольку обычно необходимо взаимодействовать со средой более четко определенным способом. Это - то, где POSIX появляется.
я не закрыл бы глаза ни на кого, кто самооценил себя как "Эксперт", у которого были основательное понимание языка C, достойное понимание того, что ISO C обещает, и понимание работы функций POSIX.
Я сказал бы, что для любого данного языка, опыт является ключевой вещью. Это просто занимает время, чтобы выучить язык и изучить API и 'идиомы', которые использует язык. Является ли кто-то экспертом в чем-нибудь или не является чем-то, что нужно спросить коллег. Для перефразирования Jeff Foxworthy, "При ответе на большее количество вопросов, чем Вы спрашивают, Вы могли бы быть экспертом".
Вообще говоря, никто присутствующий на ярмарке вакансий не является экспертом в C.
я сказал бы точку, в которой Вы - эксперт в C, то, где у Вас есть знание стандарта до такого градуса, что Вы понимаете, почему вещи как устройство Вареного пудинга работают, не нуждаясь в отдельных объяснениях. Кроме того, Вам нужны несколько больших проектов под Вашим поясом.
Недостаток в стандартном тесте нет действительно никакого способа решить то, что опытный уровень слишком, вот несколько моих решающих испытаний, общий список отличается, я уверен.
, не смотря на документацию:
Знают приоритет основных операторов, таким образом, Вы не должны замусорить свой код parens, чтобы не получать неправильный порядок оценки
Быть в состоянии записать, что прототип для простого указателя функции
Быть довольным передачей указателя на указатель
Понимает блок, функцию, объем модуля
существует больше объектов как это.
, С другой стороны, я не думаю, что необходимо быть в состоянии понять или быть в состоянии выписать устройство Вареного пудинга, или фигура запутала конкурсы C в голове для рассмотрения себя экспертом.
, Даже если бы я считал меня экспертом (не уверенный я делаю) я, вероятно, никогда не требовал бы его в собеседовании.
Andrew
Вопросы об интервью как это всегда жестки. Вы хотите хвастаться немногим, но не походить на хвастуна.
, Если бы Вы сделали много с C (говорят, работал над проектами с открытым исходным кодом в C), тогда я ответил бы этим, но не только, указав на список достижений на Вашем резюме, но путем разговора об одном или нескольких из них и что было особенно интересно или сложно об этом (в отношении его использования C).
Вы - эксперт в C, когда можно записать собственный компилятор C.
Ответы на этот вопрос действительно делают для некоторого интересного чтения - кажется, что мы не можем надеть хорошую сходимость, что определяет эксперта здесь. Чем надежда там будет на более широком форуме как ярмарка заданий?:-)
, Но вставить мои собственные 2 цента... Я думаю, что существует два вида эксперта C.
я взял бы одного из последних по первому в heartbeat. Если у Вас есть блок кода, записанного экспертом, который является настолько хрупким, который может только быть считан и понят под другим экспертом тогда для всех намерений, что код неудобен в сопровождении. Все очень хорошо, что автор этого кода помнит запутанность преобразований типов посреди выражений, но намного лучше, если код был записан так, чтобы это было абсолютно однозначно.
Проекты обычно имеют достаточно технической проблемы, не добавляя потребность во всех членах команды запомнить C '99 стандартов.
Некоторые могут не согласиться, но я думаю, что опыт является ключевым для того, чтобы быть экспертом на любом языке. Я знаю много людей, которые имеют мимо сертификационного теста, но не могли применить их знание ни к чему практическому в реальном мире.
, Таким образом, я думаю, в целом будучи экспертом, продукт наличия достаточного знания о данной теме (C) и затем применявший его к достаточному количеству сценариев реального мира, чтобы сделать ошибки, которые все мы делаем и изучаем от них.
Это непосредственно не отвечает на Ваш вопрос (извините), но он мог бы помочь Вам решить, как Вы классифицируете себя.
Вместо просто "эксперта" и "невежественного новичка" я предпочитаю трехуровневую систему экспертных знаний, используемых средневековыми гильдиями:
На ярмарке вакансий? Нет никаких экспертов: общий эксперт.:)
Вы - эксперт в c, если можно ответить на отмеченный "c" всех вопросов на stackoverflow.com без мигания.
Кому-то менее квалифицированному, чем Вы, Вы - эксперт.
кому-то более квалифицированному, чем Вы, Вы - новичок.
Когда я взял интервью с Google, интервьюер сказал мне думать об этом этот путь. В масштабе 1-10 для мастерства C, для высказывания Вы "10", означает, что Вы написали работы и/или книги или были докладчиком на конференции по программированию в C. На основе этого очень немного людей являются 10-ми.
FWIW, я программировал в C в течение 15 лет. Я считаю меня очень опытным. Я, возможно, дал бы мне твердые 8 или 8.5.
Я думаю, что проблема с этим вопросом состоит в том, что ответ довольно бессмыслен. Я вижу, что люди говорят об опыте, и это хорошо, и я вижу, что люди говорят о понимании запутанности языка, и это хорошо. Однако, если бы я нанимал кого-то для работы над моим проектом C, и у меня было волшебство, с 8 шарами, который дал бы мне точный ответ любому (и только один) вопрос, я никогда не просил бы, чтобы это, "Были они эксперт C".
, Почему?
Просто, потому что кто-то - эксперт C, не означает, что они - хороший разработчик программного обеспечения. Опыт и знакомство языка хороши, но я думаю, что они оба превзойдены тем неосязаемым, неисчислимым свойством, которое делает кого-то "хорошим разработчиком программного обеспечения". То, что я пытаюсь сказать, "Что делает Вас C программирование эксперта?" не полезный вопрос, потому что существуют более важные вопросы. Если кто-то будет Good Programmer, они повысятся до случая.
Как пример: можно быть C программирование эксперта и быть ужасными в команде. Можно быть C программирование эксперта и отказаться использовать управление версиями. Можно быть C программирование эксперта, не зная, как к на самом деле ДЕЛАЮТ что-либо с C.
"без" пунктов в тех предложениях одинаково важные вопросы: Что делает Вас хорошим программистом команды? Что лучший способ состоит в том, чтобы использовать SCM x или y? Как Вы приближаетесь к программированию клиент-серверной игры, или приложения биллинга, или веб-браузера, или операционной системы или компилятора, в C? Если кандидат сказал мне "нет, Я не эксперт C", но дал мне большие ответы на эти другие вопросы, я найму их в heartbeat по парню, которого сказало волшебство, с 8 шарами, был эксперт C, но не знает, как проверить его код в подрывной деятельности и не выучил новый язык за 12 лет.
Знает ответ, как правило, часто не делает ошибки, понимает понятия позади кода, знает о его собственных ограничениях, и конечно способный читать (и понять) почти любая часть кода - и способный записать его лучше - но знает достаточно для не беспокойства - так как он был там и сделал это.
Возможность писать статьи / книги не обязательно делает человека опытным программистом. Это требует большого труда, практического опыта и хорошего понимания различных библиотек C.
Удачи!