这个有点深奥.尝试在visual studio 2008中的winforms项目中打开表单(在winforms设计器中)时遇到了NullReferenceException.堆栈跟踪指向以下代码的第四行:
public static class Logger
{
public static void LogMethodEnter()
{
var frame = new StackFrame(1);
var method = frame.GetMethod();
Trace.TraceInformation("{0}.{1}.{2}()", method.DeclaringType.Namespace, method.DeclaringType.Name, method.Name);
Trace.Indent();
}
public static void LogMethodExit()
{
Trace.Unindent();
}
}
Run Code Online (Sandbox Code Playgroud)
...意思是开口大括号的线条.我在其他项目中遇到了同样的问题(但不涉及winforms设计器),我认为这是一个与线程相关的问题,但我没有代码来复制它.
为什么会发生这种情况,为什么异常堆栈跟踪指向带有花括号的行?
澄清:空引用异常仅发生在winforms设计器中.运行应用程序时,它不会抛出该错误.
我在我的一个方法的开头有一个非常简单的检查,如下所示:
public void MyMethod(MyClass thing)
{
if(thing == null)
throw new ArgumentNullException("thing");
//Do other stufff....
}
Run Code Online (Sandbox Code Playgroud)
但我得到的堆栈跟踪(来自生产环境中的Elmah)似乎表明"if(thing == null)"行正在抛出NullReferenceException.堆栈跟踪的前两行是这样的:
System.Web.HttpUnhandledException: Exception of type 'System.Web.HttpUnhandledException' was thrown. ---> System.NullReferenceException: Object reference not set to an instance of an object.
at MyLibrary.BL.AnotherClass.MyMethod(MyClass thing) in C:\Development\MyProject\trunk\MyLibrary.BL\AnotherClass.cs:line 100
Run Code Online (Sandbox Code Playgroud)
MyClass是一个相当简单的类,没有运算符重载或类似的东西,所以我有点难以理解抛出NullReferenceException的内容!
任何人都可以提出可能导致此问题的情景吗?
编辑:我怀疑"事物"可能是null,但我真的希望ArgumentNullException不是NullReferenceException - 这基本上是这个问题的关键.可能是框架或Elmah正在改变或错误报告异常的某些东西 - 或者是二进制文件以某种方式过时的唯一解释?
NullReferenceException被抛出在所有相关对象都有效的行上.StackTrace显示#行是432.
代码是

