Когда вы объявляете ссылочную переменную (т. е. объект), вы действительно создаете указатель на объект. Рассмотрим следующий код, в котором вы объявляете переменную примитивного типа 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++, которая делает язык намного более применимым. Ваш пример стал бы:
BOOST_FOREACH( Thingy& t, lostOfThingys ) {
// do something with 't'
}
Повышение имеет тонны инструментов, что справка делает C++ лучшим языком.
Сборка "мусора" - необходимость (как способность избежать ее использования, когда необходимый)
Вы не можете отключить сборщик "мусора" временно. Вам был бы нужен детерминированный сборщик "мусора" тогда. Но такой зверь действительно идет с хитом производительности также. Я думаю BEA, JRockit является таким зверем, и затем необходимо придерживаться Java.
Только для комментария примера; определение типа является Вашим другом...
typedef std::vector<Thingy> Thingys;
Thingys::const_iterator it = lotsOfThingys.begin()
XNA является Вашим лучшим выбором, я думаю. Будучи поддерживаемым платформой.NET можно создать для Windows или платформы Xbox 360 путем простого изменения настроек в Game Studio. Лучше всего все же все инструменты свободны!
, Если Вы решаете пойти с XNA, можно легко начать использовать их руководство по быстрому началу работы Руководство по быстрому началу работы XNA
, Это было вознаграждение и забавный опыт для меня до сих пор и хорошее повреждение от управления памятью C++.
Objective C похож на хорошее соответствие для Ваших требований (последняя версия с дополнительным GC), хотя это слишком динамично и подобно Smalltalk для моего вкуса.
Если Ваша цель является ПК, я думаю, что можно попробовать C#, или встроить Lua в приложение C++ и выполнить сценарии для 'высокоуровневого' материала. Однако, если Ваша цель является консолью, Вы должны управлять своей собственной памятью!
При предназначении для Windows C++ / CLI (.NET Microsoft 'справилась', диалект C++) интересная возможность, особенно если Вы хотите усилить свой опыт C++. Можно смешать собственный код (например, звонит в C-библиотеки-стилей) с управляемым кодом.NET вполне беспрепятственно, и используйте в своих интересах GC.NET и библиотеки.
До опасений по поводу GC, влияющего на 'оперативную' производительность, я думаю, что те склонны быть раздутыми. Относящийся к разным поколениям GC.NET очень хорош в никогда занимании время, чтобы сделать набор, если Вы не находитесь в некоторой критической ситуации низкой памяти. Я пишу код.NET, который взаимодействует с электронными обменами производных, где задержки == много $$$, и у нас никогда не было связанной с GC проблемы. Несколько миллисекунд являются долгим, долгим временем для GC, но не для человека, взаимодействующего с частью программного обеспечения, даже 'оперативная' игра. При реальной необходимости в истинной "оперативной" производительности (для медицинских устройств, управления процессом, и т.д.) тогда Вы не можете использовать Windows так или иначе - это - просто не ОС в реальном времени.
Партия игровых механизмов может соответствовать Вашей потребности, я предполагаю. Например, с помощью SDL или Каира, если мобильность необходима. Партия языков сценариев (прибывающий в целом с легким синтаксисом и сборкой "мусора") имеет привязку к ним холст.
Flash мог бы быть другой альтернативой.
я просто укажу Обработка , который является язык программирования с открытым исходным кодом и среда для людей, которые хотят программировать изображения, анимацию и взаимодействия.
На самом деле, это - тонкая обертка вокруг Java, заставляя его быть похожим на язык сценариев: это имеет (примитивный) IDE, когда можно ввести несколько строк кода и поразить Выполнение, даже не имея необходимость сохранить файл. На самом деле это обертывает код вокруг класса и добавляет основное () вызов, компилирует его и выполняет его в окне.
Партия людей используют его для выставок в реальном времени (VJ и подобный). Это имеет силу и ограничения Java, но добавляет из поля много хороших оберток (библиотеки) для упрощения доступа к Java2D, OpenGL, SVG, и т.д.
Так или иначе, это стало моделью простого графического языка: существует несколько приложений, пытающихся подражать Обработке на других языках, как Ruby, Scala или Python. Один из самых впечатляющих является реализацией JavaScript, с помощью canvas
компонент, реализованный в Firefox, Safari, Opera, и т.д.
Давайте не забывать упоминать новое 'автоматическое' использование:
auto it = lotsOfThingys.begin(); // Let the compiler figure it out.
auto it2 = lotsOfFoos.begin();
if (it==it2) // It's still strongly typed; a Thingy iter is not a Foo iter.
Я сказал бы, что язык программирования D является хорошим вариантом. Можно связаться с объектными файлами C и интерфейсом с кодом C++ через библиотеки C. D имеет сборку "мусора", встроенный ассемблерный код, и разработчики игр создали привязку к библиотекам SDL и OpenGL и также активно работают над новой пчелой разработки игр. Я люблю D. Слишком плохо мое задание не требует, чтобы это было использование.: (
C# является хорошим ответом здесь - он имеет справедливую сборку "мусора" (хотя необходимо было бы представить его вполне немного - для изменения способа, которым Вы обрабатываете вещи теперь, когда вся обработка памяти вне Ваших рук), он прост в использовании, имейте много примеров, и хорошо документируется. В 3D отделе это оказывает полную поддержку для программ построения теней и эффектов и так - который был бы моим выбором.
однако, C# не так эффективен как C++ и происходит медленнее из-за издержек, поэтому если это - скорость и гибкость для использования какого-либо приема в книге, Вам нравится (с указателями и блоком, если бы Вам нравится пачкать руки) - придерживаются C++, и цена записала бы пути больше кода, как Вы упомянули, но имеющий полный контроль над всем включая управление памятью.
Нет никаких истинных альтернатив для больших заголовков AAA, особенно на консолях. Для меньших заголовков C# должен сделать.
Я полностью согласен с упоминанием о C# для графического программирования. Это имеет небольшой недостаток того, чтобы быть управляемым языком, и разрешение полной свободы сборщика "мусора" по Вашему приложению является framerate самоубийством через некоторое время, но с некоторыми относительно интеллектуальными выделениями пула, сделанными рано в сроке действия программы можно избежать любых реальных проблем.
Несколько человек уже упомянули XNA, которая является невероятно дружественной и хорошо зарегистрирована, и я хотел бы повторить ту рекомендацию также. Я лично использую его для своих игровых проектов хобби, и это рассматривало меня очень хорошо.
XNA не является единственной альтернативой, все же. Существует также SlimDX, который находится в процессе постоянного развития как средство обеспечения минимизированной обертки DirectX подобным способом как Управляемый DirectX (который был, я верю, прекращенный Microsoft в пользу XNA). Оба достойны исследования: http://code.google.com/p/slimdx/
Иногда, смотря вне проторенного пути можно найти реальный драгоценный камень. Вы могли бы хотеть рассмотреть PureBasic (Не позволяйте имени ввести в заблуждение Вас). Вот некоторые детали:
Функции PureBasic
Посещение онлайн-форум для получения лучшее представление о PureBasic ( http://www.purebasic.fr/english/index.php ) или основной сайт: www.purebasic.com
Некоторое изменение Lisp, который компилирует в машинный код, могло быть почти с такой скоростью, как C++ для этого вида программирования. Непослушная Собака команда создала версию Lisp, названного Игра Ориентированный блок Lisp , который они раньше создавали несколько заголовков AAA, включая серию Jak и Daxter. Два главных препятствия для подхода Lisp в игровой индустрии были бы раскопанной природой разработки C/C++ (оба инструмента, и человеческие активы в большой степени инвестируют в C/C++), а также трудность нахождения талантливых инженеров, которые являются звездами и в игровом домене программирования и в языке Lisp.
Многие команды программистов в промышленности смещаются к гибридному подходу, где код в реальном времени, особенно графика и код физики, написан в C или C++, но игровая логика сделана в высокоуровневом языке сценариев, который доступен для и доступен для редактирования программистами и непрограммистами одинаково. Lua и Python оба популярны для высокоуровневых сценариев.
Как James (hopkin), для меня, гибридный подход является лучшим решением. Python и C++ являются хорошим выбором, но другим стилем как C#/C ++ работы. Все зависит Вашего графического контекста. Для игры XNA является хорошей платформой (ограниченный win32), в этом случае C#/C ++ является лучшим решением. Для аналитической визуализации Python/C++ принят (как привязка vtk в Python). Для игры для мобильных устройств JAVA/C++ может работы...
Возможно, гибридный подход. Python и C++ делают хорошую комбинацию (см., например, PyGame).
В реальном времени + сборка "мусора" не соответствует очень хорошо, я боюсь.
немного трудно сделать любые гарантии ответа в режиме реального времени, если сборщик "мусора" может умереть когда-либо и потратить неопределенный объем обработки...
Я не соглашаюсь с Вашей предпосылкой. Когда используется тщательно и правильно, C++ является большим языком, специально для домена как графика в реальном времени, где скорость является существенной.
управление памятью становится легким, если Вы разрабатываете свою систему хорошо и используете stl контейнеры и интеллектуальные указатели.
std::vector::const_iterator it = lotsOfThingys.begin())
станет намного короче, если Вы будете использовать
using namespace std;
typedef vector::const_iterator ThingyConstIter;
, И можно значительно сократить время компиляции путем разбивания систем в довольно автономные модули, при помощи предварительно скомпилированных заголовков, или при помощи идиомы PIMPL.
C# является хорошим языком, который соответствует Вашим требованиям, и он определенно подходит для графики благодаря усилиям Microsoft предоставить ему большие инструменты и библиотеки как Visual Studio и XNA.
Что относительно Язык программирования D ?
Некоторые ссылки запросили в комментарии:
Не упускайте из виду независимые языки в вашем квесте. Emergence BASIC от Ionic Wind Software имеет встроенный движок DirectX 9, поддерживает ООП и может легко взаимодействовать с библиотеками C.
Джеймс.
Как разработчик / исследователь / профессор 3D Приложения VR в течение примерно 20 лет, я бы сказал, что альтернативы нет (кроме, возможно, C). Единственный способ уменьшить задержку и обеспечить взаимодействие в реальном времени - это оптимизированный скомпилированный язык (например, C или C ++) с доступом к быстрой надежной библиотеке трехмерной графики, такой как OpenGL. Хотя я согласен, что приходится все кодировать - это фрустрация, это также важно для производительности и оптимизации.
Лучшая среда для вашего проекта - это та, в которой вы выполняете свою задачу максимально быстро. Это - особенно для 3D-графики - включает библиотеки.
В зависимости от задачи вам может сойти с рук небольшой взлом DirectX. Затем вы можете использовать .NET и slimdx . Управляемые языки, как правило, быстрее программировать и легче отлаживать.
Возможно, вам нужен действительно хороший 3D-движок? Попробуйте Ogre3D или Irrlicht . Вам нужно качество коммерческого уровня (кто-то может поспорить, что Ogre3D предлагает это) - выбирайте Cryengine или Unreal. С Ogre3D и Irrlicht вы также можете использовать .NET, хотя порты не всегда актуальны, а плагины не так легко включать, как в версиях C ++. Думаю, для Cryengine / Unrealengine у вас не будет реального выбора.
Вам нужно более портативное? OpenGL для спасения - хотя вам может понадобиться некоторая оболочка (например, SDL ).
Вам также нужен графический интерфейс? Возможно wxWidgets , QT .
У вас уже есть набор инструментов? Ваши библиотеки должны поддерживать форматы файлов.
Вы хотите написать библиотеку? C / C ++ может быть решением, поскольку большая часть мира может использовать библиотеки C / C ++. Возможно, с использованием COM?
Есть еще много проектов / библиотек, которые я не упомянул (XNA, Boost, ...), и если вы хотите создать какую-то программу, которая не только отображает 3D-графику, вы можете могут иметь и другие потребности (ввод, звук, сеть, искусственный интеллект, база данных, графический интерфейс, ...)
Подводя итог: язык программирования - это инструмент для достижения цели. Это следует рассматривать в контексте поставленной задачи.
Я очень успешно использовал C ++ для движка с приложением, написанным на Lua поверх. JavaScript также очень практичен, сейчас существует последнее поколение JS-движков на основе JIT (tracemonkey, V8 и т. Д.).
Я думаю, что C ++ будет с нами еще некоторое время; даже Тим Суини на самом деле еще не переключился на Haskell (pdf), AFAIK: -)
Хороший вопрос. Что касается `` заставлять меня слишком много печатать '', C ++ 0x, похоже, решает большинство из них. как уже упоминалось:
auto it = lotOfThingys.begin ()) // ... вывод типа, как в * ML VS2010beta уже реализует это.
Что касается управления памятью - для эффективности - вам все равно придется хорошо отслеживать распределение памяти, со сборкой мусора или без нее (т.е. создавать пулы памяти, иногда повторно использовать выделенный объект), так что в конечном итоге будет ли ваша среда собрана мусором или нет, не имеет значения. Вам также нужно будет явно вызвать gc (), чтобы память не фрагментировалась. Всегда важно иметь последовательные способы управления памятью. RAII - убийственная особенность C ++ Другое дело, что память - это всего лишь один ресурс, вам все равно нужно отслеживать другие ресурсы с помощью GC, поэтому RIAA.
В любом случае, C # - хорошая альтернатива во многих отношениях, я считаю его очень хорошим языком, особенно возможность писать в нем код функционального стиля (симпатичный синтаксис лямбда ->, сопоставление / выбор синтаксиса LINQ и т. д.), таким образом, возможность писать параллельный код; пока это все еще "стандартные фигурные скобки", когда они нужны вам (или вашим коллегам).
Я голосую C ++ 0x. Частичная поддержка уже доступен в GCC-4.3 +, используя флаг -std = C ++ 0x.
Взгляните на объект Delphi / Pascal и некоторые примеры: http://www.delphigamer.com или http://glscene.cjb.net/