Исключение нулевого указателя - это индикатор того, что вы используете объект, не инициализируя его.
Например, ниже - класс ученика, который будет использовать его в нашем коде.
public class Student {
private int id;
public int getId() {
return this.id;
}
public setId(int newId) {
this.id = newId;
}
}
Приведенный ниже код дает вам исключение с нулевым указателем.
public class School {
Student obj_Student;
public School() {
try {
obj_Student.getId();
}
catch(Exception e) {
System.out.println("Null Pointer ");
}
}
}
Поскольку вы используете Obj_Student
, но вы забыли инициализировать его, как в правильном коде, показанном ниже:
public class School {
Student obj_Student;
public School() {
try {
obj_Student = new Student();
obj_Student.setId(12);
obj_Student.getId();
}
catch(Exception e) {
System.out.println("Null Pointer ");
}
}
}
Если бы Вы хотите записать портативный код C, то я предложил бы, чтобы Вы записали в C89 (старый ANSI C стандарт). Этот стандарт поддерживается большинством компиляторов.
Intel C Compiler имеет очень хорошая поддержка C99 , и это производит быстрые двоичные файлы. (Спасибо 0x69!)
MSVC поддерживает , некоторые новые функции и Microsoft планируют расширить поддержку в будущих версиях.
GCC поддерживает некоторые новые вещи C99. Они составили таблицу о состояние функций C99 . Вероятно, самой применимой функцией C99 является массив переменной длины, и GCC поддерживает его теперь. Лязг (C LLVM, на который выходят), поддерживает большинство функций кроме прагм с плавающей точкой.
Википедия, кажется, имеет хорошая сводка поддержки C99 из компиляторов.
Кто-то упомянул, что компилятор Intel имеет поддержку C99. Существует также компилятор C/C++ Comeau , который полностью поддерживает C99. Это единственные, о которых я знаю.
функции C99, которые я не использую, потому что они не хорошо поддерживаются, включают:
функции C99, которые я регулярно использую, которые, кажется, вполне прилично поддерживаются (кроме Microsoft):
stdint.h
snprintf()
- MS имеет нестандартное _snprintf()
, который имеет серьезные ограничения не всегда пустой указатель, завершающий буфер и не указывающий, насколько большой буфер должен быть Для работы вокруг неподдержки Microsoft, я использую общественное достояние stdint.h
от MinGW (что я изменил, чтобы также работать над VC6), и почти общественное достояние snprintf()
от Holger Weiss
Объекты, которые не поддерживаются Microsoft, но будут все еще использовать на других компиляторах в зависимости от проекта, включайте:
_Pragma()
- это делает прагмы намного больше применимыми Для gcc, существует таблица со всеми поддерживавшими функциями . Это, кажется, что самой большой вещью, отсутствующей, являются массивы переменной длины. Большинством других недостающих возможностей являются проблемы библиотеки, а не функции языка.
Взгляд состояние C99 suport для GNU для получения дополнительной информации на которых функции в настоящее время поддерживаются.
Sun Studio подразумевается для поддержки всей спецификации C99. Я никогда не использовал их, таким образом, я не могу подтвердить.
я не полагаю, что компилятор Microsoft поддерживает спецификацию C99 в целом. Они намного более фокусируются на C++ в данный момент
Microsoft, кажется, отслеживает стандарты C++, но не имеет никакой поддержки C99. (Они могут избирательно подойти к выбору некоторых функций, но, как могли говорить, избирательно подходили к выбору C++ 0x, где существует перекрытие.)
С Visual Studio.NET 2003, новым проектам включили опцию 'Compile C code as C ++ (/TP)' по умолчанию.
Компилятор IBM c поддерживает c99 при вызове как c99, но не при вызове как cc или xlc.