System.NullReferenceException C#建议?
当我试图运行我的程序时,我遇到了一个异常。。在我看来,它运行得很好,但我似乎遗漏了一些东西System.NullReferenceException C#建议?,c#,exception,C#,Exception,当我试图运行我的程序时,我遇到了一个异常。。在我看来,它运行得很好,但我似乎遗漏了一些东西 public Coord LatLonToUTMXY(double lat, double lon) { Coord co = new Coord(); co.zone = Math.Floor((lon + 180.0) / 6) + 1; //double zone = Math.Floor((lon + 180.0) / 6) + 1;
public Coord LatLonToUTMXY(double lat, double lon)
{
Coord co = new Coord();
co.zone = Math.Floor((lon + 180.0) / 6) + 1;
//double zone = Math.Floor((lon + 180.0) / 6) + 1;
MapLatLonToXY(DegToRad(lat), DegToRad(lon), UTMCentralMeridian(co.zone), co.eastNorth);
/* Adjust easting and northing for UTM system. */
co.eastNorth[0] = co.eastNorth[0] * UTMScaleFactor + 500000.0;
co.eastNorth[1] = co.eastNorth[1] * UTMScaleFactor;
if (co.eastNorth[1] < 0.0)
co.eastNorth[1] = co.eastNorth[1] + 10000000.0;
return co;
}
对于co来说,这是一个结构
public struct Coord
{
public double zone;
public double[] eastNorth;
}
我错过了什么
谢谢发生这种情况是因为函数中的
xy
数组(来自Coord.eastNorth
)未初始化。我注意到Coord是一个结构而不是一个类。有什么特别的原因吗?如果Coord是一个类,这会起作用
public class Coord
{
public double Zone {get; set;}
public List<double> EastNorth {get; set;}
public Coord()
{
EastNorth = new List<double>();
}
}
public List<double> MapLatLonToXY(double phi, double lambda, double lambda0)
{
var xy = new List<double>();
//Exception for xy[0] ....!
xy.Add(N * Math.Cos(phi) * l
+ (N / 6.0 * Math.Pow(Math.Cos(phi), 3.0) * l3coef * Math.Pow(l, 3.0))
+ (N / 120.0 * Math.Pow(Math.Cos(phi), 5.0) * l5coef * Math.Pow(l, 5.0))
+ (N / 5040.0 * Math.Pow(Math.Cos(phi), 7.0) * l7coef * Math.Pow(l, 7.0)));
/* Calculate northing (y) */
xy.Add(ArcLengthOfMeridian(phi)
+ (t / 2.0 * N * Math.Pow(Math.Cos(phi), 2.0) * Math.Pow(l, 2.0))
+ (t / 24.0 * N * Math.Pow(Math.Cos(phi), 4.0) * l4coef * Math.Pow(l, 4.0))
+ (t / 720.0 * N * Math.Pow(Math.Cos(phi), 6.0) * l6coef * Math.Pow(l, 6.0))
+ (t / 40320.0 * N * Math.Pow(Math.Cos(phi), 8.0) * l8coef * Math.Pow(l, 8.0)));
return xy;
}
public Coord LatLonToUTMXY(double lat, double lon)
{
Coord co = new Coord();
co.zone = Math.Floor((lon + 180.0) / 6) + 1;
//double zone = Math.Floor((lon + 180.0) / 6) + 1;
co.EastNorth = MapLatLonToXY(DegToRad(lat), DegToRad(lon), UTMCentralMeridian(co.zone));
/* Adjust easting and northing for UTM system. */
co.EastNorth[0] = co.EastNorth[0] * UTMScaleFactor + 500000.0;
co.EastNorth[1] = co.EastNorth[1] * UTMScaleFactor;
if (co.EastNorth[1] < 0.0)
co.EastNorth[1] = co.EastNorth[1] + 10000000.0;
return co;
}
公共类协作
{
公共双区{get;set;}
公共列表东北偏东{get;set;}
公共合作
{
EastNorth=新列表();
}
}
公共列表映射(双phi、双λ、双λ0)
{
var xy=新列表();
//xy[0]的例外情况。。。。!
xy.相加(N*数学Cos(phi)*l
+(N/6.0*数学功率(数学功率因数,3.0)*l3coef*数学功率因数(l,3.0))
+(N/120.0*数学功率(数学功率因数,5.0)*l5coef*数学功率因数(l,5.0))
+(N/5040.0*数学功率(数学Cos(phi,7.0)*l7coef*数学功率(l,7.0));
/*计算北距(y)*/
xy.Add(弧长多夫梅里迪安(φ)
+(t/2.0*N*Math.Pow(Math.Cos(phi),2.0)*Math.Pow(l,2.0))
+(t/24.0*N*Math.Pow(Math.Cos(phi),4.0)*l4coef*Math.Pow(l,4.0))
+(t/720.0*N*Math.Pow(Math.Cos(phi,6.0)*l6coef*Math.Pow(l,6.0))
+(t/40320.0*N*Math.Pow(Math.Cos(phi,8.0)*l8coef*Math.Pow(l,8.0));
返回xy;
}
公共坐标LatLonToUTMXY(双lat,双lon)
{
合作公司=新合作公司();
co.zone=数学楼层((lon+180.0)/6)+1;
//双区=数学楼层((lon+180.0)/6)+1;
co.EastNorth=MapLatLonToXY(DegToRad(lat)、DegToRad(lon)、UTMCentralMeridian(co.zone));
/*调整UTM系统的东距和北距*/
co.EastNorth[0]=co.EastNorth[0]*UTMScaleFactor+500000.0;
co.EastNorth[1]=co.EastNorth[1]*UTMScaleFactor;
如果(co.EastNorth[1]<0.0)
co.EastNorth[1]=co.EastNorth[1]+10000000.0;
返回公司;
}
可能会有很多地方出了问题。您共享的代码不足以说明问题。例如,我们没有get和set of co.zone属性。最好是检查您的调用堆栈。此异常最有可能发生,因为xy
为null。修复此问题,您将修复此问题。应用后,我得到一个新的更重要的是,你知道它为什么工作,为什么你的不工作吗?我相信我必须初始化数组,这样就可以从内存中访问它。换句话说,它没有任何有效的地址可以访问。是的,这基本上是正确的。你可以把它作为一个数组保存,然后放入EastNorth=new double[2];
在构造函数中也是如此。如果在编译时知道数据结构的大小,那么数组肯定会更有效率,但在我所从事的项目中,这种情况很少出现。
public class Coord
{
public double Zone {get; set;}
public List<double> EastNorth {get; set;}
public Coord()
{
EastNorth = new List<double>();
}
}
public List<double> MapLatLonToXY(double phi, double lambda, double lambda0)
{
var xy = new List<double>();
//Exception for xy[0] ....!
xy.Add(N * Math.Cos(phi) * l
+ (N / 6.0 * Math.Pow(Math.Cos(phi), 3.0) * l3coef * Math.Pow(l, 3.0))
+ (N / 120.0 * Math.Pow(Math.Cos(phi), 5.0) * l5coef * Math.Pow(l, 5.0))
+ (N / 5040.0 * Math.Pow(Math.Cos(phi), 7.0) * l7coef * Math.Pow(l, 7.0)));
/* Calculate northing (y) */
xy.Add(ArcLengthOfMeridian(phi)
+ (t / 2.0 * N * Math.Pow(Math.Cos(phi), 2.0) * Math.Pow(l, 2.0))
+ (t / 24.0 * N * Math.Pow(Math.Cos(phi), 4.0) * l4coef * Math.Pow(l, 4.0))
+ (t / 720.0 * N * Math.Pow(Math.Cos(phi), 6.0) * l6coef * Math.Pow(l, 6.0))
+ (t / 40320.0 * N * Math.Pow(Math.Cos(phi), 8.0) * l8coef * Math.Pow(l, 8.0)));
return xy;
}
public Coord LatLonToUTMXY(double lat, double lon)
{
Coord co = new Coord();
co.zone = Math.Floor((lon + 180.0) / 6) + 1;
//double zone = Math.Floor((lon + 180.0) / 6) + 1;
co.EastNorth = MapLatLonToXY(DegToRad(lat), DegToRad(lon), UTMCentralMeridian(co.zone));
/* Adjust easting and northing for UTM system. */
co.EastNorth[0] = co.EastNorth[0] * UTMScaleFactor + 500000.0;
co.EastNorth[1] = co.EastNorth[1] * UTMScaleFactor;
if (co.EastNorth[1] < 0.0)
co.EastNorth[1] = co.EastNorth[1] + 10000000.0;
return co;
}