我正在做一个简单的测试项目,如果你在条目中键入任何股票代码,它会生成一个WebClient和链接,返回该股票价格的字符串。
我知道我需要从中获取数据的确切URL,如果用户输入现有的股票代码,它会非常好地工作。然而,当程序试图从一个不存在的网页中提取数据时,如果用户编造了一个股票代码,我就会出现运行时错误。
在应用程序运行时,它直接进入中断模式并返回错误System.NullReferenceException: 'Object reference not set to an instance of an object.'
。
我如何在发出请求之前检查URL是否有效,或者至少能够在将应用程序置于中断模式之前捕获错误?
这是c#代码:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Net;
using Xamarin.Forms;
using Xamarin.Forms.Xaml;
namespace Stock_WatchList
{
[XamlCompilation(XamlCompilationOptions.Compile)]
public partial class sybmolSelector : ContentPage
{
public string price { get; set; }
public sybmolSelector()
{
InitializeComponent();
BindingContext = this;
}
private void Entry_PropertyChanged(object sender, System.ComponentModel.PropertyChangedEventArgs e)
{
var nameValue = entry.Text.ToString();
var link = "https://sandbox.iexapis.com/stable/stock/" + nameValue + "/price?token=Tsk_57bebc1d051340dbaad8656ab0027e90";
var client1 = new WebClient();
string b = client1.DownloadString(link);
price = "$" + b;
Symbol.Text = nameValue.ToString();
Price.Text = price;
}
}
}
和Xamarin代码:
<?xml version="1.0" encoding="utf-8" ?>
<ContentPage xmlns="http://xamarin.com/schemas/2014/forms"
xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"
x:Class="Stock_WatchList.sybmolSelector"
BackgroundColor="Black"
NavigationPage.IconColor="HotPink">
<ContentPage.Content>
<StackLayout>
<Label TextColor="HotPink" BackgroundColor="Black" Text="------------------- Enter A Symbol Below -------------------" FontSize="19" LineBreakMode="TailTruncation"></Label>
<Entry PlaceholderColor="HotPink" PropertyChanged="Entry_PropertyChanged" FontSize="19" x:Name="entry" TextColor="HotPink" BackgroundColor="#111111"></Entry>
<Label x:Name="Symbol" Margin="5" Text="" HorizontalOptions="Start" TextColor="HotPink" FontSize="40"/>
<Label x:Name="Price" Margin="5,0,5,5" Text="" HorizontalOptions="Start" TextColor="HotPink" FontSize="50"/>
</StackLayout>
</ContentPage.Content>
</ContentPage>
如果Entry.Text为null或空,则不要进行调用。加载表单后,将调用PropertyChanged。此时文本仍然为空。它在你的降价中肯定没有默认值。
private void Entry_PropertyChanged(object sender, System.ComponentModel.PropertyChangedEventArgs e)
{
// guard for null
if (entry == null) return;
// no need to call the api if we don't have a value
if (String.IsNullOrEmpty(entry.Text)) return;
var link = "https://sandbox.iexapis.com/stable/stock/" + entry.Text + "/price?token=sometoken";
using(var client1 = new WebClient()) // WebClient does implement (useless) IDisposable
{
price = "$" + client1.DownloadString(link);
}
// maybe these are null as well, who knows
if (Symbol != null) Symbol.Text = entry.Text;
if (Price != null) Price.Text = price;
}