在这里,Flags并且tempFlags都是数据表.两个数据表的列的数据类型都是原始的(十进制,日期时间,短).该应用程序是一个多线程应用程序,代码片段属于线程函数.Flags在实例级别被decalred,即tempFlags在线程函数内声明时共享给所有线程.
这个特定的时间实例Flags包含1946个记录并tempFlags包含1.那么,为什么这个NullReferenceException?
编辑#1
ex.InnerException
null
ex.StackTrace
at System.Data.DataTable.RecordStateChanged(Int32 record1, DataViewRowState oldState1, DataViewRowState newState1, Int32 record2, DataViewRowState oldState2, DataViewRowState newState2)
at System.Data.DataTable.InsertRow(DataRow row, Int64 proposedID)
at System.Data.DataTable.MergeRow(DataRow row, DataRow targetRow, Boolean preserveChanges, Index idxSearch)
at System.Data.Merger.MergeTable(DataTable src, DataTable dst)
at System.Data.Merger.MergeTableData(DataTable src)
at System.Data.Merger.MergeTable(DataTable src)
at System.Data.DataTable.Merge(DataTable table, Boolean preserveChanges, MissingSchemaAction missingSchemaAction)
at System.Data.DataTable.Merge(DataTable table)
at [...].cs:line 432"
ex.Data
{System.Collections.ListDictionaryInternal}
[System.Collections.ListDictionaryInternal]: {System.Collections.ListDictionaryInternal}
IsFixedSize: false …Run Code Online (Sandbox Code Playgroud) 我在C#应用程序中有以下代码.
DateTimeFormatInfo.CurrentInfo.DayNames
Run Code Online (Sandbox Code Playgroud)
ReSharper 7.1.1强调了DateTimeFormatInfo.CurrentInfo可能导致空引用异常的事实.
在什么情况下会发生这种情况?或者这只是ReSharper的一个错误,认为你访问的属性的任何对象应该被空检查?
c# resharper nullreferenceexception datetimeformatinfo resharper-7.1
在wpf独立应用程序(.exe)中,我在MainWindow中包含了一个MediaElement
<Window x:Class="Media.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Title="Main Window" Height="350" Width="525">
<Grid>
<MediaElement x:Name="Player" Stretch="Uniform" LoadedBehavior="Manual" UnloadedBehavior="Stop"/>
</Grid>
</Window>
Run Code Online (Sandbox Code Playgroud)
从后面的代码我将其设置Source为任何https Uri:
public partial class MainWindow : Window
{
public MainWindow()
{
InitializeComponent();
var source = new Uri("https://stream_which_can_be_opened_with_windows_media_player.com", UriKind.Absolute);
Player.Source = source;
Player.Play();
}
}
Run Code Online (Sandbox Code Playgroud)
当Play()方法被称为NullReferenceException被抛出,而不是播放媒体内容.MediaElement初始化,NullReferenceException从Play()方法抛出,见下文.
可以在Windows Media Player(文件 - >打开URL)中打开视频的相同Uri.
问题似乎是在MediaPlayerState.OpenMedia方法(MediaElement内部使用的对象)中,该方法试图检查从中检索的appDeploymentUri SecurityHelper.ExtractUriForClickOnceDeployedApp是否具有方案HTTPS.该应用程序未部署ClickOnce(它有一个独立的安装程序),appDeploymentUri为null,因此NullReferenceException.
这是来自PresentationFramework.dll,System.Windows.Media.MediaPlayerState.OpenMedia
if (SecurityHelper.AreStringTypesEqual(uriToOpen.Scheme, Uri.UriSchemeHttps))
{
// target is HTTPS. …Run Code Online (Sandbox Code Playgroud) 对于展览A,请使用以下代码:
string sql;
if (!GetQueries.TryGetValue(type.TypeHandle, out sql))
Run Code Online (Sandbox Code Playgroud)
Dictionary的文档说如果找不到Key,引用类型将被设置为null.好没关系.
如果找到密钥,变量'sql'如何填充?是否克隆了密钥的找到值?找到的项目是一种对象,然后复制了对象的内容?这样安全吗?
或者,要设置出站对象驻留的位置,是否应将呼叫设置为展示B:
var sql = string.Empty;
if (!GetQueries.TryGetValue(type.TypeHandle, out sql))
Run Code Online (Sandbox Code Playgroud)
然后初始化变量'sql'并存在对象的安全位置.
(我的问题来自于我在C编程时代对空指针的厌恶.)
堆栈跟踪NullReferenceException非常缺乏信息,它们只包含方法名称和调用堆栈.方法中的任何变量都可以为null,并且当开发机器上的bug无法重现时很难调试.
您是否知道如何获取有关该错误的更多信息,或许获取变量名称?或者你有更好的方法来调试它?
我试图将在内部类中创建的列表'usrs'复制到另一个列表'team_memebers'。复制后,我尝试在FOR循环中迭代“ team_memebers”,但出现“空对象引用”错误。“用户”列表包含通过调试打印进行测试的返回对象。
public class ListNodeActivity extends AppCompatActivity
{
private ParseObject parse_task=null;
private List<String> team_memebers=null;
@Override
protected void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_list_node);
Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);
setSupportActionBar(toolbar);
query.findInBackground(new FindCallback<ParseObject>() {
public void done(List<ParseObject> usrs, ParseException e) {
if (e == null) {
team_memebers = new ArrayList<String>(usrs.size());
for (ParseObject prso:usrs) {
team_memebers.add(new String(prso.getString("Username")));
}
} else {//handle the error
}
}
});
for (String str:team_memebers)
{
empolyeeSpinnerAdapter.add(str);
}
}
Run Code Online (Sandbox Code Playgroud)
堆栈跟踪
FATAL EXCEPTION: main
Process: il.ac.shenkar.david.todolistex2, PID: 14490
java.lang.RuntimeException: Unable to …Run Code Online (Sandbox Code Playgroud) 编辑:有一个类似的问题在这里,但解决方案只建议变通方法,并没有提供分析上市公司问题或如何解决它的原因.这个问题可能仍然是重复的.
编辑2:事实证明这个问题只发生在调试期间,尽管它没有发生在早期.更换后(TCheck)null与null as TCheck测试通过跑的时候,但调试时抛出异常.
ORIGINAL POST: 我在单元测试中有一个方法,看起来像这样
internal void EqualityAssert<TCheck, TEquatable>(TEquatable item, ... )
where TCheck : class, IEquatable<TEquatable>, TEquatable
{
// Various equality assertions that are passing
// ...
// A == null
Assert.Throws<NullReferenceException>(
() => ((IEquatable<TEquatable>)item).Equals((TCheck)null));
}
Run Code Online (Sandbox Code Playgroud)
此方法由各种单元测试调用,并且每个测试都失败,因为遇到了"未处理的NullReferenceException",它正好在预期的位置.
Assert.Throws我之前的工作正常,但我无法弄清楚改变了什么来打破它.
我有一个 IEnumerable,我在其上运行 foreach。它在 foreach 行的某些情况下抛出空引用异常,它说
ienumerable 引发了“System.NullReferenceException”类型的异常
if (ienumerable != null)
{
foreach (var item in ienumerable)
{
......
}
}
Run Code Online (Sandbox Code Playgroud)
我在 foreach 循环之前进行了空检查,并且 iEnumerable 通过了空检查,但是当我在其上运行 foreach 循环时,它会抛出空引用异常。
c# ×9
.net ×1
android ×1
assert ×1
datatable ×1
debugging ×1
dictionary ×1
foreach ×1
ienumerable ×1
java ×1
mediaelement ×1
resharper ×1
static ×1
unit-testing ×1
vb.net ×1
winforms ×1
wpf ×1
xunit.net ×1