Добавление случая, когда имя класса для объекта, используемого в структуре сущности, такое же, как имя класса для файла с кодировкой веб-формы.
Предположим, у вас есть веб-форма Contact.aspx, чей класс codebehind Свяжитесь с вами, и у вас есть имя объекта Contact.
Затем следующий код вызовет исключение NullReferenceException при вызове context.SaveChanges ()
Contact contact = new Contact { Name = "Abhinav"};
var context = new DataContext();
context.Contacts.Add(contact);
context.SaveChanges(); // NullReferenceException at this line
Ради полноты класса DataContext
public class DataContext : DbContext
{
public DbSet Contacts {get; set;}
}
и класс сущности контакта. Иногда классы сущностей являются частичными классами, так что вы можете распространять их и в других файлах.
public partial class Contact
{
public string Name {get; set;}
}
Ошибка возникает, когда оба класса entity и codebehind находятся в одном и том же пространстве имен. Чтобы исправить это, переименуйте класс сущности или класс codebehind для Contact.aspx.
Причина. Я все еще не уверен в причине. Но всякий раз, когда какой-либо из классов сущностей расширяет System.Web.UI.Page, возникает эта ошибка.
Для обсуждения рассмотрим NullReferenceException в DbContext.saveChanges ()
Вырезать основную папку проекта скомпилированных подпапок («/ target / classes», «target / test-classes»), и у вас есть основной путь к восстановлению папок проекта с помощью:
import java.io.File;
import java.io.IOException;
import java.net.URISyntaxException;
public class SubfolderCreator {
public static void main(String... args) throws URISyntaxException, IOException {
File newResourceFolder = createResourceSubFolder("newFolder");
}
private static File createResourceSubFolder(String folderName) throws URISyntaxException, IOException {
java.net.URL url = SubfolderCreator.class.getResource("/EXISTING_SUBFOLDER/");
File fullPathToSubfolder = new File(url.toURI()).getAbsoluteFile();
String projectFolder = fullPathToSubfolder.getAbsolutePath().split("target")[0];
File testResultsFolder = new File(projectFolder + "src/test/resources/" + folderName);
if (!testResultsFolder.exists()) {
testResultsFolder.mkdir();
}
return testResultsFolder;
}
}
Проблема заключается в том, что путь к классам может содержать несколько корневых каталогов, поэтому отличать то, что можно хранить, было бы сложно без существующего файла или каталога.
Если у вас уже загружен файл.
File existingFile = ...;
File parentDirectory = existingFile.getParentFile();
new File(parentDirectory, "newProperties.properties");
В противном случае попробуйте получить дескриптор каталога, который, как вам известно, уникален в вашем каталоге ресурсов. (Не уверен, что это работает)
URL url = this.getClass().getResource("/parentDirectory");
File parentDirectory = new File(new URI(url.toString()));
new File(parentDirectory, "newProperties.properties");
Как отмечали другие люди, ресурсы получают через ClassLoader. Однако эти два текущих ответа не смогли подчеркнуть следующие моменты:
java.lang.ClassLoader
. Короткий вариант: не делайте этого. Напишите более абстрактный интерфейс для концепции «хранилища ресурсоподобных вещей, из которых я могу получить материал», и subinterface для «хранилища ресурсоподобных материалов, из которых я могу получить материал, а также добавить материал». Внедрите последнее так, чтобы оба использовали ClassLoader.getContextClassLoader().getResource()
(для поиска пути к классам), и если это не удается, используется другой механизм для получения информации, которую программа могла добавить из некоторого местоположения.
Следующий код записывается в каталог classes
вместе с файлами классов.
Как отмечали другие, остерегайтесь перезаписывать файлы классов. Лучше всего поместить ваши новые файлы в отдельный каталог; однако этот каталог должен уже существовать. Чтобы создать его, создайте подкаталог в ресурсах источника, возможно, содержащий пустой файл. Например, src\main\resources\dir\empty.txt
.
public class WriteResource {
public static void main(String[] args) throws FileNotFoundException {
String thing = "Text to write to the file";
String dir = WriteResource.class.getResource("/").getFile();
//String dir = WriteResource.class.getResource("/dir").getFile();
OutputStream os = new FileOutputStream(dir + "/file.txt");
final PrintStream printStream = new PrintStream(os);
printStream.println(thing);
printStream.close();
}
}
Это делает трюк, но я бы нервничал из-за развертывания этого вне строго контролируемой среды. Мне не очень нравится идея несанкционированного доступа к моей директории classes
!
Ресурсы загружаются через загрузчик классов, а загрузчик классов по умолчанию сильно кэшируется.
Для чтения ресурсов из нестатической файловой системы нужен ваш собственный загрузчик классов. / g1]