VB .Net NullReferenceException travail autour de
Cela devrait être simple, mais je vais avoir des problèmes. À l'aide de la eBay .Net-library, parfois, certains champs dans une réponse sont Nothing
et parfois contenir une valeur. Quand ils sont Nothing
ils pourraient simple être représenté comme une chaîne vide, mais les développeurs ont choisi de retourner en tant que Nothing
alors, quand j'essaie de définir une Chaîne de la valeur (quand il n'y a rien), je reçois une NullReferenceException, voir ci-dessous
Imports System
Imports System.Configuration.ConfigurationManager
Imports System.Globalization
Imports System.Threading
Imports System.Xml
Imports eBay.Service.Core.Soap
Imports eBay.Service.Core.Sdk
Imports eBay.Service.Call
Imports eBay.Service.Util
Public Class eBayOrderImportService
Private Sub ServiceWorkerThread(ByVal state As Object)
' Periodically check if the service is stopping.
Do While Not Me.stopping
' Perform main service function here...
GetLastTime()
Dim apiContext As ApiContext = GetApiContext()
Dim apiCall As GetOrdersCall = New GetOrdersCall(apiContext)
Dim orders As New OrderTypeCollection
Dim timeFilter As New TimeFilter
timeFilter.TimeFrom = lastUpdate
timeFilter.TimeTo = Date.Now
Dim lastTime As Boolean = SetLastTime()
apiCall.IncludeFinalValueFee = True
orders = apiCall.GetOrders(timeFilter, TradingRoleCodeType.Seller, OrderStatusCodeType.Completed)
Dim order As OrderType
For Each order In orders
'do order-wide stuff here
LogOrder(order)
Next
Thread.Sleep(30 * 1000) ' Simulate some lengthy operations.
Loop
' Signal the stopped event.
Me.stoppedEvent.Set()
End Sub
Private Sub LogOrder(ByVal Order As OrderType)
Dim OrderID, AccountID, BillingFirstName, BillingLastName, _
BillingCompany, BillingEmailAddress, BillingPhone, _
BillingAddress1, BillingAddress2, BillingCity, _
BillingStateProvidence, BillingPostalCode, _
BillingCountry, ShippingFirstName, ShippingLastName, _
ShippingCompany, ShippingEmailAddress, ShippingPhone, _
ShippingAddress1, ShippingAddress2, ShippingCity, _
ShippingStateProvidence, ShippingPostalCode, _
ShippingCountry, OrderStatus, BillingStatus, _
OrderDate, ShippingMethod, SalesTax, _
PreShippingCharge, OrderDiscount, OrderTotalCharged, _
PaymentMethod, RepeatOrder, GiftCode, CouponCode, RID, _
OrderNotes, OrderChannel, IsPrinted, IsShipped, PrintDate, _
ShipDate, ActualShipCharge, DaysInTransit, DeliveryDate, _
TrackingNumber, ShippedMethod As String
OrderID = Order.OrderID
AccountID = ""
Dim name As String = If(Order.ShippingAddress.Name.ToString(), "None Given")
BillingFirstName = name.Substring(0, name.IndexOf(" "))
BillingLastName = name.Substring(name.IndexOf(" ") + 1)
BillingCompany = If(Order.ShippingAddress.CompanyName.ToString(), "")
BillingEmailAddress = If(Order.TransactionArray(0).Buyer.Email.ToString(), "")
BillingPhone = If(Order.ShippingAddress.Phone.ToString(), "")
BillingAddress1 = If(Order.ShippingAddress.Street1.ToString(), "")
BillingAddress2 = If(Order.ShippingAddress.Street2.ToString(), "")
BillingCity = If(Order.ShippingAddress.CityName.ToString(), "")
BillingStateProvidence = If(Order.ShippingAddress.StateOrProvince.ToString(), "")
BillingPostalCode = If(Order.ShippingAddress.PostalCode.ToString(), "")
BillingCountry = If(Order.ShippingAddress.CountryName.ToString(), "")
ShippingFirstName = If(BillingFirstName, "")
ShippingLastName = If(BillingLastName, "")
ShippingCompany = If(Order.ShippingAddress.CompanyName.ToString(), "")
ShippingEmailAddress = If(Order.TransactionArray(0).Buyer.Email.ToString(), "")
ShippingPhone = If(Order.ShippingAddress.Phone.ToString(), "")
ShippingAddress1 = If(Order.ShippingAddress.Street1.ToString(), "")
ShippingAddress2 = If(Order.ShippingAddress.Street2.ToString(), "")
ShippingCity = If(Order.ShippingAddress.CityName.ToString(), "")
ShippingStateProvidence = If(Order.ShippingAddress.StateOrProvince.ToString(), "")
ShippingPostalCode = If(Order.ShippingAddress.PostalCode.ToString(), "")
ShippingCountry = If(Order.ShippingAddress.CountryName.ToString(), "")
OrderStatus = If(Order.OrderStatus.ToString(), "")
BillingStatus = If(Order.OrderStatus.ToString(), "")
OrderDate = If(Order.CreatedTime.ToString("MM/DD/yyyy"), "")
If Order.TransactionArray(0).Taxes IsNot Nothing Then
Dim tmpTax As Double = 0.0
Dim tmpTrans As TransactionType
For Each tmpTrans In Order.TransactionArray
tmpTax = tmpTax + tmpTrans.Taxes.TotalTaxAmount.Value
Next
SalesTax = tmpTax.ToString()
Else
SalesTax = "0.0"
End If
ShippingMethod = If(Order.ShippingServiceSelected.ShippingService.ToString(), "")
ShippingMethod = ShippingMethod & ":" & If(Order.ShippingServiceSelected.ShippingServicePriority.ToString(), "")
OrderTotalCharged = If(Order.Total.Value.ToString(), "")
OrderChannel = "eBay"
comm = New OdbcCommand
comm.CommandText = _
"INSERT INTO Orders (OrderID, AccountID, BillingFirstName, BillingLastName, " & _
"BillingCompany, BillingEmailAddress, BillingPhone, BillingAddress1, " & _
"BillingAddress2, BillingCity, BillingStateProvidence, BillingPostalCode, " & _
"BillingCountry, ShippingFirstName, ShippingLastName, ShippingCompany, " & _
"ShippingEmailAddress, ShippingPhone, ShippingAddress1, ShippingAddress2, " & _
"ShippingCity, ShippingStateProvidence, ShippingPostalCode, ShippingCountry, " & _
"OrderStatus, BillingStatus, OrderDate, SalesTax, ShippingMethod, OrderTotalCharged, OrderChannel) " & _
"VALUES('" & OrderID & "', '" & AccountID & "', '" & BillingFirstName & "', '" & _
BillingLastName & "', '" & BillingCompany & "', '" & BillingEmailAddress & "', '" & _
BillingPhone & "', '" & BillingAddress1 & "', '" & BillingAddress2 & "', '" & BillingCity & "', '" & _
BillingStateProvidence & "', '" & BillingPostalCode & "', '" & BillingCountry & "', '" & _
ShippingFirstName & "', '" & ShippingLastName & "', '" & ShippingCompany & "', '" & _
ShippingEmailAddress & "', '" & ShippingPhone & "', '" & ShippingAddress1 & "', '" & _
ShippingAddress2 & "', '" & ShippingCity & "', '" & ShippingStateProvidence & "', '" & _
ShippingPostalCode & "', '" & ShippingCountry & "', '" & OrderStatus & "', '" & _
BillingStatus & "', '" & OrderDate & "', '" & SalesTax & "', '" & ShippingMethod & "', '" & _
OrderTotalCharged & "', '" & OrderChannel & "')"
' Dim orderResult As Integer = comm.ExecuteNonQuery()
sysLog.WriteEntry(comm.CommandText)
End Sub
End Class
Il est mis à jour de code veuillez noter qu'aucune exception n'est levée jusqu'à ce que:
BillingCompany = Si(De L'Ordre.ShippingAddress.Nom de la société.ToString(), "")
est exécutée. Le Name
propriété a une valeur enregistrée dans la variable, alors que Order.ShippingAddress.CompanyName
est fixé à Nothing
(cette propriété n'existe pas, et peuvent parfois avoir une valeur). J'ai mis à jour le code pour inclure Anthony Pegram réponse qui n'a pas aidé.
Tout est déclarée, pour raccourcir le code j'ai juste montré un exemple pertinent. Considérez ceci à l'intérieur d'une boucle pour chaque commande retournée à partir d'un GetOrders (), parfois le Order.ShippingAddress.CompanyName
sera rien, à ces moments-est-il possible de le manipuler comme une chaîne vide? J'ai essayé la méthode ToString (). Dans d'autres langues, j'ai pu
$CompanyName = ce || que;
Quelque chose de semblable dans VB .Net?
OriginalL'auteur Mike L. | 2012-02-12
Vous devez vous connecter pour publier un commentaire.
Vous pouvez utiliser
If(a, b)
rejoignent la valeur null à une autre valeur. Exemple:La sortie de foo dans cet exemple, la chaîne "toto". Si vous aviez un non-nulle de la chaîne affectée à l'obj, puis foo serait également référence à cette chaîne.
Cependant, j'ai un fort sentiment que votre référence nulle exception se produit peut-être pas sur la propriété, mais sur l'objet.
Order
ouShippingAddress
pourrait être null. Accéder à des propriétés ou des méthodes sur une référence null est une erreur. Simplement en accédant à une valeur null par de le stocker dans une variable n'est pas une erreur en soi.Si vous êtes l'obtention de votre exception sur une de ces lignes
C'est parce que soit l'Ordre ou ShippingAddress est null.
Vérifier et voir si ces objets pourrait renvoyer en fait rien. Si oui, vous aurez besoin d'appliquer null-surveiller les alentours avant d'accéder à leurs propriétés.
Votre mise à jour:
Cela peut jeter parce que Commande peut être null, ShippingAddress peut être null, ou nom de la Société peut être null. Il est une exception à accéder à une propriété ou une méthode d'une référence null. Si la Commande est nulle, vous obtiendrez une erreur d'accès à ShippingAddress. Similarlu, si ShippingAddress est nul, vous ne pouvez pas accéder à la Société. Si la Société est nul, vous ne pouvez pas appeler ToString().
Vous avez à un certain point, de vérifier et dont l'objet est null. Je n'ai pas confiance que l'un d'eux ne sera pas nulle. Faites-vous? Vérifier. Étape par le biais de votre programme et d'observer l'objet unis.
Si cela revient à des propriétés comme la Société est null, et si la Société est une chaîne de caractères, omettre le ToString() de l'appel.
Si CompanyName n'est pas une chaîne, vous aurez simplement à le comparer à Rien avant d'appeler ToString() ou l'accès à une propriété.
même message d'erreur, voir le code mis à jour...Merci
vous avez complètement changé le code en question. Qui rend en général les réponses que vous avez déjà reçu pas utile. Généralement parlant, ne pas le faire. Démarrer une nouvelle question si vous en avez.
Cela étant dit, on dirait que vous devez tenir compte de l'avis des réponses. Soit
Order
ouOrder.ShippingAddress
pourrait être null. D'autres objets peuvent être null. Ou il pourrait en effet être la chaîne des propriétés qui sont nuls, et que vous appelez ToString() sur eux, obtenant l'exception. Cette annule complètement la sécurité deIf(a, b)
. Sia
est null,If(a.ToString(), b)
lèvera. Vous n'avez pas mis en évidence lorsque l'erreur se produit, de sorte que nous sommes de gauche à deviner. Avez vous franchi le code?S'il vous plaît, mettez un point d'arrêt où la loi NRE qui se passe. Inspection du tous de l'objet de références sur cette ligne. Voir que l'on est nul, et ajouter des null contrôles. Continuer pas à pas dans le code jusqu'à ce que vous avez vérifié que tout ce qui pourrait éventuellement être nulle est pris en compte. Et de ne pas appeler les méthodes ou propriétés sur les références null.
OriginalL'auteur Anthony Pegram
Prendre un coup d'oeil à cette ligne:
Si le
CompanyName
propriété dansOrder.ShippingAddress.CompanyName
estNothing
, que le code est toujours parfaitement légal et pas déclencher une exception NullReferenceException. L'exception est déclenchée, soit parce queOrder.ShippingAddress
ouOrder
lui-même n'est Rien. Vous obtenez l'exception parce que vous essayez de regarder pour une propriété spécifique sur un objet qui n'existe pas. Basé sur l'exemple de code, il est facile de voir pourquoi cela peut être le cas:Cette ligne déclare une variable, mais elle ne donne en fait que la variable a valeur.
Order
est une variable référence à l'objet... qui n'est pas encore définie à une instance d'un objet. Maintenant, il semble que vous pouvez omettre le code où une instance est définie, mais il vaut la peine de mentionner, parce que si oui, c'est une partie de base de la façon dont ce code est censé travailler, et serait logique de les inclure au moins un stub pour que, dans l'échantillon.OriginalL'auteur Joel Coehoorn