Исключение нулевого указателя - это индикатор того, что вы используете объект, не инициализируя его.
Например, ниже - класс ученика, который будет использовать его в нашем коде.
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 является действительно через '#' оператором, но простая транслитерация предлагаемого решения получает ошибку компиляции:
#define TEST_FUNC test_func
#define TEST_FUNC_NAME #TEST_FUNC
#include <stdio.h>
int main(void)
{
puts(TEST_FUNC_NAME);
return(0);
}
синтаксическая ошибка идет, 'помещает ()' строку - проблемой является 'случайный #' в источнике.
раздел In 6.10.3.2 из стандарта C, '# оператор', говорит это:
Каждый маркер предварительной обработки # в заменяющем списке для подобного функции макроса должен сопровождаться параметром как следующий маркер предварительной обработки в заменяющем списке.
проблема состоит в том, что можно преобразовать макро-аргументы строкам - но Вы не можете преобразовать случайные объекты, которые не являются макро-аргументами.
Так, для достижения эффекта Вы после, несомненно необходимо сделать некоторую дополнительную работу.
#define FUNCTION_NAME(name) #name
#define TEST_FUNC_NAME FUNCTION_NAME(test_func)
#include <stdio.h>
int main(void)
{
puts(TEST_FUNC_NAME);
return(0);
}
я не абсолютно ясен о том, как Вы планируете использовать макросы, и как Вы планируете избежать повторения в целом. Этот немного более тщательно продуманный пример мог бы быть более информативным. Использование макро-эквивалента STR_VALUE является идиомой, которая необходима для получения желаемого результата.
#define STR_VALUE(arg) #arg
#define FUNCTION_NAME(name) STR_VALUE(name)
#define TEST_FUNC test_func
#define TEST_FUNC_NAME FUNCTION_NAME(TEST_FUNC)
#include <stdio.h>
static void TEST_FUNC(void)
{
printf("In function %s\n", TEST_FUNC_NAME);
}
int main(void)
{
puts(TEST_FUNC_NAME);
TEST_FUNC();
return(0);
}
<час> <глоток> * В то время, когда этот ответ был сначала записан, имя shoosh, используемое 'Застенчивый' в качестве части имени.
@Jonathan Leffler:Спасибо. Ваши работы решения.
А полный рабочий пример:
/** compile-time dispatch
$ gcc -Wall -DTEST_FUN=another_func macro_sub.c -o macro_sub && ./macro_sub
*/
#include <stdio.h>
#define QUOTE(name) #name
#define STR(macro) QUOTE(macro)
#ifndef TEST_FUN
# define TEST_FUN some_func
#endif
#define TEST_FUN_NAME STR(TEST_FUN)
void some_func(void)
{
printf("some_func() called\n");
}
void another_func(void)
{
printf("do something else\n");
}
int main(void)
{
TEST_FUN();
printf("TEST_FUN_NAME=%s\n", TEST_FUN_NAME);
return 0;
}
Пример:
$ gcc -Wall -DTEST_FUN=another_func macro_sub.c -o macro_sub && ./macro_sub
do something else
TEST_FUN_NAME=another_func
#include <stdio.h>
#define QUOTEME(x) #x
#ifndef TEST_FUN
# define TEST_FUN func_name
# define TEST_FUN_NAME QUOTEME(TEST_FUN)
#endif
int main(void)
{
puts(TEST_FUN_NAME);
return 0;
}
Ссылка: Википедия препроцессор C страница