NullPointerException
s - исключения, возникающие при попытке использовать ссылку, которая указывает на отсутствие местоположения в памяти (null), как если бы она ссылалась на объект. Вызов метода по нулевой ссылке или попытка получить доступ к полю нулевой ссылки вызовет функцию NullPointerException
. Они наиболее распространены, но другие способы перечислены на странице NullPointerException
javadoc.
Вероятно, самый быстрый пример кода, который я мог бы придумать для иллюстрации NullPointerException
, be:
public class Example {
public static void main(String[] args) {
Object obj = null;
obj.hashCode();
}
}
В первой строке внутри main
я явно устанавливаю ссылку Object
obj
равной null
. Это означает, что у меня есть ссылка, но она не указывает на какой-либо объект. После этого я пытаюсь обработать ссылку так, как если бы она указывала на объект, вызывая метод на нем. Это приводит к NullPointerException
, потому что нет кода для выполнения в местоположении, на которое указывает ссылка.
(Это техничность, но я думаю, что она упоминает: ссылка, которая указывает на null, равна 't то же, что и указатель C, указывающий на недопустимую ячейку памяти. Нулевой указатель буквально не указывает на в любом месте , который отличается от указаний на местоположение, которое оказывается недопустимым.)
Можно использовать objcopy для привязки содержания файла к символу, который может использовать программа. Посмотрите, например, здесь для получения дополнительной информации.
Можно всегда писать небольшую программу или сценарий, чтобы преобразовать текстовый файл в заголовочный файл и выполнить его как часть процесса сборки.
Используйте макросы. Технически тот файл был бы файл исходного кода , но он не будет похож на это. Пример:
//queries.incl - SQL queries
Q(SELECT * FROM Users)
Q(INSERT [a] INTO Accounts)
//source.cpp
#define Q(query) #query,
char * queries[] = {
#include "queries.incl"
};
#undef Q
Позже Вы могли сделать все виды другой обработки на том файле тем же файлом, сказать, что захотите иметь массив и карту хеша их, Вы могли переопределить Q, чтобы сделать другое задание и быть сделанными с ним.
Вот образец, который мы использовали для межплатформенного embeddeding файлов. Это довольно упрощенно, но будет, вероятно, работать на Вас.
Вы, возможно, также должны измениться, как это обрабатывает переводы строки в функции escapeLine.
#include <string>
#include <iostream>
#include <fstream>
#include <cstdio>
using namespace std;
std::string escapeLine( std::string orig )
{
string retme;
for (unsigned int i=0; i<orig.size(); i++)
{
switch (orig[i])
{
case '\\':
retme += "\\\\";
break;
case '"':
retme += "\\\"";
break;
case '\n': // Strip out the final linefeed.
break;
default:
retme += orig[i];
}
}
retme += "\\n"; // Add an escaped linefeed to the escaped string.
return retme;
}
int main( int argc, char ** argv )
{
string filenamein, filenameout;
if ( argc > 1 )
filenamein = argv[ 1 ];
else
{
// Not enough arguments
fprintf( stderr, "Usage: %s <file to convert.mel> [ <output file name.mel> ]\n", argv[0] );
exit( -1 );
}
if ( argc > 2 )
filenameout = argv[ 2 ];
else
{
string new_ending = "_mel.h";
filenameout = filenamein;
std::string::size_type pos;
pos = filenameout.find( ".mel" );
if (pos == std::string::npos)
filenameout += new_ending;
else
filenameout.replace( pos, new_ending.size(), new_ending );
}
printf( "Converting \"%s\" to \"%s\"\n", filenamein.c_str(), filenameout.c_str() );
ifstream filein( filenamein.c_str(), ios::in );
ofstream fileout( filenameout.c_str(), ios::out );
if (!filein.good())
{
fprintf( stderr, "Unable to open input file %s\n", filenamein.c_str() );
exit( -2 );
}
if (!fileout.good())
{
fprintf( stderr, "Unable to open output file %s\n", filenameout.c_str() );
exit( -3 );
}
// Write the file.
fileout << "tempstr = ";
while( filein.good() )
{
string buff;
if ( getline( filein, buff ) )
{
fileout << "\"" << escapeLine( buff ) << "\"" << endl;
}
}
fileout << ";" << endl;
filein.close();
fileout.close();
return 0;
}
Это немного ужасно, но можно всегда использовать что-то как:
const char *query_foo = #include "query_foo.txt" const char *query_bar = #include "query_bar.txt"
, Где query_foo.txt содержал бы заключенный в кавычки текст запроса.
Я видел это, чтобы быть сделанным путем преобразования файла ресурсов в исходный файл C только с одним массивом символов, определенным содержащий содержание файла ресурсов в шестнадцатеричном формате (для предотвращения проблем со злонамеренными символами). Этот автоматически сгенерированный исходный файл затем просто скомпилирован и связан с проектом.
должно быть довольно легко реализовать преобразователь для дампа файла C для каждого файла ресурсов также для записи некоторых функций фасада для доступа к ресурсам.